+JiangNing Liu

On Wed, 29 Jan 2025 at 10:38, Richard Biener <rguent...@suse.de> wrote:
>
> On Wed, 29 Jan 2025, Christoph Müllner wrote:
>
> > The avoid-store-forwarding pass is disabled by default and therefore
> > in the risk of bit-rotting.  This patch addresses this by enabling
> > the pass at O2 or higher.
> >
> > The assembly patterns in `bitfield-bitint-abi-align16.c` and
> > `bitfield-bitint-abi-align8.c` have been updated to account for
> > the ASF transformations.
> >
> > This was bootstrapped on x86-64 and AArch64 and showed no
> > regressions in the test suite (--enable-checking=yes,extra and
> > all languages).
>
> OK for GCC 16 stage1.
>
> Richard.
>
> > gcc/ChangeLog:
> >
> >       * doc/invoke.texi: Document asf as an O2 enabled option.
> >       * opts.cc: Enable asf at O2.
> >
> > gcc/testsuite/ChangeLog:
> >
> >       * gcc.target/aarch64/bitfield-bitint-abi-align16.c:
> >       Modify testcases to account for the asf transformations.
> >       * gcc.target/aarch64/bitfield-bitint-abi-align8.c: Likewise.
> >       * gcc.target/aarch64/avoid-store-forwarding-6.c: New test.
> >
> > Co-developed-by: Konstantinos Eleftheriou 
> > <konstantinos.elefther...@vrull.eu>
> > Signed-off-by: Christoph Müllner <christoph.muell...@vrull.eu>
> > ---
> >  gcc/doc/invoke.texi                           |  3 +-
> >  gcc/opts.cc                                   |  1 +
> >  .../aarch64/avoid-store-forwarding-6.c        | 29 +++++++++++++++++++
> >  .../aarch64/bitfield-bitint-abi-align16.c     | 28 ++++++++++--------
> >  .../aarch64/bitfield-bitint-abi-align8.c      | 28 ++++++++++--------
> >  5 files changed, 64 insertions(+), 25 deletions(-)
> >  create mode 100644 
> > gcc/testsuite/gcc.target/aarch64/avoid-store-forwarding-6.c
> >
> > diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> > index dddde54a287..52d0489ab24 100644
> > --- a/gcc/doc/invoke.texi
> > +++ b/gcc/doc/invoke.texi
> > @@ -12716,6 +12716,7 @@ also turns on the following optimization flags:
> >  @c Please keep the following list alphabetized!
> >  @gccoptlist{-falign-functions  -falign-jumps
> >  -falign-labels  -falign-loops
> > +-favoid-store-forwarding
> >  -fcaller-saves
> >  -fcode-hoisting
> >  -fcrossjumping
> > @@ -12876,7 +12877,7 @@ Many CPUs will stall for many cycles when a load 
> > partially depends on previous
> >  smaller stores.  This pass tries to detect such cases and avoid the 
> > penalty by
> >  changing the order of the load and store and then fixing up the loaded 
> > value.
> >
> > -Disabled by default.
> > +Enabled by default at @option{-O2} and higher.
> >
> >  @opindex ffp-contract
> >  @item -ffp-contract=@var{style}
> > diff --git a/gcc/opts.cc b/gcc/opts.cc
> > index 23900c7b1c0..9914d20ad47 100644
> > --- a/gcc/opts.cc
> > +++ b/gcc/opts.cc
> > @@ -627,6 +627,7 @@ static const struct default_options 
> > default_options_table[] =
> >      { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_sra, NULL, 1 },
> >
> >      /* -O2 and -Os optimizations.  */
> > +    { OPT_LEVELS_2_PLUS, OPT_favoid_store_forwarding, NULL, 1 },
> >      { OPT_LEVELS_2_PLUS, OPT_fcaller_saves, NULL, 1 },
> >      { OPT_LEVELS_2_PLUS, OPT_fcode_hoisting, NULL, 1 },
> >      { OPT_LEVELS_2_PLUS, OPT_fcrossjumping, NULL, 1 },
> > diff --git a/gcc/testsuite/gcc.target/aarch64/avoid-store-forwarding-6.c 
> > b/gcc/testsuite/gcc.target/aarch64/avoid-store-forwarding-6.c
> > new file mode 100644
> > index 00000000000..320fa5e101e
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/aarch64/avoid-store-forwarding-6.c
> > @@ -0,0 +1,29 @@
> > +/* { dg-do compile } */
> > +/* { dg-options "-O2" } */
> > +
> > +/* Same as avoid-store-forwarding-1.c but without 
> > -favoid-store-forwarding.  */
> > +
> > +typedef union {
> > +    char arr_8[8];
> > +    long long_value;
> > +} DataUnion;
> > +
> > +long ssll_1 (DataUnion *data, char x)
> > +{
> > +  data->arr_8[0] = x;
> > +  return data->long_value;
> > +}
> > +
> > +long ssll_2 (DataUnion *data, char x)
> > +{
> > +  data->arr_8[1] = x;
> > +  return data->long_value;
> > +}
> > +
> > +long ssll_3 (DataUnion *data, char x)
> > +{
> > +  data->arr_8[7] = x;
> > +  return data->long_value;
> > +}
> > +
> > +/* { dg-final { scan-assembler-times {ldr\tx[0-9]+, 
> > \[x[0-9]+\]\n\tstrb\tw[0-9]+, \[x[0-9]+(, \d+)?\]\n\tbfi\tx[0-9]+, x[0-9]+, 
> > \d+, \d+} 3 } } */
> > diff --git a/gcc/testsuite/gcc.target/aarch64/bitfield-bitint-abi-align16.c 
> > b/gcc/testsuite/gcc.target/aarch64/bitfield-bitint-abi-align16.c
> > index c29a230a771..b4501d81c45 100644
> > --- a/gcc/testsuite/gcc.target/aarch64/bitfield-bitint-abi-align16.c
> > +++ b/gcc/testsuite/gcc.target/aarch64/bitfield-bitint-abi-align16.c
> > @@ -91,10 +91,11 @@
> >  **   mov     (w[0-9]+), 0
> >  **   bfi     \3, w\2, 0, 1
> >  **   and     x3, x\2, 9223372036854775807
> > -**   mov     x2, 0
> > +**   mov     (x[0-9]+), 0
> > +**   bfi     \4, (x[0-9]+), 0, 8
> >  **   str     xzr, \[sp\]
> >  **   strb    \3, \[sp\]
> > -**   ldr     x1, \[sp\]
> > +**   mov     \5, 0
> >  **   add     sp, sp, 16
> >  **   b       fp
> >  */
> > @@ -183,19 +184,21 @@
> >  **   sxtw    (x[0-9]+), w1
> >  **   mov     x0, \2
> >  **   and     x7, \2, 9223372036854775807
> > +**   mov     (x[0-9]+), 0
> >  **   mov     (w[0-9]+), 0
> > -**   bfi     \3, w\1, 0, 1
> > +**   bfi     \4, w\1, 0, 1
> > +**   mov     (x[0-9]+), \3
> > +**   bfi     \5, (x[0-9]+), 0, 8
> > +**   stp     x7, \5, \[sp\]
> >  **   strb    wzr, \[sp, 16\]
> >  **   mov     x6, x7
> >  **   mov     x5, x7
> >  **   mov     x4, x7
> > -**   mov     x3, x7
> > -**   mov     x2, x7
> > -**   str     xzr, \[sp, 48\]
> > -**   strb    \3, \[sp, 48\]
> > -**   ldr     (x[0-9]+), \[sp, 48\]
> > -**   stp     x7, \4, \[sp\]
> > -**   mov     x1, x7
> > +**   mov     \5, x7
> > +**   str     \3, \[sp, 48\]
> > +**   strb    \4, \[sp, 48\]
> > +**   mov     \3, x7
> > +**   mov     \6, x7
> >  **   bl      fp_stack
> >  **   sbfx    x0, x0, 0, 63
> >  **...
> > @@ -343,10 +346,11 @@
> >  **   mov     w0, w1
> >  **   mov     (w[0-9]+), 0
> >  **   bfi     \2, w\1, 0, 1
> > -**   mov     x2, 0
> > +**   mov     (x[0-9]+), 0
> > +**   bfi     \3, (x[0-9]+), 0, 8
> >  **   str     xzr, \[sp\]
> >  **   strb    \2, \[sp\]
> > -**   ldr     x1, \[sp\]
> > +**   mov     \4, 0
> >  **...
> >  **   b       fp_stdarg
> >  */
> > diff --git a/gcc/testsuite/gcc.target/aarch64/bitfield-bitint-abi-align8.c 
> > b/gcc/testsuite/gcc.target/aarch64/bitfield-bitint-abi-align8.c
> > index 13ffbf416ca..a9ac917d3a6 100644
> > --- a/gcc/testsuite/gcc.target/aarch64/bitfield-bitint-abi-align8.c
> > +++ b/gcc/testsuite/gcc.target/aarch64/bitfield-bitint-abi-align8.c
> > @@ -91,10 +91,11 @@
> >  **   mov     (w[0-9]+), 0
> >  **   bfi     \3, w\2, 0, 1
> >  **   and     x3, x\2, 9223372036854775807
> > -**   mov     x2, 0
> > +**   mov     (x[0-9]+), 0
> > +**   bfi     \4, (x[0-9]+), 0, 8
> >  **   str     xzr, \[sp\]
> >  **   strb    \3, \[sp\]
> > -**   ldr     x1, \[sp\]
> > +**   mov     \5, 0
> >  **   add     sp, sp, 16
> >  **   b       fp
> >  */
> > @@ -183,19 +184,21 @@
> >  **   sxtw    (x[0-9]+), w1
> >  **   mov     x0, \2
> >  **   and     x7, \2, 9223372036854775807
> > +**   mov     (x[0-9]+), 0
> >  **   mov     (w[0-9]+), 0
> > -**   bfi     \3, w\1, 0, 1
> > +**   bfi     \4, w\1, 0, 1
> > +**   mov     (x[0-9]+), \3
> > +**   bfi     \5, (x[0-9]+), 0, 8
> > +**   stp     x7, \5, \[sp\]
> >  **   strb    wzr, \[sp, 16\]
> >  **   mov     x6, x7
> >  **   mov     x5, x7
> >  **   mov     x4, x7
> > -**   mov     x3, x7
> > -**   mov     x2, x7
> > -**   str     xzr, \[sp, 48\]
> > -**   strb    \3, \[sp, 48\]
> > -**   ldr     (x[0-9]+), \[sp, 48\]
> > -**   stp     x7, \4, \[sp\]
> > -**   mov     x1, x7
> > +**   mov     \5, x7
> > +**   str     \3, \[sp, 48\]
> > +**   strb    \4, \[sp, 48\]
> > +**   mov     \3, x7
> > +**   mov     \6, x7
> >  **   bl      fp_stack
> >  **   sbfx    x0, x0, 0, 63
> >  **...
> > @@ -345,10 +348,11 @@
> >  **   mov     w0, w1
> >  **   mov     (w[0-9]+), 0
> >  **   bfi     \2, w\1, 0, 1
> > -**   mov     x2, 0
> > +**   mov     (x[0-9]+), 0
> > +**   bfi     \3, (x[0-9]+), 0, 8
> >  **   str     xzr, \[sp\]
> >  **   strb    \2, \[sp\]
> > -**   ldr     x1, \[sp\]
> > +**   mov     \4, 0
> >  **...
> >  **   b       fp_stdarg
> >  */
> >
>
> --
> Richard Biener <rguent...@suse.de>
> SUSE Software Solutions Germany GmbH,
> Frankenstrasse 146, 90461 Nuernberg, Germany;
> GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to