diff options
author | Marek Polacek <polacek@redhat.com> | 2013-02-28 10:13:48 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2013-02-28 10:13:48 +0000 |
commit | 45fa0eef76179a17ab3a34283683856ab7ba5f17 (patch) | |
tree | 666ccd47fad9a9f01055af3366f1d252e2e6761a /gcc | |
parent | 502c067d54d373d7a8769b481bbae6279fb701f1 (diff) | |
download | gcc-45fa0eef76179a17ab3a34283683856ab7ba5f17.zip gcc-45fa0eef76179a17ab3a34283683856ab7ba5f17.tar.gz gcc-45fa0eef76179a17ab3a34283683856ab7ba5f17.tar.bz2 |
re PR rtl-optimization/56466 (ICE in verify_loop_structure, at cfgloop.c:1629 (loop with header n not in loop tree !))
PR rtl-optimization/56466
* loop-unroll.c (unroll_and_peel_loops): Call fix_loop_structure
if we're changing a loop.
(peel_loops_completely): Likewise.
From-SVN: r196335
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/loop-unroll.c | 31 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr56466.c | 31 |
4 files changed, 62 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7bda77e..5ecbe51 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2013-02-28 Marek Polacek <polacek@redhat.com> + + PR rtl-optimization/56466 + * loop-unroll.c (unroll_and_peel_loops): Call fix_loop_structure + if we're changing a loop. + (peel_loops_completely): Likewise. + 2013-02-28 Paolo Carlini <paolo.carlini@oracle.com> PR c++/55813 diff --git a/gcc/loop-unroll.c b/gcc/loop-unroll.c index 42512b8..1eb904b 100644 --- a/gcc/loop-unroll.c +++ b/gcc/loop-unroll.c @@ -207,7 +207,7 @@ void unroll_and_peel_loops (int flags) { struct loop *loop; - bool check; + bool changed = false; loop_iterator li; /* First perform complete loop peeling (it is almost surely a win, @@ -220,7 +220,6 @@ unroll_and_peel_loops (int flags) /* Scan the loops, inner ones first. */ FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST) { - check = true; /* And perform the appropriate transformations. */ switch (loop->lpt_decision.decision) { @@ -229,30 +228,33 @@ unroll_and_peel_loops (int flags) gcc_unreachable (); case LPT_PEEL_SIMPLE: peel_loop_simple (loop); + changed = true; break; case LPT_UNROLL_CONSTANT: unroll_loop_constant_iterations (loop); + changed = true; break; case LPT_UNROLL_RUNTIME: unroll_loop_runtime_iterations (loop); + changed = true; break; case LPT_UNROLL_STUPID: unroll_loop_stupid (loop); + changed = true; break; case LPT_NONE: - check = false; break; default: gcc_unreachable (); } - if (check) - { -#ifdef ENABLE_CHECKING - verify_loop_structure (); -#endif - } } + if (changed) + { + calculate_dominance_info (CDI_DOMINATORS); + fix_loop_structure (NULL); + } + iv_analysis_done (); } @@ -283,6 +285,7 @@ peel_loops_completely (int flags) { struct loop *loop; loop_iterator li; + bool changed = false; /* Scan the loops, the inner ones first. */ FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST) @@ -306,11 +309,15 @@ peel_loops_completely (int flags) { report_unroll_peel (loop, locus); peel_loop_completely (loop); -#ifdef ENABLE_CHECKING - verify_loop_structure (); -#endif + changed = true; } } + + if (changed) + { + calculate_dominance_info (CDI_DOMINATORS); + fix_loop_structure (NULL); + } } /* Decide whether unroll or peel loops (depending on FLAGS) and how much. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cfc7156..40d6a80 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-02-27 Marek Polacek <polacek@redhat.com> + + PR rtl-optimization/56466 + * gcc.dg/pr56466.c: New test. + 2013-02-28 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com> * gcc.dg/tree-ssa/slsr-1.c: Allow widening multiplications. diff --git a/gcc/testsuite/gcc.dg/pr56466.c b/gcc/testsuite/gcc.dg/pr56466.c new file mode 100644 index 0000000..9d9e273 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr56466.c @@ -0,0 +1,31 @@ +/* PR rtl-optimization/56466 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -w -funroll-loops" } */ + +int a, b, c; + +void +f (void) +{ + for (; b; b++) + { + if (0) + for (; b < 0; b++) + if (1 % 0) + { + while (1) + { + a = 0; + lbl1: + c++; + } + lbl2: + ; + } + + goto lbl1; + } + + a = 0; + goto lbl2; +} |