On Sat, Jun 7, 2025 at 9:32 PM Andrew Pinski <pins...@gmail.com> wrote: > > On Fri, Jun 6, 2025 at 12:02 PM Andrew Pinski <pins...@gmail.com> wrote: > > > > On Thu, Jun 5, 2025 at 11:39 PM Richard Biener > > <richard.guent...@gmail.com> wrote: > > > > > > On Fri, Jun 6, 2025 at 12:14 AM Andrew Pinski <quic_apin...@quicinc.com> > > > 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. > > I tried that https://gcc.gnu.org/pipermail/gcc-patches/2025-June/686055.html > and it worked for x86_64-linux-gnu just fine but for arm-linux-gnu it > seems like there are regressions: > https://ci.linaro.org/job/tcwg_gcc_check--master-arm-precommit/12299/artifact/artifacts/artifacts.precommit/notify/mail-body.txt > > Looks like there is an issue with const zero in this case due to > constants having VOIDmode and trying to do a subreg of that does not > work. > So currently only the above patch is the one which seems to work always.
Hmm. So how about catching this a bit earlier and use clear_storage (like expand_constructor would if given a target)? That seems to be better targeted than eventually block-moving from zero? Richard. > Thanks, > Andrew > > > > > 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 <quic_apin...@quicinc.com> > > > > --- > > > > 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 > > > >