On Wed, 2025-01-22 at 10:53 +0800, Xi Ruoyao wrote:
> On Wed, 2025-01-22 at 10:37 +0800, Lulu Cheng wrote:
> > 
> > 在 2025/1/22 上午8:49, Xi Ruoyao 写道:
> > > The second source register of this insn cannot be the same as the
> > > destination register.
> > > 
> > > gcc/ChangeLog:
> > > 
> > >   * config/loongarch/loongarch.md
> > >   (<optab>_alsl_reversesi_extended): Add '&' to the destination
> > >   register constraint and append '0' to the first source register
> > >   constraint to indicate the destination register cannot be same
> > >   as the second source register, and change the split condition to
> > >   reload_completed so that the insn will be split only after RA in
> > >   order to obtain allocated registers that satisfy the above
> > >   constraints.
> > > 
> > > gcc/testsuite/ChangeLog:
> > > 
> > >   * gcc.target/loongarch/bitwise-shift-reassoc-clobber.c: New
> > >   test.
> > > ---
> > >   gcc/config/loongarch/loongarch.md             |  6 +++---
> > >   .../loongarch/bitwise-shift-reassoc-clobber.c | 21 +++++++++++++++++++
> > >   2 files changed, 24 insertions(+), 3 deletions(-)
> > >   create mode 100644 
> > > gcc/testsuite/gcc.target/loongarch/bitwise-shift-reassoc-clobber.c
> > > 
> > > diff --git a/gcc/config/loongarch/loongarch.md 
> > > b/gcc/config/loongarch/loongarch.md
> > > index 223e2b9f37f..1392325038c 100644
> > > --- a/gcc/config/loongarch/loongarch.md
> > > +++ b/gcc/config/loongarch/loongarch.md
> > > @@ -3160,13 +3160,13 @@ (define_insn_and_split 
> > > "<optab>_shift_reverse<X:mode>"
> > >   ;; add.w => alsl.w, so implement slli.d + and + add.w => and + alsl.w on
> > >   ;; our own.
> > >   (define_insn_and_split "<optab>_alsl_reversesi_extended"
> > > -  [(set (match_operand:DI 0 "register_operand" "=r")
> > > +  [(set (match_operand:DI 0 "register_operand" "=&r")
> > >           (sign_extend:DI
> > >             (plus:SI
> > >               (subreg:SI
> > >                 (any_bitwise:DI
> > >                   (ashift:DI
> > > -           (match_operand:DI 1 "register_operand" "r")
> > > +           (match_operand:DI 1 "register_operand" "r0")
> > >                     (match_operand:SI 2 "const_immalsl_operand" ""))
> > >                   (match_operand:DI 3 "const_int_operand" "i"))
> > >                 0)
> > > @@ -3175,7 +3175,7 @@ (define_insn_and_split 
> > > "<optab>_alsl_reversesi_extended"
> > >      && loongarch_reassoc_shift_bitwise (<is_and>, operands[2], 
> > > operands[3],
> > >                                          SImode)"
> > >     "#"
> > > -  "&& true"
> > > +  "&& reload_completed"
> > 
> > I have no problem with this patch.
> > 
> > But, I have always been confused about the use of reload_completed.
> > 
> > I can understand that it needs to be true here, but I don't quite 
> > understand the following:
> > 
> > ```
> > 
> > (define_insn_and_split "*zero_extendsidi2_internal"
> >    [(set (match_operand:DI 0 "register_operand" "=r,r,r,r")
> >          (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" 
> > "r,m,ZC,k")))]
> >    "TARGET_64BIT"
> >    "@
> >     bstrpick.d\t%0,%1,31,0
> >     ld.wu\t%0,%1
> >     #
> >     ldx.wu\t%0,%1"
> >    "&& reload_completed
> 
> I don't really understand it either... It is here since day 1 LoongArch
> support was added and I've never had enough courage to hack this part.

I pushed the 1st patch as an emergency wrong-code fix now.  The 2nd
patch can wait until we figure out the best way to support the fusion.

-- 
Xi Ruoyao <xry...@xry111.site>
School of Aerospace Science and Technology, Xidian University

Reply via email to