mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 03:47:02 -05:00
Add missing unit dependence vector in data dependence analysis
Current data dependence analysis misses unit distant vector if DRs in DDR have the same invariant access functions. This adds the vector as the constant access function case. Also fix typo in testcase. Backport from master. 2020-05-13 Bin Cheng <bin.cheng@linux.alibaba.com> gcc/ PR tree-optimization/94969 * tree-data-ref.c (constant_access_functions): Rename to... (invariant_access_functions): ...this. Add parameter. Check for invariant access function, rather than constant. (build_classic_dist_vector): Call above function. * tree-loop-distribution.c (pg_add_dependence_edges): Add comment. gcc/testsuite/ PR tree-optimization/94969 * gcc.dg/tree-ssa/pr94969.c: New test. 2020-05-13 Jakub Jelinek <jakub@redhat.com> gcc/testsuite/ PR tree-optimization/95110 * gcc.dg/tree-ssa/pr94969.c: Swap scan-tree-dump-not arguments.
This commit is contained in:
@@ -1,3 +1,15 @@
|
||||
2020-05-22 Bin Cheng <bin.cheng@linux.alibaba.com>
|
||||
|
||||
Backport from master
|
||||
PR tree-optimization/94969
|
||||
2020-05-13 Bin Cheng <bin.cheng@linux.alibaba.com>
|
||||
|
||||
* tree-data-ref.c (constant_access_functions): Rename to...
|
||||
(invariant_access_functions): ...this. Add parameter. Check for
|
||||
invariant access function, rather than constant.
|
||||
(build_classic_dist_vector): Call above function.
|
||||
* tree-loop-distribution.c (pg_add_dependence_edges): Add comment.
|
||||
|
||||
2020-05-21 Martin Liska <mliska@suse.cz>
|
||||
|
||||
* common/config/aarch64/aarch64-common.c (aarch64_handle_option):
|
||||
|
||||
@@ -1,3 +1,19 @@
|
||||
2020-05-22 Bin Cheng <bin.cheng@linux.alibaba.com>
|
||||
|
||||
Backport from master
|
||||
PR tree-optimization/95110
|
||||
2020-05-13 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* gcc.dg/tree-ssa/pr94969.c: Swap scan-tree-dump-not arguments.
|
||||
|
||||
2020-05-22 Bin Cheng <bin.cheng@linux.alibaba.com>
|
||||
|
||||
Backport from master
|
||||
PR tree-optimization/94969
|
||||
2020-05-13 Bin Cheng <bin.cheng@linux.alibaba.com>
|
||||
|
||||
* gcc.dg/tree-ssa/pr94969.c: New test.
|
||||
|
||||
2020-05-21 Martin Liska <mliska@suse.cz>
|
||||
|
||||
* gcc.target/aarch64/target_attr_20.c: New test.
|
||||
|
||||
28
gcc/testsuite/gcc.dg/tree-ssa/pr94969.c
Normal file
28
gcc/testsuite/gcc.dg/tree-ssa/pr94969.c
Normal file
@@ -0,0 +1,28 @@
|
||||
/* PR tree-optimization/52267 */
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-O3 -fdump-tree-ldist-details" } */
|
||||
|
||||
int a = 0, b = 0, c = 0;
|
||||
struct S {
|
||||
signed m : 7;
|
||||
signed e : 2;
|
||||
};
|
||||
struct S f[2] = {{0, 0}, {0, 0}};
|
||||
struct S g = {0, 0};
|
||||
|
||||
void __attribute__((noinline))
|
||||
k()
|
||||
{
|
||||
for (; c <= 1; c++) {
|
||||
f[b] = g;
|
||||
f[b].e ^= 1;
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
k();
|
||||
if (f[b].e != 1)
|
||||
__builtin_abort ();
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-not "Loop 1 distributed: split to 3 loops" "ldist" } } */
|
||||
@@ -4369,17 +4369,19 @@ build_classic_dist_vector_1 (struct data_dependence_relation *ddr,
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Return true when the DDR contains only constant access functions. */
|
||||
/* Return true when the DDR contains only invariant access functions wrto. loop
|
||||
number LNUM. */
|
||||
|
||||
static bool
|
||||
constant_access_functions (const struct data_dependence_relation *ddr)
|
||||
invariant_access_functions (const struct data_dependence_relation *ddr,
|
||||
int lnum)
|
||||
{
|
||||
unsigned i;
|
||||
subscript *sub;
|
||||
|
||||
FOR_EACH_VEC_ELT (DDR_SUBSCRIPTS (ddr), i, sub)
|
||||
if (!evolution_function_is_constant_p (SUB_ACCESS_FN (sub, 0))
|
||||
|| !evolution_function_is_constant_p (SUB_ACCESS_FN (sub, 1)))
|
||||
if (!evolution_function_is_invariant_p (SUB_ACCESS_FN (sub, 0), lnum)
|
||||
|| !evolution_function_is_invariant_p (SUB_ACCESS_FN (sub, 1), lnum))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@@ -4578,7 +4580,7 @@ build_classic_dist_vector (struct data_dependence_relation *ddr,
|
||||
dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
|
||||
save_dist_v (ddr, dist_v);
|
||||
|
||||
if (constant_access_functions (ddr))
|
||||
if (invariant_access_functions (ddr, loop_nest->num))
|
||||
add_distance_for_zero_overlaps (ddr);
|
||||
|
||||
if (DDR_NB_LOOPS (ddr) > 1)
|
||||
|
||||
@@ -1949,7 +1949,8 @@ pg_add_dependence_edges (struct graph *rdg, int dir,
|
||||
this_dir = -this_dir;
|
||||
|
||||
/* Known dependences can still be unordered througout the
|
||||
iteration space, see gcc.dg/tree-ssa/ldist-16.c. */
|
||||
iteration space, see gcc.dg/tree-ssa/ldist-16.c and
|
||||
gcc.dg/tree-ssa/pr94969.c. */
|
||||
if (DDR_NUM_DIST_VECTS (ddr) != 1)
|
||||
this_dir = 2;
|
||||
/* If the overlap is exact preserve stmt order. */
|
||||
|
||||
Reference in New Issue
Block a user