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:
Jan Hubicka 2014-06-13 00:16:25 +02:00 committed by Jan Hubicka
parent 9cf32741aa
commit 6ad386b725
3 changed files with 45 additions and 12 deletions

View 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

View 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

View 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");