aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-loop-ivopts.c
diff options
context:
space:
mode:
authorBin Cheng <bin.cheng@arm.com>2017-04-10 16:54:14 +0000
committerBin Cheng <amker@gcc.gnu.org>2017-04-10 16:54:14 +0000
commit46bf3f84b6a117d94ac7479c9e13e05af82d9931 (patch)
tree3fcd5bbc464fcdadacdb3cb3e35520b48db8f151 /gcc/tree-ssa-loop-ivopts.c
parentaac69a62a1b459379367979406430cf282e347af (diff)
downloadgcc-46bf3f84b6a117d94ac7479c9e13e05af82d9931.zip
gcc-46bf3f84b6a117d94ac7479c9e13e05af82d9931.tar.gz
gcc-46bf3f84b6a117d94ac7479c9e13e05af82d9931.tar.bz2
re PR tree-optimization/80153 (ivopt generate wrong code)
PR tree-optimization/80153 * tree-ssa-loop-ivopts.c (add_iv_candidate_for_use): Check and remove POINTER_PLUS_EXPR's base part directly, rather than through aff_tree. From-SVN: r246811
Diffstat (limited to 'gcc/tree-ssa-loop-ivopts.c')
-rw-r--r--gcc/tree-ssa-loop-ivopts.c43
1 files changed, 11 insertions, 32 deletions
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index 036e041..4fc35fa 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -3335,41 +3335,20 @@ add_iv_candidate_for_use (struct ivopts_data *data, struct iv_use *use)
}
/* Record common candidate with base_object removed in base. */
- if (iv->base_object != NULL)
+ base = iv->base;
+ STRIP_NOPS (base);
+ if (iv->base_object != NULL && TREE_CODE (base) == POINTER_PLUS_EXPR)
{
- unsigned i;
- aff_tree aff_base;
- tree step, base_object = iv->base_object;
+ tree step = iv->step;
- base = iv->base;
- step = iv->step;
- STRIP_NOPS (base);
STRIP_NOPS (step);
- STRIP_NOPS (base_object);
- tree_to_aff_combination (base, TREE_TYPE (base), &aff_base);
- for (i = 0; i < aff_base.n; i++)
- {
- if (aff_base.elts[i].coef != 1)
- continue;
-
- if (operand_equal_p (aff_base.elts[i].val, base_object, 0))
- break;
- }
- if (i < aff_base.n)
- {
- aff_combination_remove_elt (&aff_base, i);
- base = aff_combination_to_tree (&aff_base);
- basetype = TREE_TYPE (base);
- if (POINTER_TYPE_P (basetype))
- basetype = sizetype;
-
- step = fold_convert (basetype, step);
- record_common_cand (data, base, step, use);
- /* Also record common candidate with offset stripped. */
- base = strip_offset (base, &offset);
- if (offset)
- record_common_cand (data, base, step, use);
- }
+ base = TREE_OPERAND (base, 1);
+ step = fold_convert (sizetype, step);
+ record_common_cand (data, base, step, use);
+ /* Also record common candidate with offset stripped. */
+ base = strip_offset (base, &offset);
+ if (offset)
+ record_common_cand (data, base, step, use);
}
/* At last, add auto-incremental candidates. Make such variables