tree-optimization/101105 - fix runtime alias test optimization

We were ignoring DR_STEP for VF == 1 which is OK only in case
the scalar order is preserved or both DR steps are the same.

2021-06-23  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/101105
	* tree-vect-data-refs.c (vect_prune_runtime_alias_test_list):
	Only ignore steps when they are equal or scalar order is preserved.

	* gcc.dg/torture/pr101105.c: New testcase.
This commit is contained in:
Richard Biener 2021-06-23 12:43:03 +02:00
parent 3bd86940c4
commit 50374fdacb
2 changed files with 26 additions and 2 deletions

View File

@ -0,0 +1,19 @@
/* { dg-do run } */
short a;
int b[5][4] = {2, 2};
int d;
short e(int f) { return f == 0 || a && f == 1 ? 0 : a; }
int main() {
int g, h;
g = 3;
for (; g >= 0; g--) {
h = 3;
for (; h >= 0; h--)
b[g][h] = b[0][1] && e(1);
}
d = b[0][1];
if (d != 0)
__builtin_abort ();
return 0;
}

View File

@ -3479,9 +3479,9 @@ vect_prune_runtime_alias_test_list (loop_vec_info loop_vinfo)
/* Step values are irrelevant for aliasing if the number of vector
iterations is equal to the number of scalar iterations (which can
happen for fully-SLP loops). */
bool ignore_step_p = known_eq (LOOP_VINFO_VECT_FACTOR (loop_vinfo), 1U);
bool vf_one_p = known_eq (LOOP_VINFO_VECT_FACTOR (loop_vinfo), 1U);
if (!ignore_step_p)
if (!vf_one_p)
{
/* Convert the checks for nonzero steps into bound tests. */
tree value;
@ -3534,6 +3534,11 @@ vect_prune_runtime_alias_test_list (loop_vec_info loop_vinfo)
bool preserves_scalar_order_p
= vect_preserves_scalar_order_p (dr_info_a, dr_info_b);
bool ignore_step_p
= (vf_one_p
&& (preserves_scalar_order_p
|| operand_equal_p (DR_STEP (dr_info_a->dr),
DR_STEP (dr_info_b->dr))));
/* Skip the pair if inter-iteration dependencies are irrelevant
and intra-iteration dependencies are guaranteed to be honored. */