tree-optimization/106533 - loop distribution of inner loop of nest

Loop distribution currently gives up if the outer loop of a loop
nest it analyzes contains a stmt with side-effects instead of
continuing to analyze the innermost loop.  The following fixes that
by continuing anyway.

	PR tree-optimization/106533
	* tree-loop-distribution.cc (loop_distribution::execute): Continue
	analyzing the inner loops when find_seed_stmts_for_distribution
	fails.

	* gcc.dg/tree-ssa/ldist-39.c: New testcase.
This commit is contained in:
Richard Biener 2022-08-05 10:40:18 +02:00
parent 4574dad43f
commit 36bc2a8f24
2 changed files with 17 additions and 1 deletions

View File

@ -0,0 +1,16 @@
/* PR/106533 */
/* { dg-options "-O2 -fdump-tree-ldist-optimized" } */
void bar (int *a, int * __restrict b)
{
for (int k = 0; k < 10; k++)
{
for (int j = 0; j < 100000; ++j)
a[j] = b[j];
__builtin_printf ("Foo!");
}
}
/* The stmt with side-effects in the outer loop should not prevent
distribution of the inner loop of the loop nest. */
/* { dg-final { scan-tree-dump "optimized: Loop . distributed: split to 0 loops and 1 library calls" "ldist" } } */

View File

@ -3829,7 +3829,7 @@ loop_distribution::execute (function *fun)
{
auto_vec<gimple *> work_list;
if (!find_seed_stmts_for_distribution (loop, &work_list))
break;
continue;
const char *str = loop->inner ? " nest" : "";
dump_user_location_t loc = find_loop_location (loop);