[PATCH] match.pd: Use single_use for (T)(A) + CST -> (T)(A + CST) [PR95798]
Richard Biener
rguenther@suse.de
Thu Feb 25 09:13:06 GMT 2021
On Thu, 25 Feb 2021, Jakub Jelinek wrote:
> On Wed, Feb 24, 2021 at 08:56:55PM +0100, Jakub Jelinek via Gcc-patches wrote:
> > On Wed, Feb 24, 2021 at 08:52:44PM +0100, Marc Glisse wrote:
> > > On Wed, 24 Feb 2021, Jakub Jelinek via Gcc-patches wrote:
> > >
> > > > The following patch adds single_use case which restores these testcases
> > > > but keeps the testcases the patch meant to improve as is.
> > >
> > > Hello,
> > >
> > > I wonder if :s would be sufficient here? I don't have an opinion on which
> > > one is better for this particular transformation (don't change the patch
> > > because of my comment), we just seem to be getting more and more uses of
> > > single_use in match.pd, maybe at some point we need to revisit the meaning
> > > of :s or introduce a stronger :S.
> >
> > :s seems to work for these testcases too, I'm never sure about :s
> > vs. single_use.
>
> Following passed bootstrap/regtest on x86_64-linux and i686-linux too.
OK.
Thanks,
Richard.
> 2021-02-24 Jakub Jelinek <jakub@redhat.com>
>
> PR target/95798
> * match.pd ((T)(A) + CST -> (T)(A + CST)): Add :s to convert.
>
> * gcc.target/i386/pr95798-1.c: New test.
> * gcc.target/i386/pr95798-2.c: New test.
>
> --- gcc/match.pd.jj 2021-02-24 12:58:22.233006845 +0100
> +++ gcc/match.pd 2021-02-24 20:54:41.970241132 +0100
> @@ -2492,7 +2492,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> /* ((T)(A)) + CST -> (T)(A + CST) */
> #if GIMPLE
> (simplify
> - (plus (convert SSA_NAME@0) INTEGER_CST@1)
> + (plus (convert:s SSA_NAME@0) INTEGER_CST@1)
> (if (TREE_CODE (TREE_TYPE (@0)) == INTEGER_TYPE
> && TREE_CODE (type) == INTEGER_TYPE
> && TYPE_PRECISION (type) > TYPE_PRECISION (TREE_TYPE (@0))
> --- gcc/testsuite/gcc.target/i386/pr95798-1.c.jj 2021-02-24 15:58:06.935598077 +0100
> +++ gcc/testsuite/gcc.target/i386/pr95798-1.c 2021-02-24 16:02:47.298504500 +0100
> @@ -0,0 +1,29 @@
> +/* PR target/95798 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -masm=att" } */
> +/* { dg-final { scan-assembler "1, 8\\\(%rsp,%r\[a-z0-9]*,8\\\)" { target lp64 } } } */
> +/* { dg-final { scan-assembler "2, 16\\\(%rsp,%r\[a-z0-9]*,8\\\)" { target lp64 } } } */
> +/* { dg-final { scan-assembler "3, 24\\\(%rsp,%r\[a-z0-9]*,8\\\)" { target lp64 } } } */
> +/* { dg-final { scan-assembler "4, 32\\\(%rsp,%r\[a-z0-9]*,8\\\)" { target lp64 } } } */
> +/* { dg-final { scan-assembler "5, 40\\\(%rsp,%r\[a-z0-9]*,8\\\)" { target lp64 } } } */
> +/* { dg-final { scan-assembler "6, 48\\\(%rsp,%r\[a-z0-9]*,8\\\)" { target lp64 } } } */
> +/* { dg-final { scan-assembler "7, 56\\\(%rsp,%r\[a-z0-9]*,8\\\)" { target lp64 } } } */
> +
> +void bar (unsigned long long *, int);
> +
> +void
> +foo (int y, unsigned long long z)
> +{
> + unsigned long long x[1024];
> + unsigned long long i = y % 127;
> + __builtin_memset (x, -1, sizeof (x));
> + x[i] = 0;
> + x[i + 1] = 1;
> + x[i + 2] = 2;
> + x[i + 3] = 3;
> + x[i + 4] = 4;
> + x[i + 5] = 5;
> + x[i + 6] = 6;
> + x[i + 7] = 7;
> + bar (x, y);
> +}
> --- gcc/testsuite/gcc.target/i386/pr95798-2.c.jj 2021-02-24 16:01:39.708250302 +0100
> +++ gcc/testsuite/gcc.target/i386/pr95798-2.c 2021-02-24 16:03:57.497729907 +0100
> @@ -0,0 +1,29 @@
> +/* PR target/95798 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -masm=att" } */
> +/* { dg-final { scan-assembler "1, 8\\\(%rsp,%r\[a-z0-9]*,8\\\)" { target lp64 } } } */
> +/* { dg-final { scan-assembler "2, 16\\\(%rsp,%r\[a-z0-9]*,8\\\)" { target lp64 } } } */
> +/* { dg-final { scan-assembler "3, 24\\\(%rsp,%r\[a-z0-9]*,8\\\)" { target lp64 } } } */
> +/* { dg-final { scan-assembler "4, 32\\\(%rsp,%r\[a-z0-9]*,8\\\)" { target lp64 } } } */
> +/* { dg-final { scan-assembler "5, 40\\\(%rsp,%r\[a-z0-9]*,8\\\)" { target lp64 } } } */
> +/* { dg-final { scan-assembler "6, 48\\\(%rsp,%r\[a-z0-9]*,8\\\)" { target lp64 } } } */
> +/* { dg-final { scan-assembler "7, 56\\\(%rsp,%r\[a-z0-9]*,8\\\)" { target lp64 } } } */
> +
> +void bar (unsigned long long *, int);
> +
> +void
> +foo (unsigned int y, unsigned long long z)
> +{
> + unsigned long long x[1024];
> + unsigned long long i = y % 127;
> + __builtin_memset (x, -1, sizeof (x));
> + x[i] = 0;
> + x[i + 1] = 1;
> + x[i + 2] = 2;
> + x[i + 3] = 3;
> + x[i + 4] = 4;
> + x[i + 5] = 5;
> + x[i + 6] = 6;
> + x[i + 7] = 7;
> + bar (x, y);
> +}
>
> Jakub
>
>
--
Richard Biener <rguenther@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)
More information about the Gcc-patches
mailing list