From 45fa0eef76179a17ab3a34283683856ab7ba5f17 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Thu, 28 Feb 2013 10:13:48 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/loop-unroll.c | 31 +++++++++++++++++++------------ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr56466.c | 31 +++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr56466.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7bda77ed87d..5ecbe51f4c2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2013-02-28 Marek Polacek + + 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 PR c++/55813 diff --git a/gcc/loop-unroll.c b/gcc/loop-unroll.c index 42512b8d978..1eb904b5061 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 cfc7156569f..40d6a80fa8d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-02-27 Marek Polacek + + PR rtl-optimization/56466 + * gcc.dg/pr56466.c: New test. + 2013-02-28 Naveen H.S * 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 00000000000..9d9e27356e6 --- /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; +} -- 2.30.2