diff options
author | Bin Cheng <bin.cheng@arm.com> | 2013-11-07 08:12:34 +0000 |
---|---|---|
committer | Bin Cheng <amker@gcc.gnu.org> | 2013-11-07 08:12:34 +0000 |
commit | be8c1c8cc0ff3da71e4cfb553e27a2832f4a939d (patch) | |
tree | c0e359d6da2982c6ccbbe62856a6514b7b8eaf3f /gcc/tree-ssa-loop-ivopts.c | |
parent | 196bb3237d1485b742e357be1c31771c5a0a35df (diff) | |
download | gcc-be8c1c8cc0ff3da71e4cfb553e27a2832f4a939d.zip gcc-be8c1c8cc0ff3da71e4cfb553e27a2832f4a939d.tar.gz gcc-be8c1c8cc0ff3da71e4cfb553e27a2832f4a939d.tar.bz2 |
tree-ssa-loop-ivopts.c (alloc_iv): Lower address expressions.
* tree-ssa-loop-ivopts.c (alloc_iv): Lower address expressions.
* tree-affine.c (get_inner_reference_aff): Return base.
* tree-affine.h (get_inner_reference_aff): Change prototype.
* gcc.dg/tree-ssa/loop-2.c: Refine check condition.
* gcc.dg/tree-ssa/ivopt_infer_2.c: Ditto.
* gcc.dg/tree-ssa/ivopt_mult_3.c: Ditto.
From-SVN: r204497
Diffstat (limited to 'gcc/tree-ssa-loop-ivopts.c')
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 0210dbb..220aae6 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -924,11 +924,30 @@ determine_base_object (tree expr) static struct iv * alloc_iv (tree base, tree step) { + tree base_object = base; struct iv *iv = XCNEW (struct iv); gcc_assert (step != NULL_TREE); + /* Lower all address expressions except ones with DECL_P as operand. + By doing this: + 1) More accurate cost can be computed for address expressions; + 2) Duplicate candidates won't be created for bases in different + forms, like &a[0] and &a. */ + STRIP_NOPS (base_object); + if (TREE_CODE (base_object) == ADDR_EXPR + && !DECL_P (TREE_OPERAND (base_object, 0))) + { + aff_tree comb; + double_int size; + base_object = get_inner_reference_aff (TREE_OPERAND (base_object, 0), + &comb, &size); + gcc_assert (base_object != NULL_TREE); + base_object = build_fold_addr_expr (base_object); + base = fold_convert (TREE_TYPE (base), aff_combination_to_tree (&comb)); + } + iv->base = base; - iv->base_object = determine_base_object (base); + iv->base_object = determine_base_object (base_object); iv->step = step; iv->biv_p = false; iv->have_use_for = false; |