diff options
author | Bin Cheng <bin.cheng@arm.com> | 2017-04-10 16:54:14 +0000 |
---|---|---|
committer | Bin Cheng <amker@gcc.gnu.org> | 2017-04-10 16:54:14 +0000 |
commit | 46bf3f84b6a117d94ac7479c9e13e05af82d9931 (patch) | |
tree | 3fcd5bbc464fcdadacdb3cb3e35520b48db8f151 /gcc/tree-ssa-loop-ivopts.c | |
parent | aac69a62a1b459379367979406430cf282e347af (diff) | |
download | gcc-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.c | 43 |
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 |