diff options
author | amker <amker@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-07 08:12:34 +0000 |
---|---|---|
committer | amker <amker@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-07 08:12:34 +0000 |
commit | 388424f0d3a9b723b8f87976aa650dde8c905f7e (patch) | |
tree | c0e359d6da2982c6ccbbe62856a6514b7b8eaf3f | |
parent | dae9c8006692291f4da6026f62aabfeb568d5647 (diff) | |
download | gcc-388424f0d3a9b723b8f87976aa650dde8c905f7e.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204497 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ivopt_infer_2.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ivopt_mult_3.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/loop-2.c | 2 | ||||
-rw-r--r-- | gcc/tree-affine.c | 9 | ||||
-rw-r--r-- | gcc/tree-affine.h | 2 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 21 |
8 files changed, 44 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 75603e79382..fcbcbb5466f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-11-07 Bin Cheng <bin.cheng@arm.com> + + * 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. + 2013-11-06 Tobias Burnus <burnus@net-b.de> * doc/invoke.texi (Wdate-time): Fix typo. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b857d00f851..c89765b998c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-11-07 Bin Cheng <bin.cheng@arm.com> + + * 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. + 2013-11-06 DJ Delorie <dj@redhat.com> * gcc.dg/mismatch-decl-1.c: New test. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ivopt_infer_2.c b/gcc/testsuite/gcc.dg/tree-ssa/ivopt_infer_2.c index 4c5a54b9af4..c0f6398d827 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ivopt_infer_2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ivopt_infer_2.c @@ -7,7 +7,8 @@ extern char a[]; -/* Can not infer loop iteration from array -- exit test can not be replaced. */ +/* Can not infer loop iteration from array -- exit test can not be + replaced by the array address. */ void foo (unsigned int i_width, TYPE dst) { unsigned long long i = 0; @@ -21,5 +22,5 @@ void foo (unsigned int i_width, TYPE dst) } } -/* { dg-final { scan-tree-dump-times "Replacing" 0 "ivopts"} } */ +/* { dg-final { scan-tree-dump-times "\[^:\]*if \\(.*j_\[0-9\]+.*\\)" 1 "ivopts"} } */ /* { dg-final { cleanup-tree-dump "ivopts" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ivopt_mult_3.c b/gcc/testsuite/gcc.dg/tree-ssa/ivopt_mult_3.c index dc78a43f73f..25ae845f71e 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ivopt_mult_3.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ivopt_mult_3.c @@ -18,5 +18,5 @@ long foo(long* p, long* p2, int N1, int N2) return s; } -/* { dg-final { scan-tree-dump-times "Replacing" 1 "ivopts"} } */ +/* { dg-final { scan-tree-dump-times "Replacing exit test: if \\(.*p2.*\\)" 1 "ivopts"} } */ /* { dg-final { cleanup-tree-dump "ivopts" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/loop-2.c b/gcc/testsuite/gcc.dg/tree-ssa/loop-2.c index 3426827783c..f43a6d8eb77 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/loop-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/loop-2.c @@ -27,7 +27,7 @@ void xxx(void) /* { dg-final { scan-tree-dump-times " \\* \[^\\n\\r\]*=" 0 "optimized" } } */ /* { dg-final { scan-tree-dump-times "\[^\\n\\r\]*= \\* " 0 "optimized" } } */ -/* { dg-final { scan-tree-dump-times "MEM" 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "MEM\\\[base" 1 "optimized" } } */ /* 17 * iter should be strength reduced. */ diff --git a/gcc/tree-affine.c b/gcc/tree-affine.c index 81da521277f..b492ff0a211 100644 --- a/gcc/tree-affine.c +++ b/gcc/tree-affine.c @@ -874,10 +874,11 @@ debug_aff (aff_tree *val) fprintf (stderr, "\n"); } -/* Returns address of the reference REF in ADDR. The size of the accessed - location is stored to SIZE. */ +/* Computes address of the reference REF in ADDR. The size of the accessed + location is stored to SIZE. Returns the ultimate containing object to + which REF refers. */ -void +tree get_inner_reference_aff (tree ref, aff_tree *addr, double_int *size) { HOST_WIDE_INT bitsize, bitpos; @@ -904,6 +905,8 @@ get_inner_reference_aff (tree ref, aff_tree *addr, double_int *size) aff_combination_add (addr, &tmp); *size = double_int::from_shwi ((bitsize + BITS_PER_UNIT - 1) / BITS_PER_UNIT); + + return base; } /* Returns true if a region of size SIZE1 at position 0 and a region of diff --git a/gcc/tree-affine.h b/gcc/tree-affine.h index b2558f7a4bd..86f90d82da0 100644 --- a/gcc/tree-affine.h +++ b/gcc/tree-affine.h @@ -74,7 +74,7 @@ bool aff_combination_constant_multiple_p (aff_tree *, aff_tree *, double_int *); void aff_combination_expand (aff_tree *, struct pointer_map_t **); void tree_to_aff_combination_expand (tree, tree, aff_tree *, struct pointer_map_t **); -void get_inner_reference_aff (tree, aff_tree *, double_int *); +tree get_inner_reference_aff (tree, aff_tree *, double_int *); void free_affine_expand_cache (struct pointer_map_t **); bool aff_comb_cannot_overlap_p (aff_tree *, double_int, double_int); diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 0210dbbad3d..220aae6878b 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; |