[llvm] [RISCV] AddEdge between first mask producer and user of V0 (PR #146855)

Liao Chunyu via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 3 19:20:34 PDT 2025


================
@@ -493,33 +487,31 @@ define <vscale x 2 x i8> @vwop_vscale_zext_i1i8_multiple_users(ptr %x, ptr %y, p
 ; NO_FOLDING-NEXT:    vsetvli a3, zero, e8, mf4, ta, mu
 ; NO_FOLDING-NEXT:    vlm.v v0, (a0)
 ; NO_FOLDING-NEXT:    vlm.v v8, (a2)
-; NO_FOLDING-NEXT:    vlm.v v9, (a1)
-; NO_FOLDING-NEXT:    vmv.v.i v10, 0
-; NO_FOLDING-NEXT:    vmerge.vim v11, v10, 1, v0
+; NO_FOLDING-NEXT:    vmv.v.i v9, 0
+; NO_FOLDING-NEXT:    vmerge.vim v10, v9, 1, v0
 ; NO_FOLDING-NEXT:    vmv1r.v v0, v8
-; NO_FOLDING-NEXT:    vmerge.vim v8, v10, 1, v0
-; NO_FOLDING-NEXT:    vadd.vv v10, v11, v8
-; NO_FOLDING-NEXT:    vsub.vv v8, v11, v8
-; NO_FOLDING-NEXT:    vmv1r.v v0, v9
-; NO_FOLDING-NEXT:    vor.vv v10, v10, v11, v0.t
-; NO_FOLDING-NEXT:    vor.vv v8, v10, v8
+; NO_FOLDING-NEXT:    vmerge.vim v8, v9, 1, v0
+; NO_FOLDING-NEXT:    vlm.v v0, (a1)
+; NO_FOLDING-NEXT:    vadd.vv v9, v10, v8
+; NO_FOLDING-NEXT:    vsub.vv v8, v10, v8
+; NO_FOLDING-NEXT:    vor.vv v9, v9, v10, v0.t
+; NO_FOLDING-NEXT:    vor.vv v8, v9, v8
 ; NO_FOLDING-NEXT:    ret
 ;
 ; FOLDING-LABEL: vwop_vscale_zext_i1i8_multiple_users:
 ; FOLDING:       # %bb.0:
 ; FOLDING-NEXT:    vsetvli a3, zero, e8, mf4, ta, mu
 ; FOLDING-NEXT:    vlm.v v0, (a0)
 ; FOLDING-NEXT:    vlm.v v8, (a2)
-; FOLDING-NEXT:    vlm.v v9, (a1)
-; FOLDING-NEXT:    vmv.v.i v10, 0
-; FOLDING-NEXT:    vmerge.vim v11, v10, 1, v0
+; FOLDING-NEXT:    vmv.v.i v9, 0
+; FOLDING-NEXT:    vmerge.vim v10, v9, 1, v0
 ; FOLDING-NEXT:    vmv1r.v v0, v8
----------------
ChunyuLiao wrote:

```   
       liveins: $x10, $x11, $x12
16B       %2:gpr = COPY $x12
32B       %1:gpr = COPY $x11
48B       %0:gpr = COPY $x10
64B       %3:vr = PseudoVLM_V_B32 undef %3:vr(tied-def 0), %0:gpr, -1, 0, 3 :: (load (<vscale x 1 x s8>) from %ir.x)
80B       %5:vr = PseudoVLM_V_B32 undef %5:vr(tied-def 0), %1:gpr, -1, 0, 3 :: (load (<vscale x 1 x s8>) from %ir.y)
96B       %6:vr = PseudoVLM_V_B32 undef %6:vr(tied-def 0), %2:gpr, -1, 0, 3 :: (load (<vscale x 1 x s8>) from %ir.z)
112B      %8:vr = PseudoVMV_V_I_MF4 undef %8:vr(tied-def 0), 0, -1, 3, 0
128B      $v0 = COPY %3:vr
144B      %9:vrnov0 = PseudoVMERGE_VIM_MF4 undef %9:vrnov0(tied-def 0), %8:vr, 1, killed $v0, -1, 3
160B      $v0 = COPY %6:vr            --------- The issue is that this copy wasn't eliminated.
176B      %11:vrnov0 = PseudoVMERGE_VIM_MF4 undef %11:vrnov0(tied-def 0), %8:vr, 1, killed $v0, -1, 3
192B      %15:vrnov0 = PseudoVADD_VV_MF4 undef %15:vrnov0(tied-def 0), %9:vrnov0, %11:vrnov0, -1, 3, 3
208B      %14:vr = PseudoVSUB_VV_MF4 undef %14:vr(tied-def 0), %9:vrnov0, %11:vrnov0, -1, 3, 3
224B      $v0 = COPY %5:vr
240B      %15:vrnov0 = PseudoVOR_VV_MF4_MASK %15:vrnov0(tied-def 0), %15:vrnov0, %9:vrnov0, killed $v0, -1, 3, 1
```

$v0 = COPY %6:vr ---------  The issue is that this copy wasn't eliminated.
To address it, I think we might need to add edges from all existing defs to the use. 

https://github.com/llvm/llvm-project/pull/146855


More information about the llvm-commits mailing list