Commit 8db9d05e by Andreas Krebbel Committed by Andreas Krebbel

varasm: Propagate litpool decl alignment to generated RTX.

When pushing a value into the literal pool the resulting decl might
get a higher alignment than the original expression depending on how a
target defines CONSTANT_ALIGNMENT.  Generating an RTX for the constant
pool access we currently use the alignment from the original
expression.  Changed with the attached patch.

This fixes a GCC 6 regression for S/390.  For arrays of string
constants as in the attached testcase encode_section_info is not able
to figure out that the constant pool slot is already properly aligned
since the mem_align field in the rtx is not set properly.

gcc/ChangeLog:

2016-12-22  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>

	* varasm.c (build_constant_desc): Use the alignment of the var
	decl instead of the original expression.

gcc/testsuite/ChangeLog:

2016-12-22  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>

	* gcc.target/s390/litpool-str-1.c: New test.

From-SVN: r243888
parent cbbb9dab
2016-12-22 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* varasm.c (build_constant_desc): Use the alignment of the var
decl instead of the original expression.
2016-12-22 Dominik Vogt <vogt@linux.vnet.ibm.com> 2016-12-22 Dominik Vogt <vogt@linux.vnet.ibm.com>
* config/s390/s390-c.c (s390_cpu_cpp_builtins_internal): Define * config/s390/s390-c.c (s390_cpu_cpp_builtins_internal): Define
2016-12-22 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* gcc.target/s390/litpool-str-1.c: New test.
2016-12-22 Dominik Vogt <vogt@linux.vnet.ibm.com> 2016-12-22 Dominik Vogt <vogt@linux.vnet.ibm.com>
* gcc.target/s390/md/setmem_long-1.c: Use "s390_useable_hw". * gcc.target/s390/md/setmem_long-1.c: Use "s390_useable_hw".
......
/* Make sure strings are recognized as being accessible through larl.
This requires the symbol ref alignment properly propagated to
encode_section_info. */
/* { dg-do compile } */
/* { dg-options "-march=z900 -O2 -fpic" } */
extern void foo(const char*, const char*, const char*);
void bar(int i)
{
const char t1[10] = "test";
const char t2[10] = "test2";
const char t3[2][10] = {
"foofoofoo",
"barbarbar",
};
foo(t1, t2, t3[i]);
}
/* { dg-final { scan-assembler-not "GOTOFF" } } */
...@@ -3296,6 +3296,10 @@ build_constant_desc (tree exp) ...@@ -3296,6 +3296,10 @@ build_constant_desc (tree exp)
set_mem_attributes (rtl, exp, 1); set_mem_attributes (rtl, exp, 1);
set_mem_alias_set (rtl, 0); set_mem_alias_set (rtl, 0);
/* Putting EXP into the literal pool might have imposed a different
alignment which should be visible in the RTX as well. */
set_mem_align (rtl, DECL_ALIGN (decl));
/* We cannot share RTX'es in pool entries. /* We cannot share RTX'es in pool entries.
Mark this piece of RTL as required for unsharing. */ Mark this piece of RTL as required for unsharing. */
RTX_FLAG (rtl, used) = 1; RTX_FLAG (rtl, used) = 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment