aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2012-02-28 09:18:35 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-02-28 09:18:35 +0000
commit85998a930587e8b03cf19bae41bb198cf82328b8 (patch)
treea9d21a45612ee50fadb48bf21238faf85aacf741 /gcc
parent3a5a825aaecd124c57d3b08ba349631ac8e89123 (diff)
downloadgcc-85998a930587e8b03cf19bae41bb198cf82328b8.zip
gcc-85998a930587e8b03cf19bae41bb198cf82328b8.tar.gz
gcc-85998a930587e8b03cf19bae41bb198cf82328b8.tar.bz2
re PR tree-optimization/52395 (Too conservative alignment info from SRA)
2012-02-28 Richard Guenther <rguenther@suse.de> PR tree-optimization/52395 * tree-sra.c (build_ref_for_offset): Also look at the base TYPE_ALIGN when figuring out the alignment of the replacement. From-SVN: r184620
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/tree-sra.c8
2 files changed, 11 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 24df23a..155ba46 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2012-02-28 Richard Guenther <rguenther@suse.de>
+ PR tree-optimization/52395
+ * tree-sra.c (build_ref_for_offset): Also look at the base
+ TYPE_ALIGN when figuring out the alignment of the replacement.
+
+2012-02-28 Richard Guenther <rguenther@suse.de>
+
PR tree-optimization/52402
* ipa-prop.c (ipa_modify_call_arguments): Properly use
mis-aligned types when creating the accesses at the call site.
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 1439c43..710f24e 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -1526,10 +1526,12 @@ build_ref_for_offset (location_t loc, tree base, HOST_WIDE_INT offset,
we can extract more optimistic alignment information
by looking at the access mode. That would constrain the
alignment of base + base_offset which we would need to
- adjust according to offset.
- ??? But it is not at all clear that prev_base is an access
- that was in the IL that way, so be conservative for now. */
+ adjust according to offset. */
align = get_pointer_alignment_1 (base, &misalign);
+ if (misalign == 0
+ && (TREE_CODE (prev_base) == MEM_REF
+ || TREE_CODE (prev_base) == TARGET_MEM_REF))
+ align = MAX (align, TYPE_ALIGN (TREE_TYPE (prev_base)));
misalign += (double_int_sext (tree_to_double_int (off),
TYPE_PRECISION (TREE_TYPE (off))).low
* BITS_PER_UNIT);