Hi, on 2024/8/21 15:23, Jiufu Guo wrote: > Hi, > > Previous, vsx_stxvd2x4_le_const_<mode> is introduced for 'split1' pass, > so it is guarded by "can_create_pseudo_p ()". > While, it would be possible to match the pattern of this insn during/after > RA, so this insn could be updated to make it work for split pass after RA. > > Bootstrap®test pass on ppc64{,le}. > Is this ok for trunk? > > BR, > Jeff (Jiufu) Guo > > > PR target/116030 > > gcc/ChangeLog: > > * config/rs6000/vsx.md (vsx_stxvd2x4_le_const_<mode>): Allow insn > after RA. > > gcc/testsuite/ChangeLog: > > * gcc.target/powerpc/pr116030.c: New test. > > --- > gcc/config/rs6000/vsx.md | 9 +++++---- > gcc/testsuite/gcc.target/powerpc/pr116030.c | 17 +++++++++++++++++ > 2 files changed, 22 insertions(+), 4 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/powerpc/pr116030.c > > diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md > index 27069d070e1..2dd87b7a9db 100644 > --- a/gcc/config/rs6000/vsx.md > +++ b/gcc/config/rs6000/vsx.md > @@ -3454,12 +3454,12 @@ (define_insn "*vsx_stxvd2x4_le_<mode>" > > (define_insn_and_split "vsx_stxvd2x4_le_const_<mode>" > [(set (match_operand:VSX_W 0 "memory_operand" "=Z") > - (match_operand:VSX_W 1 "immediate_operand" "W"))] > + (match_operand:VSX_W 1 "immediate_operand" "W")) > + (clobber (match_scratch:VSX_W 2 "=&wa"))]
I think "&" isn't needed here as the input is immediate_operand. > "!BYTES_BIG_ENDIAN > && VECTOR_MEM_VSX_P (<MODE>mode) > && !TARGET_P9_VECTOR > - && const_vec_duplicate_p (operands[1]) > - && can_create_pseudo_p ()" > + && const_vec_duplicate_p (operands[1])" > "#" > "&& 1" > [(set (match_dup 2) > @@ -3472,7 +3472,8 @@ (define_insn_and_split "vsx_stxvd2x4_le_const_<mode>" > { > /* Here all the constants must be loaded without memory. */ > gcc_assert (easy_altivec_constant (operands[1], <MODE>mode)); > - operands[2] = gen_reg_rtx (<MODE>mode); > + if (GET_CODE(operands[2]) == SCRATCH) > + operands[2] = gen_reg_rtx (<MODE>mode); > } > [(set_attr "type" "vecstore") > (set_attr "length" "8")]) > diff --git a/gcc/testsuite/gcc.target/powerpc/pr116030.c > b/gcc/testsuite/gcc.target/powerpc/pr116030.c > new file mode 100644 > index 00000000000..ada0a4fd2b1 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/powerpc/pr116030.c > @@ -0,0 +1,17 @@ > +/* { dg-do compile } */ > +/* { dg-options "-mdejagnu-cpu=power8 -Os -fno-forward-propagate > -ftrivial-auto-var-init=zero -save-temps" } */ As Sam pointed out, "-save-temps" isn't needed. Since this test case adopts dfp type, please add one more check: /* { dg-require-effective-target dfp } */ OK with all these fixed, thanks! BR, Kewen > + > +/* Verify we do not ICE on the tests below. */ > +union U128 > +{ > + _Decimal128 d; > + unsigned long long int u[2]; > +}; > + > +union U128 > +foo () > +{ > + volatile union U128 u128; > + u128.d = 0.9999999999999999999999999999999999e+39DL; > + return u128; > +}