tree-optimization/103219 - avoid ICE in unroll-and-jam

For no particularly good reason unroll-and-jam uses single_dom_exit
to determine the exit for the region it wants to run VN on.  That
happens to ICE because of the dominance restriction.  Use single_exit
instead.

2021-11-15  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/103219
	* gimple-loop-jam.c (tree_loop_unroll_and_jam): Use single_exit
	to determine the exit for the VN region.

	* gcc.dg/torture/pr103219.c: New testcase.
This commit is contained in:
Richard Biener 2021-11-15 11:07:55 +01:00
parent 2551cd4f9b
commit d1ca8aeaf3
2 changed files with 25 additions and 1 deletions

View File

@ -593,7 +593,7 @@ tree_loop_unroll_and_jam (void)
todo |= TODO_cleanup_cfg;
auto_bitmap exit_bbs;
bitmap_set_bit (exit_bbs, single_dom_exit (outer)->dest->index);
bitmap_set_bit (exit_bbs, single_exit (outer)->dest->index);
todo |= do_rpo_vn (cfun, loop_preheader_edge (outer), exit_bbs);
}

View File

@ -0,0 +1,24 @@
/* { dg-do compile } */
int f();
void g();
int a, b, c, e;
int d[10];
int main()
{
if (c)
if (f())
{
g();
if (e) {
a = 0;
for (; a != 6; a = a + 2)
{
b = 0;
for (; b <= 3; b++)
d[b] &= 1;
}
}
}
return 0;
}