aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2014-06-13 00:16:25 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2014-06-12 22:16:25 +0000
commit6ad386b725dfac340e0d337d4c20e603929c7f9a (patch)
tree6dbb35f6f6e7f5434f361ca39916bbb65bf16611
parent9cf32741aabefe8fa90bad887b694dbf7ad29726 (diff)
downloadgcc-6ad386b725dfac340e0d337d4c20e603929c7f9a.zip
gcc-6ad386b725dfac340e0d337d4c20e603929c7f9a.tar.gz
gcc-6ad386b725dfac340e0d337d4c20e603929c7f9a.tar.bz2
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/tree-vect-data-refs.c44
-rw-r--r--gcc/tree-vectorizer.c6
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 <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
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");