diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr112281.c | 19 | ||||
-rw-r--r-- | gcc/tree-loop-distribution.cc | 7 |
2 files changed, 23 insertions, 3 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr112281.c b/gcc/testsuite/gcc.dg/torture/pr112281.c new file mode 100644 index 0000000..3f0a61a --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr112281.c @@ -0,0 +1,19 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-loop-distribution" } */ + +struct { + int : 8; + int a; +} b, d[4] = {{0}, {0}, {0}, {5}}; +int c, e; +int main() +{ + for (c = 2; c; c--) + for (e = 0; e < 2; e++) { + d[c] = b = d[c + 1]; + d[c + 1].a = 0; + } + if (b.a != 0) + __builtin_abort(); + return 0; +} diff --git a/gcc/tree-loop-distribution.cc b/gcc/tree-loop-distribution.cc index 8abfa99..8e92af6 100644 --- a/gcc/tree-loop-distribution.cc +++ b/gcc/tree-loop-distribution.cc @@ -2163,9 +2163,10 @@ loop_distribution::pg_add_dependence_edges (struct graph *rdg, int dir, gcc.dg/tree-ssa/pr94969.c. */ if (DDR_NUM_DIST_VECTS (ddr) != 1) this_dir = 2; - /* If the overlap is exact preserve stmt order. */ - else if (lambda_vector_zerop (DDR_DIST_VECT (ddr, 0), - DDR_NB_LOOPS (ddr))) + /* If the dependence distance is zero in the innermost + loop preserve stmt order. */ + else if (DDR_DIST_VECT (ddr, 0) + [DDR_LOOP_NEST (ddr).length () - 1] == 0) ; /* Else as the distance vector is lexicographic positive swap the dependence direction. */ |