tree-optimization/97135 - fix dependence check in store-motion

The following fixes a dependence check where in the particular place
we cannot ignore self-dependences.

2020-09-21  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/97135
	* tree-ssa-loop-im.c (sm_seq_push_down): Do not ignore
	self-dependences.

	* gcc.dg/torture/pr97135.c: New testcase.
This commit is contained in:
Richard Biener 2020-09-21 14:04:25 +02:00
parent d726ecd955
commit 0df746afc5
2 changed files with 26 additions and 3 deletions

View File

@ -0,0 +1,21 @@
/* { dg-do run } */
long long e, *d = &e;
int a, b, c;
int
main ()
{
for (; c <= 5; c++)
for (b = 0; b <= 5; b++)
{
for (a = 1; a <= 5; a++)
;
*d = 0;
if (c)
break;
}
if (a != 6)
__builtin_abort ();
return 0;
}

View File

@ -2232,9 +2232,11 @@ sm_seq_push_down (vec<seq_entry> &seq, unsigned ptr, unsigned *at)
|| (against.second == sm_other && against.from != NULL_TREE))
/* Found the tail of the sequence. */
break;
if (!refs_independent_p (memory_accesses.refs_list[new_cand.first],
memory_accesses.refs_list[against.first],
false))
/* We may not ignore self-dependences here. */
if (new_cand.first == against.first
|| !refs_independent_p (memory_accesses.refs_list[new_cand.first],
memory_accesses.refs_list[against.first],
false))
/* ??? Prune new_cand from the list of refs to apply SM to. */
return false;
std::swap (new_cand, against);