summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2013-03-06 08:38:46 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2013-03-06 08:38:46 +0000
commit90a674ebdf23f03210ef377b9e2e5d7cde19ab18 (patch)
tree0c0d6fed824666c1b5d24f35a6c17f5c48e0c057
parente4182cc9142fbf73e3d37deb4fd6eb113b65d899 (diff)
downloadgcc-90a674ebdf23f03210ef377b9e2e5d7cde19ab18.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@196487 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog19
-rw-r--r--gcc/tree-vect-data-refs.c7
-rw-r--r--gcc/varasm.c69
3 files changed, 51 insertions, 44 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b8473b0825e..3bb0520f00f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index fe009acac97..fdb73c3212b 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -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))
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 98a29ff407f..66481031022 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -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);
/* 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;
}