tree-optimization/100492 - avoid irreducible regions in loop distribution
When we distribute away a condition we rely on the ability to change it to either 1 != 0 or 0 != 0 depending on the direction of the exit branch in the respective loop. But when the loop contains an irreducible sub-region then for the conditions inside this this fails and can lead to infinite loops being generated. Avoid distibuting loops with irreducible sub-regions. 2021-05-10 Richard Biener <rguenther@suse.de> PR tree-optimization/100492 * tree-loop-distribution.c (find_seed_stmts_for_distribution): Find nothing when the loop contains an irreducible region. * gcc.dg/torture/pr100492.c: New testcase.
This commit is contained in:
parent
cc1d563887
commit
60af2db180
2 changed files with 36 additions and 0 deletions
26
gcc/testsuite/gcc.dg/torture/pr100492.c
Normal file
26
gcc/testsuite/gcc.dg/torture/pr100492.c
Normal file
|
@ -0,0 +1,26 @@
|
|||
/* { dg-do run } */
|
||||
/* { dg-additional-options "-ftree-loop-distribution" } */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
signed char a, c;
|
||||
int b, d, *e = &d, g;
|
||||
signed static char f;
|
||||
int main() {
|
||||
int h = 0;
|
||||
int a_ = a;
|
||||
for (; a_ < 1; a = ++a_) {
|
||||
int *i[5], **j = &i[4], ***k[3][2] = {{&j}}, ****l = &k[2][1], *****m = &l;
|
||||
char *n = &c;
|
||||
f = *e = g = 0;
|
||||
for (; g < 2; g++) {
|
||||
for (b = 0; b < 3; b++)
|
||||
h = (h && (*n = 0)) == 0;
|
||||
if (g)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (f != 0)
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
|
@ -3203,6 +3203,16 @@ find_seed_stmts_for_distribution (class loop *loop, vec<gimple *> *work_list)
|
|||
/* Initialize the worklist with stmts we seed the partitions with. */
|
||||
for (unsigned i = 0; i < loop->num_nodes; ++i)
|
||||
{
|
||||
/* In irreducible sub-regions we don't know how to redirect
|
||||
conditions, so fail. See PR100492. */
|
||||
if (bbs[i]->flags & BB_IRREDUCIBLE_LOOP)
|
||||
{
|
||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||
fprintf (dump_file, "loop %d contains an irreducible region.\n",
|
||||
loop->num);
|
||||
work_list->truncate (0);
|
||||
break;
|
||||
}
|
||||
for (gphi_iterator gsi = gsi_start_phis (bbs[i]);
|
||||
!gsi_end_p (gsi); gsi_next (&gsi))
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue