varasm: Propagate litpool decl alignment to generated RTX.
authorAndreas Krebbel <krebbel@linux.vnet.ibm.com>
Thu, 22 Dec 2016 14:50:29 +0000 (14:50 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Thu, 22 Dec 2016 14:50:29 +0000 (14:50 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/litpool-str-1.c [new file with mode: 0644]
gcc/varasm.c

index f3f3816f45789d8b6a345a06ccea13b48144d007..64f7b88d3adeded1ae168291dfed049bfaf32e28 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        * config/s390/s390-c.c (s390_cpu_cpp_builtins_internal): Define
index 1532f18651c31593bbae74f6f08324c3b47343ee..368f7eaceb164dcff8cc7695c8d1f1fa8f7f373e 100644 (file)
@@ -1,3 +1,7 @@
+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>
 
        * gcc.target/s390/md/setmem_long-1.c: Use "s390_useable_hw".
diff --git a/gcc/testsuite/gcc.target/s390/litpool-str-1.c b/gcc/testsuite/gcc.target/s390/litpool-str-1.c
new file mode 100644 (file)
index 0000000..cd921d2
--- /dev/null
@@ -0,0 +1,22 @@
+/* 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" } } */
index 5b158472fc6804b80f1eaaa8dfe2bcf07402062e..75d5ad6842d4d68f6d3102d21077d4fee348e85b 100644 (file)
@@ -3296,6 +3296,10 @@ build_constant_desc (tree exp)
   set_mem_attributes (rtl, exp, 1);
   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.
      Mark this piece of RTL as required for unsharing.  */
   RTX_FLAG (rtl, used) = 1;