]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/52395 (Too conservative alignment info from SRA)
authorRichard Guenther <rguenther@suse.de>
Tue, 28 Feb 2012 09:18:35 +0000 (09:18 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 28 Feb 2012 09:18:35 +0000 (09:18 +0000)
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

gcc/ChangeLog
gcc/tree-sra.c

index 24df23ab7debf964c1858dca35e325e4ec3242de..155ba4606eacd771c78c1b7824876a7ff5fca6f1 100644 (file)
@@ -1,3 +1,9 @@
+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
index 1439c43c8896c7cb5ddaaa30391331dfe701321e..710f24eeba6bb13cf7a63f75dd3acbbc64441d21 100644 (file)
@@ -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);