tree-vect-data-refs.c (vect_can_force_dr_alignment_p): Reorg to use symtab and decl_binds_to_current_def_p
* 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
This commit is contained in:
parent
9cf32741aa
commit
6ad386b725
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue