From 454eae94e46e60b29dd6b6e97c911294527e972e Mon Sep 17 00:00:00 2001 From: hubicka Date: Thu, 12 Jun 2014 22:16:25 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@211599 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/tree-vect-data-refs.c | 44 ++++++++++++++++++++++++++++++++------------ gcc/tree-vectorizer.c | 6 ++++++ 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6e8da45..a8dcd62 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-06-12 Jan Hubicka + + * 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 PR middle-end/61486 diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 3c5a3b3..ff02ff3 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -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 diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c index 8f5f2d6..e2939b1 100644 --- a/gcc/tree-vectorizer.c +++ b/gcc/tree-vectorizer.c @@ -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"); -- 2.7.4