Tighten early exit in vect_analyze_data_ref_dependence (PR85586)
The problem in this PR was that we didn't consider aliases between writes in the same strided group. After tightening the early exit we get the expected abs(step) >= 2 versioning check. 2018-05-02 Richard Sandiford <richard.sandiford@linaro.org> gcc/ PR tree-optimization/85586 * tree-vect-data-refs.c (vect_analyze_data_ref_dependence): Only exit early for statements in the same group if the accesses are not strided. gcc/testsuite/ PR tree-optimization/85586 * gcc.dg/vect/pr85586.c: New test. From-SVN: r259822
This commit is contained in:
parent
c2e1580cbe
commit
9e4da9b5d5
@ -1,3 +1,10 @@
|
||||
2018-05-02 Richard Sandiford <richard.sandiford@linaro.org>
|
||||
|
||||
PR tree-optimization/85586
|
||||
* tree-vect-data-refs.c (vect_analyze_data_ref_dependence): Only
|
||||
exit early for statements in the same group if the accesses are
|
||||
not strided.
|
||||
|
||||
2018-05-02 Tom de Vries <tom@codesourcery.com>
|
||||
|
||||
PR lto/85451
|
||||
|
@ -1,3 +1,8 @@
|
||||
2018-05-02 Richard Sandiford <richard.sandiford@linaro.org>
|
||||
|
||||
PR tree-optimization/85586
|
||||
* gcc.dg/vect/pr85586.c: New test.
|
||||
|
||||
2018-05-01 Marc Glisse <marc.glisse@inria.fr>
|
||||
|
||||
PR tree-optimization/85143
|
||||
|
43
gcc/testsuite/gcc.dg/vect/pr85586.c
Normal file
43
gcc/testsuite/gcc.dg/vect/pr85586.c
Normal file
@ -0,0 +1,43 @@
|
||||
#define N 100
|
||||
|
||||
void __attribute__ ((noipa))
|
||||
foo (int *out, int *in, int step)
|
||||
{
|
||||
for (int i = 0; i < N; ++i)
|
||||
{
|
||||
out[0] = in[i];
|
||||
out[1] = 2;
|
||||
out += step;
|
||||
}
|
||||
}
|
||||
|
||||
int in[N];
|
||||
int out[N * 2];
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
for (int i = 0; i < N; ++i)
|
||||
{
|
||||
in[i] = i * (i + 1);
|
||||
asm volatile ("" ::: "memory");
|
||||
}
|
||||
|
||||
foo (out, in, 1);
|
||||
for (int i = 0; i < N; ++i)
|
||||
if (out[i] != in[i])
|
||||
__builtin_abort ();
|
||||
if (out[N] != 2)
|
||||
__builtin_abort ();
|
||||
|
||||
foo (out + N - 1, in, -1);
|
||||
if (out[0] != in[N - 1])
|
||||
__builtin_abort ();
|
||||
for (int i = 1; i <= N; ++i)
|
||||
if (out[i] != 2)
|
||||
__builtin_abort ();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "LOOP VECTORIZED" 1 "vect" { target vect_int } } } */
|
@ -305,9 +305,11 @@ vect_analyze_data_ref_dependence (struct data_dependence_relation *ddr,
|
||||
return false;
|
||||
|
||||
/* We do not have to consider dependences between accesses that belong
|
||||
to the same group. */
|
||||
to the same group, unless the stride could be smaller than the
|
||||
group size. */
|
||||
if (GROUP_FIRST_ELEMENT (stmtinfo_a)
|
||||
&& GROUP_FIRST_ELEMENT (stmtinfo_a) == GROUP_FIRST_ELEMENT (stmtinfo_b))
|
||||
&& GROUP_FIRST_ELEMENT (stmtinfo_a) == GROUP_FIRST_ELEMENT (stmtinfo_b)
|
||||
&& !STMT_VINFO_STRIDED_P (stmtinfo_a))
|
||||
return false;
|
||||
|
||||
/* Even if we have an anti-dependence then, as the vectorized loop covers at
|
||||
|
Loading…
Reference in New Issue
Block a user