re PR lto/50494 (gcc.dg/vect/vect-reduc-2char.c fails spuriously on ppc with -flto)
authorRichard Biener <rguenther@suse.de>
Wed, 6 Mar 2013 08:38:46 +0000 (08:38 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 6 Mar 2013 08:38:46 +0000 (08:38 +0000)
2013-03-06  Richard Biener  <rguenther@suse.de>

PR middle-end/50494
* tree-vect-data-refs.c (vect_can_force_dr_alignment_p):
Do not adjust alignment of DECL_IN_CONSTANT_POOL decls.

Revert
2013-02-13  Richard Biener  <rguenther@suse.de>

PR lto/50494
* varasm.c (output_constant_def_1): Get the decl representing
the constant as argument.
(output_constant_def): Wrap output_constant_def_1.
(make_decl_rtl): Use output_constant_def_1 with the decl
representing the constant.
(build_constant_desc): Optionally re-use a decl already
representing the constant.
(tree_output_constant_def): Adjust.

From-SVN: r196487

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

index b8473b0825ed7c65a2a65ad1f0f64a9c0fc2d58f..3bb0520f00f13ad0ede5b9e4a7ebdd5af22683fa 100644 (file)
@@ -1,3 +1,22 @@
+2013-03-06  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/50494
+       * tree-vect-data-refs.c (vect_can_force_dr_alignment_p):
+       Do not adjust alignment of DECL_IN_CONSTANT_POOL decls.
+
+       Revert
+       2013-02-13  Richard Biener  <rguenther@suse.de>
+
+       PR lto/50494
+       * varasm.c (output_constant_def_1): Get the decl representing
+       the constant as argument.
+       (output_constant_def): Wrap output_constant_def_1.
+       (make_decl_rtl): Use output_constant_def_1 with the decl
+       representing the constant.
+       (build_constant_desc): Optionally re-use a decl already
+       representing the constant.
+       (tree_output_constant_def): Adjust.
+
 2013-03-06  Joey Ye  <joey.ye@arm.com>
 
        PR lto/50293
index fe009acac976835c8dee35fbb28900cdac5f7f04..fdb73c3212b038b53303009ffb59fb63fe870101 100644 (file)
@@ -4829,9 +4829,12 @@ vect_can_force_dr_alignment_p (const_tree decl, unsigned int alignment)
   /* 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.  */
+     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_COMMON (decl)
+      || DECL_IN_CONSTANT_POOL (decl))
     return false;
 
   if (TREE_ASM_WRITTEN (decl))
index 98a29ff407f92ed3b020bb54f19da1423d6fc248..66481031022c48635db28d05f17d4b70439a112d 100644 (file)
@@ -126,7 +126,6 @@ static void asm_output_aligned_bss (FILE *, tree, const char *,
 #endif /* BSS_SECTION_ASM_OP */
 static void mark_weak (tree);
 static void output_constant_pool (const char *, tree);
-static rtx output_constant_def_1 (tree, tree, int);
 \f
 /* Well-known sections, each one associated with some sort of *_ASM_OP.  */
 section *text_section;
@@ -1187,8 +1186,7 @@ make_decl_rtl (tree decl)
      pre-computed RTL or recompute it in LTO mode.  */
   if (TREE_CODE (decl) == VAR_DECL && DECL_IN_CONSTANT_POOL (decl))
     {
-      SET_DECL_RTL (decl, output_constant_def_1 (DECL_INITIAL (decl),
-                                                decl, 1));
+      SET_DECL_RTL (decl, output_constant_def (DECL_INITIAL (decl), 1));
       return;
     }
 
@@ -3075,16 +3073,16 @@ get_constant_size (tree exp)
    Make a constant descriptor to enter EXP in the hash table.
    Assign the label number and construct RTL to refer to the
    constant's location in memory.
-   If DECL is non-NULL use it as VAR_DECL associated with the constant.
    Caller is responsible for updating the hash table.  */
 
 static struct constant_descriptor_tree *
-build_constant_desc (tree exp, tree decl)
+build_constant_desc (tree exp)
 {
   struct constant_descriptor_tree *desc;
   rtx symbol, rtl;
   char label[256];
   int labelno;
+  tree decl;
 
   desc = ggc_alloc_constant_descriptor_tree ();
   desc->value = copy_constant (exp);
@@ -3098,32 +3096,28 @@ build_constant_desc (tree exp, tree decl)
   ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno);
 
   /* Construct the VAR_DECL associated with the constant.  */
-  if (decl == NULL_TREE)
-    {
-      decl = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (label),
-                        TREE_TYPE (exp));
-      DECL_ARTIFICIAL (decl) = 1;
-      DECL_IGNORED_P (decl) = 1;
-      TREE_READONLY (decl) = 1;
-      TREE_STATIC (decl) = 1;
-      TREE_ADDRESSABLE (decl) = 1;
-      /* We don't set the RTL yet as this would cause varpool to assume that
-        the variable is referenced.  Moreover, it would just be dropped in
-        LTO mode.  Instead we set the flag that will be recognized in
-        make_decl_rtl.  */
-      DECL_IN_CONSTANT_POOL (decl) = 1;
-      DECL_INITIAL (decl) = desc->value;
-      /* ??? CONSTANT_ALIGNMENT hasn't been updated for vector types on most
-        architectures so use DATA_ALIGNMENT as well, except for strings.  */
-      if (TREE_CODE (exp) == STRING_CST)
-       {
+  decl = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (label),
+                    TREE_TYPE (exp));
+  DECL_ARTIFICIAL (decl) = 1;
+  DECL_IGNORED_P (decl) = 1;
+  TREE_READONLY (decl) = 1;
+  TREE_STATIC (decl) = 1;
+  TREE_ADDRESSABLE (decl) = 1;
+  /* We don't set the RTL yet as this would cause varpool to assume that the
+     variable is referenced.  Moreover, it would just be dropped in LTO mode.
+     Instead we set the flag that will be recognized in make_decl_rtl.  */
+  DECL_IN_CONSTANT_POOL (decl) = 1;
+  DECL_INITIAL (decl) = desc->value;
+  /* ??? CONSTANT_ALIGNMENT hasn't been updated for vector types on most
+     architectures so use DATA_ALIGNMENT as well, except for strings.  */
+  if (TREE_CODE (exp) == STRING_CST)
+    {
 #ifdef CONSTANT_ALIGNMENT
-         DECL_ALIGN (decl) = CONSTANT_ALIGNMENT (exp, DECL_ALIGN (decl));
+      DECL_ALIGN (decl) = CONSTANT_ALIGNMENT (exp, DECL_ALIGN (decl));
 #endif
-       }
-      else
-       align_variable (decl, 0);
     }
+  else
+    align_variable (decl, 0);
 
   /* Now construct the SYMBOL_REF and the MEM.  */
   if (use_object_blocks_p ())
@@ -3160,7 +3154,7 @@ build_constant_desc (tree exp, tree decl)
 }
 
 /* Return an rtx representing a reference to constant data in memory
-   for the constant expression EXP with the associated DECL.
+   for the constant expression EXP.
 
    If assembler code for such a constant has already been output,
    return an rtx to refer to it.
@@ -3172,8 +3166,8 @@ build_constant_desc (tree exp, tree decl)
 
    `const_desc_table' records which constants already have label strings.  */
 
-static rtx
-output_constant_def_1 (tree exp, tree decl, int defer)
+rtx
+output_constant_def (tree exp, int defer)
 {
   struct constant_descriptor_tree *desc;
   struct constant_descriptor_tree key;
@@ -3188,7 +3182,7 @@ output_constant_def_1 (tree exp, tree decl, int defer)
   desc = (struct constant_descriptor_tree *) *loc;
   if (desc == 0)
     {
-      desc = build_constant_desc (exp, decl);
+      desc = build_constant_desc (exp);
       desc->hash = key.hash;
       *loc = desc;
     }
@@ -3197,15 +3191,6 @@ output_constant_def_1 (tree exp, tree decl, int defer)
   return desc->rtl;
 }
 
-/* Like output_constant_def but create a new decl representing the
-   constant if necessary.  */
-
-rtx
-output_constant_def (tree exp, int defer)
-{
-  return output_constant_def_1 (exp, NULL_TREE, defer);
-}
-
 /* Subroutine of output_constant_def: Decide whether or not we need to
    output the constant DESC now, and if so, do it.  */
 static void
@@ -3342,7 +3327,7 @@ tree_output_constant_def (tree exp)
   desc = (struct constant_descriptor_tree *) *loc;
   if (desc == 0)
     {
-      desc = build_constant_desc (exp, NULL_TREE);
+      desc = build_constant_desc (exp);
       desc->hash = key.hash;
       *loc = desc;
     }