]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-vect-data-refs.c (vect_can_force_dr_alignment_p): Reorg to use symtab and decl_b...
authorJan Hubicka <hubicka@ucw.cz>
Thu, 12 Jun 2014 22:16:25 +0000 (00:16 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 12 Jun 2014 22:16:25 +0000 (22:16 +0000)
* tree-vect-data-refs.c (vect_can_force_dr_alignment_p): Reorg
to use symtab and decl_binds_to_current_def_p
* tree-vectorizer.c (increase_alignment): Increase alignment
of alias target, too.

From-SVN: r211599

gcc/ChangeLog
gcc/tree-vect-data-refs.c
gcc/tree-vectorizer.c

index 6e8da453ff5e40dd83375eee277c1c1055033a3a..a8dcd62fd3da9e28626c4e12d9dd7ab4866e8fb9 100644 (file)
@@ -1,3 +1,10 @@
+2014-06-12  Jan Hubicka  <hubicka@ucw.cz>
+
+       * tree-vect-data-refs.c (vect_can_force_dr_alignment_p): Reorg
+       to use symtab and decl_binds_to_current_def_p
+       * tree-vectorizer.c (increase_alignment): Increase alignment
+       of alias target, too.
+
 2014-06-12  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/61486
index 3c5a3b3bc6f383aef6159c328b395e7f931ba09c..ff02ff3c457cd79e438c1994fa72ad4354f2512b 100644 (file)
@@ -58,6 +58,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "expr.h"
 #include "optabs.h"
 #include "builtins.h"
+#include "varasm.h"
 
 /* Return true if load- or store-lanes optab OPTAB is implemented for
    COUNT vectors of type VECTYPE.  NAME is the name of OPTAB.  */
@@ -5316,19 +5317,26 @@ vect_can_force_dr_alignment_p (const_tree decl, unsigned int alignment)
   if (TREE_CODE (decl) != VAR_DECL)
     return false;
 
-  /* We cannot change alignment of common or external symbols as another
-     translation unit may contain a definition with lower alignment.  
-     The rules of common symbol linking mean that the definition
-     will override the common symbol.  The same is true for constant
-     pool entries which may be shared and are not properly merged
-     by LTO.  */
-  if (DECL_EXTERNAL (decl)
-      || DECL_COMMON (decl)
-      || DECL_IN_CONSTANT_POOL (decl))
-    return false;
+  gcc_assert (!TREE_ASM_WRITTEN (decl));
 
-  if (TREE_ASM_WRITTEN (decl))
-    return false;
+  if (TREE_PUBLIC (decl) || DECL_EXTERNAL (decl))
+    {
+      symtab_node *snode;
+
+      /* We cannot change alignment of symbols that may bind to symbols
+        in other translation unit that may contain a definition with lower
+        alignment.  */
+      if (!decl_binds_to_current_def_p (decl))
+       return false;
+
+      /* When compiling partition, be sure the symbol is not output by other
+        partition.  */
+      snode = symtab_get_node (decl);
+      if (flag_ltrans
+         && (snode->in_other_partition
+             || symtab_get_symbol_partitioning_class (snode) == SYMBOL_DUPLICATE))
+       return false;
+    }
 
   /* Do not override the alignment as specified by the ABI when the used
      attribute is set.  */
@@ -5343,6 +5351,18 @@ vect_can_force_dr_alignment_p (const_tree decl, unsigned int alignment)
       && !symtab_get_node (decl)->implicit_section)
     return false;
 
+  /* If symbol is an alias, we need to check that target is OK.  */
+  if (TREE_STATIC (decl))
+    {
+      tree target = symtab_alias_ultimate_target (symtab_get_node (decl))->decl;
+      if (target != decl)
+       {
+         if (DECL_PRESERVE_P (target))
+           return false;
+         decl = target;
+       }
+    }
+
   if (TREE_STATIC (decl))
     return (alignment <= MAX_OFILE_ALIGNMENT);
   else
index 8f5f2d662512488e2b4a3d257f37e13b531837a8..e2939b18ffce5ee40bf8e10ec966ebf0f025e8a2 100644 (file)
@@ -686,6 +686,12 @@ increase_alignment (void)
         {
           DECL_ALIGN (decl) = TYPE_ALIGN (vectype);
           DECL_USER_ALIGN (decl) = 1;
+         if (TREE_STATIC (decl))
+           {
+             tree target = symtab_alias_ultimate_target (symtab_get_node (decl))->decl;
+              DECL_ALIGN (target) = TYPE_ALIGN (vectype);
+              DECL_USER_ALIGN (target) = 1;
+           }
           dump_printf (MSG_NOTE, "Increasing alignment of decl: ");
           dump_generic_expr (MSG_NOTE, TDF_SLIM, decl);
           dump_printf (MSG_NOTE, "\n");