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:
parent
ec35fdc957
commit
7a496b7ce1
2 changed files with 23 additions and 0 deletions
19
gcc/testsuite/gcc.dg/graphite/pr111878.c
Normal file
19
gcc/testsuite/gcc.dg/graphite/pr111878.c
Normal 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;
|
||||
}
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue