diff options
author | Sebastian Pop <sebastian.pop@amd.com> | 2010-12-15 05:04:40 +0000 |
---|---|---|
committer | Sebastian Pop <spop@gcc.gnu.org> | 2010-12-15 05:04:40 +0000 |
commit | 3e6f8b560669aa350629504f80388cc773719f13 (patch) | |
tree | e1f9a3b7e60d6567d61591500be04952318f5d47 /gcc | |
parent | ab2210870b28990071af15a53ce817a3fc6d5af8 (diff) | |
download | gcc-3e6f8b560669aa350629504f80388cc773719f13.zip gcc-3e6f8b560669aa350629504f80388cc773719f13.tar.gz gcc-3e6f8b560669aa350629504f80388cc773719f13.tar.bz2 |
Fix PR46928: handle "A[p] == A[p]" in data dep analysis with p a parameter of the loop.
2010-12-14 Sebastian Pop <sebastian.pop@amd.com>
PR tree-optimization/46928
* tree-data-ref.c (analyze_overlapping_iterations): Handle "A[p] == A[p]"
in data dependence analysis with p a parameter of the loop.
* gcc.dg/tree-ssa/ldist-17.c: New.
From-SVN: r167843
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c | 50 | ||||
-rw-r--r-- | gcc/tree-data-ref.c | 5 |
4 files changed, 64 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9818c03..66c11c4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2010-12-14 Sebastian Pop <sebastian.pop@amd.com> + PR tree-optimization/46928 + * tree-data-ref.c (analyze_overlapping_iterations): Handle "A[p] == A[p]" + in data dependence analysis with p a parameter of the loop. + +2010-12-14 Sebastian Pop <sebastian.pop@amd.com> + PR tree-optimization/45948 * tree-loop-distribution.c (ssa_name_has_uses_outside_loop_p): New. (stmt_has_scalar_dependences_outside_loop): New. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a8c6941..fae339b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2010-12-14 Sebastian Pop <sebastian.pop@amd.com> + PR tree-optimization/46928 + * gcc.dg/tree-ssa/ldist-17.c: New. + +2010-12-14 Sebastian Pop <sebastian.pop@amd.com> + PR tree-optimization/45948 * gcc.dg/tree-ssa/ldist-pr45948.c: New. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c new file mode 100644 index 0000000..a831d3c --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-17.c @@ -0,0 +1,50 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-loop-distribution -fdump-tree-ldist-details" } */ + +typedef int mad_fixed_t; +struct mad_pcm +{ + unsigned int samplerate; + unsigned short channels; + unsigned short length; + mad_fixed_t samples[2][1152]; +}; +struct mad_synth +{ + mad_fixed_t filter[2][2][2][16][8]; + unsigned int phase; + struct mad_pcm pcm; +}; +void mad_synth_mute (struct mad_synth *synth); +void +mad_synth_mute (struct mad_synth *synth) +{ + unsigned int ch; + unsigned int s; + unsigned int v; + + ch = 0U; + while (ch < 2U) + { + s = 0U; + while (s < 16U) + { + v = 0U; + while (v < 8U) + { + synth->filter[ch][1][1][s][v] = 0; + synth->filter[ch][1][0][s][v] = 0; + synth->filter[ch][0][1][s][v] = 0; + synth->filter[ch][0][0][s][v] = 0; + v++; + } + s++; + } + ch++; + } + return; +} + +/* { dg-final { scan-tree-dump "distributed: split to 4" "ldist" } } */ +/* { dg-final { scan-tree-dump-times "__builtin_memset" 8 "ldist" } } */ +/* { dg-final { cleanup-tree-dump "ldist" } } */ diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index 9a81370..a6d0731 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -2653,7 +2653,8 @@ analyze_overlapping_iterations (tree chrec_a, /* If they are the same chrec, and are affine, they overlap on every iteration. */ else if (eq_evolutions_p (chrec_a, chrec_b) - && evolution_function_is_affine_multivariate_p (chrec_a, lnn)) + && (evolution_function_is_affine_multivariate_p (chrec_a, lnn) + || operand_equal_p (chrec_a, chrec_b, 0))) { dependence_stats.num_same_subscript_function++; *overlap_iterations_a = conflict_fn (1, affine_fn_cst (integer_zero_node)); @@ -2662,7 +2663,7 @@ analyze_overlapping_iterations (tree chrec_a, } /* If they aren't the same, and aren't affine, we can't do anything - yet. */ + yet. */ else if ((chrec_contains_symbols (chrec_a) || chrec_contains_symbols (chrec_b)) && (!evolution_function_is_affine_multivariate_p (chrec_a, lnn) |