On Tue, Aug 12, 2025 at 10:14 AM Richard Sandiford <richard.sandif...@arm.com> wrote: > > For the reasons explained in the comment, fwprop shouldn't even > try to propagate an asm definition. > > Tested on aarch64-linux-gnu. Bordering on obvious, but just in case: > OK to install?
OK. Richard. > Richard > > > gcc/ > PR rtl-optimization/121253 > * fwprop.cc (forward_propagate_into): Don't propagate asm defs. > > gcc/testsuite/ > PR rtl-optimization/121253 > * gcc.target/aarch64/pr121253.c: New test. > --- > gcc/fwprop.cc | 14 ++++++++++++++ > gcc/testsuite/gcc.target/aarch64/pr121253.c | 16 ++++++++++++++++ > 2 files changed, 30 insertions(+) > create mode 100644 gcc/testsuite/gcc.target/aarch64/pr121253.c > > diff --git a/gcc/fwprop.cc b/gcc/fwprop.cc > index 4ee44adcde2..59df7cad0de 100644 > --- a/gcc/fwprop.cc > +++ b/gcc/fwprop.cc > @@ -836,6 +836,20 @@ forward_propagate_into (use_info *use, bool > reg_prop_only = false) > if (def_insn->is_artificial ()) > return false; > > + /* Do not propagate asms. The only kind of propagation that would > + succeed is propagation into a register move. Such a propagation > + is neutral if the destination of the move is a pseudo and unnecessarily > + restricts the register allocator if the destination of the move is > + a hard register. > + > + Furthermore, unlike for a normal instruction, we cannot take a SET from > an > + asm and try dropping the CLOBBERs. The recog process does not (and > should > + not try to) second-guess whether what the user wrote can be changed and > + so it has to assume that any asm given to it is a fair reflection of > + what the user wrote. */ > + if (def_insn->is_asm ()) > + return false; > + > rtx_insn *def_rtl = def_insn->rtl (); > if (!NONJUMP_INSN_P (def_rtl)) > return false; > diff --git a/gcc/testsuite/gcc.target/aarch64/pr121253.c > b/gcc/testsuite/gcc.target/aarch64/pr121253.c > new file mode 100644 > index 00000000000..37de605c646 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/pr121253.c > @@ -0,0 +1,16 @@ > +/* { dg-options "-O" } */ > + > +struct s128 { > + long a, b; > +}; > + > +struct s128 foo(void) { > + struct s128 ret; > + asm("mov %0, #0 \n\t" > + "mov %R0, #0 \n\t" > + "mov x0, #12345" > + : "=r" (ret) : : "x0"); > + return ret; > +} > + > +/* { dg-final { scan-assembler-not {mov x0, #0} } } */ > -- > 2.43.0 >