From a031a8448752c79206766321e0572dfab5c1d92a Mon Sep 17 00:00:00 2001 From: amker Date: Tue, 9 Aug 2016 15:08:02 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@239291 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/tree-ssa/pr72772.c | 21 +++++++++++++++++++++ gcc/tree-ssa-loop-niter.c | 23 +++++++++++++++-------- 4 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr72772.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8fdba025845..ff169b580ea 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,12 @@ 2016-08-09 Bin Cheng PR tree-optimization/72772 + * tree-ssa-loop-niter.c (loop_exits_before_overflow): Check equality + for expanded base. + +2016-08-09 Bin Cheng + + 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 12a58e8935b..3a5468cbb47 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-08-09 Bin Cheng + + PR tree-optimization/pr72772 + * gcc.dg/tree-ssa/pr72772.c: New test. + 2016-08-09 Matthew Fortune 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 00000000000..b9985618093 --- /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 a34672afd24..a50d2b4b43e 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; -- 2.11.4.GIT