On Thu, Jun 5, 2025 at 11:39 PM Richard Biener
<[email protected]> wrote:
>
> On Fri, Jun 6, 2025 at 12:14 AM Andrew Pinski <[email protected]>
> wrote:
> >
> > Currently we expand `{}` and store zeros to the stack and then do a full
> > mode load back. This is a waste, instead we should just use the zero cst
> > in the mode that fits the bitsize.
> >
> > Boostrapped and tested on x86_64-linux-gnu.
> > Build and tested for aarch64-linux-gnu.
>
> Huh, why can't we do this from expand_normal ({})?
So the problem is the mode in this case is BLKmode as the type is
`char[3]`. (maybe size of 5/6/7 will cause issues too).
Let me see if I could move this to expand_normal, I am not 100% sure
if the mode mismatch will cause issues elsewhere though; here it is
safe though.
Thanks,
Andrew Pinski
>
> > PR middle-end/110459
> > gcc/ChangeLog:
> >
> > * expr.cc (store_field): For `{}` exp where bitsize is known
> > to be less than BITS_PER_WORD, use zero cst.
> >
> > gcc/testsuite/ChangeLog:
> >
> > * g++.target/aarch64/array-return-1.C: New test.
> > * g++.target/i386/array-return-1.C: New test.
> >
> > Signed-off-by: Andrew Pinski <[email protected]>
> > ---
> > gcc/expr.cc | 10 ++++++++-
> > .../g++.target/aarch64/array-return-1.C | 22 +++++++++++++++++++
> > .../g++.target/i386/array-return-1.C | 20 +++++++++++++++++
> > 3 files changed, 51 insertions(+), 1 deletion(-)
> > create mode 100644 gcc/testsuite/g++.target/aarch64/array-return-1.C
> > create mode 100644 gcc/testsuite/g++.target/i386/array-return-1.C
> >
> > diff --git a/gcc/expr.cc b/gcc/expr.cc
> > index 1eeefa1cadc..af03809cad8 100644
> > --- a/gcc/expr.cc
> > +++ b/gcc/expr.cc
> > @@ -8243,7 +8243,15 @@ store_field (rtx target, poly_int64 bitsize,
> > poly_int64 bitpos,
> > }
> > }
> >
> > - temp = expand_normal (exp);
> > + if (TREE_CODE (exp) == CONSTRUCTOR
> > + && CONSTRUCTOR_NELTS (exp) == 0
> > + && known_le (bitsize, BITS_PER_WORD))
> > + {
> > + machine_mode temp_mode = smallest_int_mode_for_size
> > (bitsize).require ();
> > + temp = CONST0_RTX (temp_mode);
> > + }
> > + else
> > + temp = expand_normal (exp);
> >
> > /* We don't support variable-sized BLKmode bitfields, since our
> > handling of BLKmode is bound up with the ability to break
> > diff --git a/gcc/testsuite/g++.target/aarch64/array-return-1.C
> > b/gcc/testsuite/g++.target/aarch64/array-return-1.C
> > new file mode 100644
> > index 00000000000..7c0aa480775
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.target/aarch64/array-return-1.C
> > @@ -0,0 +1,22 @@
> > +// { dg-do compile }
> > +// { dg-options "-O2" }
> > +// { dg-final { check-function-bodies "**" "" "" { target { le } } } }
> > +
> > +// PR middle-end/110459
> > +
> > +/*
> > +**_Z7sample2c:
> > +** and w0, w0, 255
> > +** ret
> > +*/
> > +
> > +struct array {
> > + char data[4];
> > +};
> > +
> > +// There should be no adjustment to the stack
> > +// { dg-final { scan-assembler-not "sp, sp," } }
> > +auto sample2(char c) {
> > + array buffer = {c, 0, 0, 0};
> > + return buffer;
> > +}
> > diff --git a/gcc/testsuite/g++.target/i386/array-return-1.C
> > b/gcc/testsuite/g++.target/i386/array-return-1.C
> > new file mode 100644
> > index 00000000000..f11905d01e5
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.target/i386/array-return-1.C
> > @@ -0,0 +1,20 @@
> > +// { dg-do compile }
> > +// { dg-options "-O2" }
> > +// { dg-final { check-function-bodies "**" "" "" { target { ! ia32 } } } }
> > +
> > +// PR middle-end/110459
> > +
> > +/*
> > +**_Z7sample2c:
> > +** movzbl %dil, %eax
> > +** ret
> > +*/
> > +
> > +struct array {
> > + char data[4];
> > +};
> > +
> > +array sample2(char c) {
> > + array buffer = {c, 0, 0, 0};
> > + return buffer;
> > +}
> > --
> > 2.43.0
> >