middle-end: skip checking loop exits if loop malformed [PR111878]

Before my refactoring if the loop->latch was incorrect then find_loop_location
skipped checking the edges and would eventually return a dummy location.

It turns out that a loop can have
loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS) but also not have a latch
in which case get_loop_exit_edges traps.

This restores the old behavior.

gcc/ChangeLog:

	PR tree-optimization/111878
	* tree-vect-loop-manip.cc (find_loop_location): Skip edges check if
	latch incorrect.

gcc/testsuite/ChangeLog:

	PR tree-optimization/111878
	* gcc.dg/graphite/pr111878.c: New test.
This commit is contained in:
Tamar Christina 2023-11-16 12:11:22 +00:00
parent ec35fdc957
commit 7a496b7ce1
2 changed files with 23 additions and 0 deletions

View file

@ -0,0 +1,19 @@
/* { dg-options "-O3 -fgraphite-identity -fsave-optimization-record" } */
int long_c2i_ltmp;
int *long_c2i_cont;
void
long_c2i (long utmp, int i)
{
int neg = 1;
switch (long_c2i_cont[0])
case 0:
neg = 0;
for (; i; i++)
if (neg)
utmp |= long_c2i_cont[i] ^ 5;
else
utmp |= long_c2i_cont[i];
long_c2i_ltmp = utmp;
}

View file

@ -1792,6 +1792,10 @@ find_loop_location (class loop *loop)
if (!loop)
return dump_user_location_t ();
/* For the root of the loop tree return the function location. */
if (!loop_outer (loop))
return dump_user_location_t::from_function_decl (cfun->decl);
if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
{
/* We only care about the loop location, so use any exit with location