diff options
author | Sebastian Pop <sebpop@gmail.com> | 2007-06-21 17:06:05 +0000 |
---|---|---|
committer | Sebastian Pop <spop@gcc.gnu.org> | 2007-06-21 17:06:05 +0000 |
commit | 6f1c9cd02fe6c75045024074dc9edf59c2981042 (patch) | |
tree | 414e7e5e598d92016ed799bc6cc85640717125a5 | |
parent | e44e043cb31d2cbac67dde6e529fd0fd804f384c (diff) | |
download | gcc-6f1c9cd02fe6c75045024074dc9edf59c2981042.zip gcc-6f1c9cd02fe6c75045024074dc9edf59c2981042.tar.gz gcc-6f1c9cd02fe6c75045024074dc9edf59c2981042.tar.bz2 |
re PR tree-optimization/19590 (IVs with the same evolution not eliminated)
PR tree-optimization/19590
* tree-vrp.c (adjust_range_with_scev): Set the range when the result
of scev is a constant.
* gcc/testsuite/gcc.dg/tree-ssa/pr19590.c: New.
From-SVN: r125925
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr19590.c | 37 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 8 |
3 files changed, 52 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 781a421..17997e9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-06-21 Sebastian Pop <sebpop@gmail.com> + + PR tree-optimization/19590 + * tree-vrp.c (adjust_range_with_scev): Set the range when the result + of scev is a constant. + * gcc/testsuite/gcc.dg/tree-ssa/pr19590.c: New. + 2007-06-21 Kenneth Zadeck <zadeck@naturalbridge.com> * df-problems.c (df_note_bb_compute): Made computation of live diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr19590.c b/gcc/testsuite/gcc.dg/tree-ssa/pr19590.c new file mode 100644 index 0000000..1be1119 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr19590.c @@ -0,0 +1,37 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-ivopts" } */ + +void vnum_test8(int *data) +{ + int i; + int stop = data[3]; + int m = data[4]; + int n = m; + for (i=1; i<stop; i++) { + int k = data[2]; + data[k] = 2; + data[0] = m - n; + k = data[1]; + m = m + k; + n = n + k; + } +} + +/* Using the SCEV analysis, this loop should be transformed to: + + | void vnum_result8(int *data) + |{ + | int i; + | int stop = data[3]; + | for (i=1; i<stop; i++) { + | int k = data[2]; + | data[k] = 2; + | data[0] = 0; + | } + |} + +*/ + +/* { dg-final { scan-tree-dump-times "= 0;" 1 "ivopts"} } */ +/* { dg-final { scan-tree-dump-times "= 2;" 1 "ivopts"} } */ +/* { dg-final { cleanup-tree-dump "ivopts" } } */ diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 937a76b..06931f1f7 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -2638,6 +2638,14 @@ adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt, return; chrec = instantiate_parameters (loop, analyze_scalar_evolution (loop, var)); + + /* Like in PR19590, scev can return a constant function. */ + if (is_gimple_min_invariant (chrec)) + { + set_value_range (vr, VR_RANGE, chrec, chrec, vr->equiv); + return; + } + if (TREE_CODE (chrec) != POLYNOMIAL_CHREC) return; |