在 2025/1/22 下午5:21, Xi Ruoyao 写道:
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.
I agree. I also compared the previous assembly code when bstrpick_alsl_paired was not deleted to analyze this problem.

Reply via email to