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
This commit is contained in:
parent
aac69a62a1
commit
46bf3f84b6
|
@ -1,3 +1,10 @@
|
|||
2017-04-10 Bin Cheng <bin.cheng@arm.com>
|
||||
|
||||
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.
|
||||
|
||||
2017-04-10 Richard Biener <rguenther@suse.de>
|
||||
Bin Cheng <bin.cheng@arm.com>
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue