OSDN Git Service

* cfgexpand.c (expand_one_register_var): Use get_pointer_alignment.
authormatz <matz@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 23 Aug 2011 14:38:24 +0000 (14:38 +0000)
committermatz <matz@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 23 Aug 2011 14:38:24 +0000 (14:38 +0000)
(gimple_expand_cfg): Merge alignment info for coalesced pointer
SSA names.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@177989 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cfgexpand.c

index 5ab9d0c..3bb9318 100644 (file)
@@ -1,3 +1,9 @@
+2011-08-12  Michael Matz  <matz@suse.de>
+
+       * cfgexpand.c (expand_one_register_var): Use get_pointer_alignment.
+       (gimple_expand_cfg): Merge alignment info for coalesced pointer
+       SSA names.
+
 2011-08-23  Richard Guenther  <rguenther@suse.de>
 
        * Makefile.in (tree-data-ref.o): Add tree-affine.h dependency.
index f87308c..03a4409 100644 (file)
@@ -909,7 +909,7 @@ expand_one_register_var (tree var)
     mark_user_reg (x);
 
   if (POINTER_TYPE_P (type))
-    mark_reg_pointer (x, TYPE_ALIGN (TREE_TYPE (type)));
+    mark_reg_pointer (x, get_pointer_alignment (var));
 }
 
 /* A subroutine of expand_one_var.  Called to assign rtl to a VAR_DECL that
@@ -4265,6 +4265,31 @@ gimple_expand_cfg (void)
        }
     }
 
+  /* If we have a class containing differently aligned pointers
+     we need to merge those into the corresponding RTL pointer
+     alignment.  */
+  for (i = 1; i < num_ssa_names; i++)
+    {
+      tree name = ssa_name (i);
+      int part;
+      rtx r;
+
+      if (!name
+         || !POINTER_TYPE_P (TREE_TYPE (name))
+         /* We might have generated new SSA names in
+            update_alias_info_with_stack_vars.  They will have a NULL
+            defining statements, and won't be part of the partitioning,
+            so ignore those.  */
+         || !SSA_NAME_DEF_STMT (name))
+       continue;
+      part = var_to_partition (SA.map, name);
+      if (part == NO_PARTITION)
+       continue;
+      r = SA.partition_to_pseudo[part];
+      if (REG_P (r))
+       mark_reg_pointer (r, get_pointer_alignment (name));
+    }
+
   /* If this function is `main', emit a call to `__main'
      to run global initializers, etc.  */
   if (DECL_NAME (current_function_decl)