diff options
author | Bin Cheng <bin.cheng@arm.com> | 2016-08-09 15:08:02 +0000 |
---|---|---|
committer | Bin Cheng <amker@gcc.gnu.org> | 2016-08-09 15:08:02 +0000 |
commit | 42970a179d71e59c317440d0567b003681e915ba (patch) | |
tree | e2dec7e06bcb0dea52cd1cba64b1dc05f6b884da | |
parent | 8aa46dd2d5808a951afee6c6322615225f298d6a (diff) | |
download | gcc-42970a179d71e59c317440d0567b003681e915ba.zip gcc-42970a179d71e59c317440d0567b003681e915ba.tar.gz gcc-42970a179d71e59c317440d0567b003681e915ba.tar.bz2 |
re PR tree-optimization/72772 (Missed SCEV after pass reordering@236440)
PR tree-optimization/72772
* tree-ssa-loop-niter.c (loop_exits_before_overflow): Check equality
for expanded base.
gcc/testsuite
PR tree-optimization/pr72772
* gcc.dg/tree-ssa/pr72772.c: New test.
From-SVN: r239291
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr72772.c | 21 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-niter.c | 23 |
4 files changed, 47 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8fdba02..ff169b5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,12 @@ 2016-08-09 Bin Cheng <bin.cheng@arm.com> PR tree-optimization/72772 + * tree-ssa-loop-niter.c (loop_exits_before_overflow): Check equality + for expanded base. + +2016-08-09 Bin Cheng <bin.cheng@arm.com> + + PR tree-optimization/72772 * tree-ssa-loop-niter.h (simplify_using_initial_conditions): Delete parameter STOP. * tree-ssa-loop-niter.c (tree_simplify_using_condition_1): Delete diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 12a58e8..3a5468c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-08-09 Bin Cheng <bin.cheng@arm.com> + + PR tree-optimization/pr72772 + * gcc.dg/tree-ssa/pr72772.c: New test. + 2016-08-09 Matthew Fortune <matthew.fortune@imgtec.com> PR rtl-optimization/66669 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr72772.c b/gcc/testsuite/gcc.dg/tree-ssa/pr72772.c new file mode 100644 index 0000000..b998561 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr72772.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-loop-distribution -fdump-tree-ldist-details" } */ + +int foo (int flag, char *a) +{ + short i, j; + short l = 0; + if (flag == 1) + l = 3; + + for (i = 0; i < 4; i++) + { + for (j = l - 1; j > 0; j--) + a[j] = a[j - 1]; + a[0] = i; + } +} + +/* Addresses of array reference a[j] and a[j - 1] are SCEVs. */ +/* { dg-final { scan-tree-dump-not "failed: evolution of base is not affine." "ldist" } } */ + diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c index a34672a..a50d2b4 100644 --- a/gcc/tree-ssa-loop-niter.c +++ b/gcc/tree-ssa-loop-niter.c @@ -4214,7 +4214,7 @@ loop_exits_before_overflow (tree base, tree step, for (civ = loop->control_ivs; civ; civ = civ->next) { enum tree_code code; - tree stepped, extreme, civ_type = TREE_TYPE (civ->step); + tree civ_type = TREE_TYPE (civ->step); /* Have to consider type difference because operand_equal_p ignores that for constants. */ @@ -4227,11 +4227,13 @@ loop_exits_before_overflow (tree base, tree step, continue; /* Done proving if this is a no-overflow control IV. */ - if (operand_equal_p (base, civ->base, 0) - /* Control IV is recorded after expanding simple operations, - Here we compare it against expanded base too. */ - || operand_equal_p (expand_simple_operations (base), - civ->base, 0)) + if (operand_equal_p (base, civ->base, 0)) + return true; + + /* Control IV is recorded after expanding simple operations, + Here we expand base and compare it too. */ + tree expanded_base = expand_simple_operations (base); + if (operand_equal_p (expanded_base, civ->base, 0)) return true; /* If this is a before stepping control IV, in other words, we have @@ -4253,9 +4255,14 @@ loop_exits_before_overflow (tree base, tree step, else code = PLUS_EXPR; - stepped = fold_build2 (code, TREE_TYPE (base), base, step); - if (operand_equal_p (stepped, civ->base, 0)) + tree stepped = fold_build2 (code, TREE_TYPE (base), base, step); + tree expanded_stepped = fold_build2 (code, TREE_TYPE (base), + expanded_base, step); + if (operand_equal_p (stepped, civ->base, 0) + || operand_equal_p (expanded_stepped, civ->base, 0)) { + tree extreme; + if (tree_int_cst_sign_bit (step)) { code = LT_EXPR; |