Re: [PATCH] store-merging: Match bswap64 on 32-bit targets with bswapsi2 [PR114319]

2024-03-13 Thread Richard Biener
On Wed, 13 Mar 2024, Jakub Jelinek wrote:

> Hi!
> 
> gimple-ssa-store-merging.cc tests bswap_optab in 3 different places,
> in 2 of them it has special exception for double-word bswap using pair
> of word-mode bswap optabs, but in the last one it doesn't.
> 
> The following patch changes even the last spot.
> We don't handle 128-bit bswaps in the passes at all, because currently we
> just use uint64_t to represent the byte reshuffling (we'd need to use
> offset_int or something like that instead) and we don't have
> __builtin_bswap128 nor type-generic __builtin_bswap, so there is nothing
> for 64-bit targets there.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

Thanks,
Richard.

> 2024-03-13  Jakub Jelinek  
> 
>   PR middle-end/114319
>   * gimple-ssa-store-merging.cc
>   (imm_store_chain_info::try_coalesce_bswap): For 32-bit targets
>   allow matching __builtin_bswap64 if there is bswapsi2 optab.
> 
>   * gcc.target/i386/pr114319.c: New test.
> 
> --- gcc/gimple-ssa-store-merging.cc.jj2024-01-03 11:51:29.449760086 
> +0100
> +++ gcc/gimple-ssa-store-merging.cc   2024-03-12 23:51:30.740236577 +0100
> @@ -3051,7 +3051,10 @@ imm_store_chain_info::try_coalesce_bswap
>   return false;
>case 64:
>   if (builtin_decl_explicit_p (BUILT_IN_BSWAP64)
> - && optab_handler (bswap_optab, DImode) != CODE_FOR_nothing)
> + && (optab_handler (bswap_optab, DImode) != CODE_FOR_nothing
> + || (word_mode == SImode
> + && builtin_decl_explicit_p (BUILT_IN_BSWAP32)
> + && optab_handler (bswap_optab, SImode) != 
> CODE_FOR_nothing)))
> break;
>   return false;
>default:
> --- gcc/testsuite/gcc.target/i386/pr114319.c.jj   2024-03-13 
> 10:59:57.378404934 +0100
> +++ gcc/testsuite/gcc.target/i386/pr114319.c  2024-03-13 10:59:46.612554118 
> +0100
> @@ -0,0 +1,19 @@
> +/* PR middle-end/114319 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -masm=att -mno-movbe" } */
> +/* { dg-additional-options "-march=i486" { target ia32 } } */
> +/* { dg-final { scan-assembler-times "\tbswap\t%r" 1 { target { ! ia32 } } } 
> } */
> +/* { dg-final { scan-assembler-times "\tbswap\t%\[er]" 2 { target ia32 } } } 
> */
> +
> +void
> +foo (unsigned long long x, unsigned char *y)
> +{
> +  y[0] = x >> 56;
> +  y[1] = x >> 48;
> +  y[2] = x >> 40;
> +  y[3] = x >> 32;
> +  y[4] = x >> 24;
> +  y[5] = x >> 16;
> +  y[6] = x >> 8;
> +  y[7] = x;
> +}
> 
>   Jakub
> 
> 

-- 
Richard Biener 
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)


[PATCH] store-merging: Match bswap64 on 32-bit targets with bswapsi2 [PR114319]

2024-03-13 Thread Jakub Jelinek
Hi!

gimple-ssa-store-merging.cc tests bswap_optab in 3 different places,
in 2 of them it has special exception for double-word bswap using pair
of word-mode bswap optabs, but in the last one it doesn't.

The following patch changes even the last spot.
We don't handle 128-bit bswaps in the passes at all, because currently we
just use uint64_t to represent the byte reshuffling (we'd need to use
offset_int or something like that instead) and we don't have
__builtin_bswap128 nor type-generic __builtin_bswap, so there is nothing
for 64-bit targets there.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2024-03-13  Jakub Jelinek  

PR middle-end/114319
* gimple-ssa-store-merging.cc
(imm_store_chain_info::try_coalesce_bswap): For 32-bit targets
allow matching __builtin_bswap64 if there is bswapsi2 optab.

* gcc.target/i386/pr114319.c: New test.

--- gcc/gimple-ssa-store-merging.cc.jj  2024-01-03 11:51:29.449760086 +0100
+++ gcc/gimple-ssa-store-merging.cc 2024-03-12 23:51:30.740236577 +0100
@@ -3051,7 +3051,10 @@ imm_store_chain_info::try_coalesce_bswap
return false;
   case 64:
if (builtin_decl_explicit_p (BUILT_IN_BSWAP64)
-   && optab_handler (bswap_optab, DImode) != CODE_FOR_nothing)
+   && (optab_handler (bswap_optab, DImode) != CODE_FOR_nothing
+   || (word_mode == SImode
+   && builtin_decl_explicit_p (BUILT_IN_BSWAP32)
+   && optab_handler (bswap_optab, SImode) != 
CODE_FOR_nothing)))
  break;
return false;
   default:
--- gcc/testsuite/gcc.target/i386/pr114319.c.jj 2024-03-13 10:59:57.378404934 
+0100
+++ gcc/testsuite/gcc.target/i386/pr114319.c2024-03-13 10:59:46.612554118 
+0100
@@ -0,0 +1,19 @@
+/* PR middle-end/114319 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -masm=att -mno-movbe" } */
+/* { dg-additional-options "-march=i486" { target ia32 } } */
+/* { dg-final { scan-assembler-times "\tbswap\t%r" 1 { target { ! ia32 } } } } 
*/
+/* { dg-final { scan-assembler-times "\tbswap\t%\[er]" 2 { target ia32 } } } */
+
+void
+foo (unsigned long long x, unsigned char *y)
+{
+  y[0] = x >> 56;
+  y[1] = x >> 48;
+  y[2] = x >> 40;
+  y[3] = x >> 32;
+  y[4] = x >> 24;
+  y[5] = x >> 16;
+  y[6] = x >> 8;
+  y[7] = x;
+}

Jakub