diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr109331.c | 16 | ||||
-rw-r--r-- | gcc/tree-ssa-forwprop.cc | 6 |
2 files changed, 21 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr109331.c b/gcc/testsuite/gcc.dg/torture/pr109331.c new file mode 100644 index 0000000..72c57b9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr109331.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ + +char *ustol_dpp; +void ustol(int flags) +{ + char *s; + if (s) + flags |= 3; + switch (flags & 3) + case 3: + while (*s) + case '+': + ++s; + if (flags) + ustol_dpp = s; +} diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc index bb0fa30..9b56744 100644 --- a/gcc/tree-ssa-forwprop.cc +++ b/gcc/tree-ssa-forwprop.cc @@ -4046,7 +4046,11 @@ pass_forwprop::execute (function *fun) /* Mark outgoing exectuable edges. */ if (edge e = find_taken_edge (bb, NULL)) - e->flags |= EDGE_EXECUTABLE; + { + e->flags |= EDGE_EXECUTABLE; + if (EDGE_COUNT (bb->succs) > 1) + cfg_changed = true; + } else { FOR_EACH_EDGE (e, ei, bb->succs) |