tree-optimization/106198 - CFG cleanup vs LC SSA
This is another case like PR106182 where for the 2nd testcase in the bug there are no removed or discovered loops but still changing loop exits invalidates LC SSA and it is not enough to just scan for uses in the blocks that changed loop depth. One might argue that if we'd include former exit destinations we'd pick up the original LC SSA use but for virtuals on block merging we'd have propagated those out (while for regular uses we insert copies). CFG cleanup can also be entered with loops needing fixup so any heuristics based on loop structure are bound to fail. PR tree-optimization/106198 * tree-cfgcleanup.cc (repair_loop_structures): Always do a full LC SSA rewrite but only if any blocks changed loop depth. * gcc.dg/pr106198.c: New testcase.
This commit is contained in:
parent
1cc08ceb5b
commit
07dd0f7ba2
22
gcc/testsuite/gcc.dg/pr106198.c
Normal file
22
gcc/testsuite/gcc.dg/pr106198.c
Normal file
@ -0,0 +1,22 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O3" } */
|
||||
|
||||
int printf(const char *, ...);
|
||||
long a;
|
||||
int b;
|
||||
volatile int c;
|
||||
int main() {
|
||||
long e = a;
|
||||
int f = a;
|
||||
L:
|
||||
if (b > 0) {
|
||||
printf("0");
|
||||
goto L;
|
||||
}
|
||||
if (f) {
|
||||
printf("%ld", (long)b);
|
||||
goto L;
|
||||
}
|
||||
e >= b && c;
|
||||
return 0;
|
||||
}
|
@ -1183,9 +1183,9 @@ repair_loop_structures (void)
|
||||
become unreachable by back edges from latch). Also a former
|
||||
irreducible loop can become reducible - in this case force a full
|
||||
rewrite into loop-closed SSA form. */
|
||||
if (loops_state_satisfies_p (LOOP_CLOSED_SSA))
|
||||
rewrite_into_loop_closed_ssa (n_new_or_deleted_loops ? NULL : changed_bbs,
|
||||
TODO_update_ssa);
|
||||
if (loops_state_satisfies_p (LOOP_CLOSED_SSA)
|
||||
&& (!bitmap_empty_p (changed_bbs) || n_new_or_deleted_loops))
|
||||
rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
|
||||
|
||||
BITMAP_FREE (changed_bbs);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user