diff --git a/gcc/testsuite/gcc.dg/torture/pr103458.c b/gcc/testsuite/gcc.dg/torture/pr103458.c new file mode 100644 index 0000000000000000000000000000000000000000..3fd3b5fd2ffbc46d47e309bd34d389753875f1c2 --- /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 e3e6f0955b7d15d3afbeb6898f53ad21741ef591..1f817b95faba63de7af31e4bb591c3fdfe0b1352 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