aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr103458.c21
-rw-r--r--gcc/tree-ssa-dce.c8
2 files changed, 27 insertions, 2 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr103458.c b/gcc/testsuite/gcc.dg/torture/pr103458.c
new file mode 100644
index 0000000..3fd3b5f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr103458.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-Wno-div-by-zero" } */
+
+__attribute__ ((returns_twice)) int
+bar (void);
+
+void
+foo (int *p, int x)
+{
+ *p = 0;
+ while (*p < 1)
+ {
+ x = 0;
+ while (x < 1)
+ bar ();
+
+ x /= 0;
+ }
+
+ foo (p, x);
+}
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
index e3e6f09..1f817b9 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -1650,8 +1650,12 @@ make_forwarders_with_degenerate_phis (function *fn)
/* Only PHIs with three or more arguments have opportunities. */
if (EDGE_COUNT (bb->preds) < 3)
continue;
- /* Do not touch loop headers. */
- if (bb->loop_father->header == bb)
+ /* Do not touch loop headers or blocks with abnormal predecessors.
+ ??? This is to avoid creating valid loops here, see PR103458.
+ We might want to improve things to either explicitely add those
+ loops or at least consider blocks with no backedges. */
+ if (bb->loop_father->header == bb
+ || bb_has_abnormal_pred (bb))
continue;
/* Take one PHI node as template to look for identical