This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] varasm: Propagate litpool decl alignment to generated RTX.
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Andreas Krebbel <krebbel at linux dot vnet dot ibm dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 20 Dec 2016 11:38:49 +0100
- Subject: Re: [PATCH] varasm: Propagate litpool decl alignment to generated RTX.
- Authentication-results: sourceware.org; auth=none
- References: <20161216202922.14425-1-krebbel@linux.vnet.ibm.com>
On Fri, Dec 16, 2016 at 9:29 PM, Andreas Krebbel
<krebbel@linux.vnet.ibm.com> wrote:
> 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.
And it might be even smaller alignment... or do we not allow that?
> 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.
>
> Another question is why (at the end of build_constant_desc) we invoke
> the encode_section_info hook with the original expression instead of
> the newly generated var_decl? I think the hook is supposed to be
> invoked with a decl?!
No idea...
> /* Set flags or add text to the name to record information, such as
> that it is a local symbol. If the name is changed, the macro
> ASM_OUTPUT_LABELREF will have to know how to strip this
> information. This call might invalidate our local variable
> SYMBOL; we can't use it afterward. */
> targetm.encode_section_info (exp, rtl, true);
>
> desc->rtl = rtl;
>
> return desc;
> }
>
> Bootstrapped and regtested on x86_64 and s390x.
>
> No regressions.
>
> Ok?
Ok.
Richard.
> -Andreas-
>
> gcc/ChangeLog:
>
> 2016-12-16 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-16 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
>
> * gcc.target/s390/litpool-str-1.c: New test.
> ---
> gcc/testsuite/gcc.target/s390/litpool-str-1.c | 22 ++++++++++++++++++++++
> gcc/varasm.c | 4 ++++
> 2 files changed, 26 insertions(+)
> create mode 100644 gcc/testsuite/gcc.target/s390/litpool-str-1.c
>
> 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
> index 0000000..cd921d2
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/s390/litpool-str-1.c
> @@ -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" } } */
> diff --git a/gcc/varasm.c b/gcc/varasm.c
> index 5b15847..68a7ba2 100644
> --- a/gcc/varasm.c
> +++ b/gcc/varasm.c
> @@ -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 larger
> + 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;
> --
> 2.9.1
>