Skip to content

Commit 6fd3400

Browse files
committed
[RISCV] Allow folding vmerge with implicit merge operand when true has tied dest
We currently don't fold a vmerge if it has an implicit merge operand and its true operand has a tied dest (i.e. has a passthru operand). This restriction was added in https://reviews.llvm.org/D151596, back whenever we had separate TU/TA pseudos. It looks like it was added because the policy might not have been handled correctly. However the policy should be set correctly if we relax this restriction today, since we compute the policy differently now that we have removed the TU/TA distinction in our pseudos. We use a TUMU policy, and relax it to TAMU iff the vmerge's merge operand is implicit. The reasoning behind this being that the tail elements always come from the vmerge's merge operand[1], so if the merge operand is implicit-def then the tail is implicit-def, and hence tail agnostic. [1] unless the VL was shrunk, in which case we conservatively use TUMU.
1 parent 3255559 commit 6fd3400

File tree

3 files changed

+48
-89
lines changed

3 files changed

+48
-89
lines changed

llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3531,11 +3531,6 @@ bool RISCVDAGToDAGISel::performCombineVMergeAndVOps(SDNode *N) {
35313531
return false;
35323532

35333533
if (HasTiedDest && !isImplicitDef(True->getOperand(0))) {
3534-
// The vmerge instruction must be TU.
3535-
// FIXME: This could be relaxed, but we need to handle the policy for the
3536-
// resulting op correctly.
3537-
if (isImplicitDef(Merge))
3538-
return false;
35393534
SDValue MergeOpTrue = True->getOperand(0);
35403535
// Both the vmerge instruction and the True instruction must have the same
35413536
// merge operand.
@@ -3545,9 +3540,6 @@ bool RISCVDAGToDAGISel::performCombineVMergeAndVOps(SDNode *N) {
35453540

35463541
if (IsMasked) {
35473542
assert(HasTiedDest && "Expected tied dest");
3548-
// The vmerge instruction must be TU.
3549-
if (isImplicitDef(Merge))
3550-
return false;
35513543
// The vmerge instruction must have an all 1s mask since we're going to keep
35523544
// the mask from the True instruction.
35533545
// FIXME: Support mask agnostic True instruction which would have an

llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-vops.ll

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,17 +1190,11 @@ define <vscale x 2 x i32> @vmerge_larger_vl_false_becomes_tail(<vscale x 2 x i32
11901190

11911191
declare <vscale x 2 x i32> @llvm.riscv.vmacc.nxv2i32.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i32>, i64, i64)
11921192

1193-
; FIXME: We don't currently handle vmerge with an implicit passthru if the true
1194-
; operand also has a tied dest. This could be folded into a masked vmacc with ta
1195-
; policy.
11961193
define <vscale x 2 x i32> @true_tied_dest_vmerge_implicit_passthru(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m, i64 %avl) {
11971194
; CHECK-LABEL: true_tied_dest_vmerge_implicit_passthru:
11981195
; CHECK: # %bb.0:
1199-
; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, ma
1200-
; CHECK-NEXT: vmv1r.v v11, v8
1201-
; CHECK-NEXT: vmacc.vv v11, v9, v10
1202-
; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma
1203-
; CHECK-NEXT: vmerge.vvm v8, v8, v11, v0
1196+
; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, mu
1197+
; CHECK-NEXT: vmacc.vv v8, v9, v10, v0.t
12041198
; CHECK-NEXT: ret
12051199
%a = call <vscale x 2 x i32> @llvm.riscv.vmacc.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, i64 %avl, i64 0)
12061200
%b = call <vscale x 2 x i32> @llvm.riscv.vmerge.nxv2i32.nxv2i32(
@@ -1215,16 +1209,11 @@ define <vscale x 2 x i32> @true_tied_dest_vmerge_implicit_passthru(<vscale x 2 x
12151209

12161210
declare <vscale x 2 x i32> @llvm.riscv.vadd.mask.nxv2i32.i32(<vscale x 2 x i32>, <vscale x 2 x i32>, i32, <vscale x 2 x i1>, i64, i64)
12171211

1218-
; FIXME: We don't currently handle vmerge with an implicit passthru if the true
1219-
; operand also has a tied dest, e.g. has a passthru since it's a masked
1220-
; pseudo. This could be folded into a masked vadd with ta policy.
12211212
define <vscale x 2 x i32> @true_mask_vmerge_implicit_passthru(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m, i64 %avl) {
12221213
; CHECK-LABEL: true_mask_vmerge_implicit_passthru:
12231214
; CHECK: # %bb.0:
1224-
; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, mu
1225-
; CHECK-NEXT: vmv1r.v v11, v8
1226-
; CHECK-NEXT: vadd.vv v11, v9, v10, v0.t
1227-
; CHECK-NEXT: vmv.v.v v8, v11
1215+
; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, mu
1216+
; CHECK-NEXT: vadd.vv v8, v9, v10, v0.t
12281217
; CHECK-NEXT: ret
12291218
%a = call <vscale x 2 x i32> @llvm.riscv.vadd.mask.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m, i64 %avl, i64 0)
12301219
%b = call <vscale x 2 x i32> @llvm.riscv.vmerge.nxv2i32.nxv2i32(

llvm/test/CodeGen/RISCV/rvv/vmadd-vp.ll

Lines changed: 44 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,8 @@ define <vscale x 1 x i8> @vmadd_vv_nxv1i8_ta(<vscale x 1 x i8> %a, <vscale x 1 x
9191
define <vscale x 1 x i8> @vmadd_vx_nxv1i8_ta(<vscale x 1 x i8> %a, i8 %b, <vscale x 1 x i8> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) {
9292
; CHECK-LABEL: vmadd_vx_nxv1i8_ta:
9393
; CHECK: # %bb.0:
94-
; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma
95-
; CHECK-NEXT: vmacc.vx v9, a0, v8
96-
; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0
94+
; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, mu
95+
; CHECK-NEXT: vmadd.vx v8, a0, v9, v0.t
9796
; CHECK-NEXT: ret
9897
%elt.head = insertelement <vscale x 1 x i8> poison, i8 %b, i32 0
9998
%vb = shufflevector <vscale x 1 x i8> %elt.head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer
@@ -192,9 +191,8 @@ define <vscale x 2 x i8> @vmadd_vv_nxv2i8_ta(<vscale x 2 x i8> %a, <vscale x 2 x
192191
define <vscale x 2 x i8> @vmadd_vx_nxv2i8_ta(<vscale x 2 x i8> %a, i8 %b, <vscale x 2 x i8> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) {
193192
; CHECK-LABEL: vmadd_vx_nxv2i8_ta:
194193
; CHECK: # %bb.0:
195-
; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma
196-
; CHECK-NEXT: vmacc.vx v9, a0, v8
197-
; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0
194+
; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, mu
195+
; CHECK-NEXT: vmadd.vx v8, a0, v9, v0.t
198196
; CHECK-NEXT: ret
199197
%elt.head = insertelement <vscale x 2 x i8> poison, i8 %b, i32 0
200198
%vb = shufflevector <vscale x 2 x i8> %elt.head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer
@@ -293,9 +291,8 @@ define <vscale x 4 x i8> @vmadd_vv_nxv4i8_ta(<vscale x 4 x i8> %a, <vscale x 4 x
293291
define <vscale x 4 x i8> @vmadd_vx_nxv4i8_ta(<vscale x 4 x i8> %a, i8 %b, <vscale x 4 x i8> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) {
294292
; CHECK-LABEL: vmadd_vx_nxv4i8_ta:
295293
; CHECK: # %bb.0:
296-
; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma
297-
; CHECK-NEXT: vmacc.vx v9, a0, v8
298-
; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0
294+
; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, mu
295+
; CHECK-NEXT: vmadd.vx v8, a0, v9, v0.t
299296
; CHECK-NEXT: ret
300297
%elt.head = insertelement <vscale x 4 x i8> poison, i8 %b, i32 0
301298
%vb = shufflevector <vscale x 4 x i8> %elt.head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer
@@ -394,9 +391,8 @@ define <vscale x 8 x i8> @vmadd_vv_nxv8i8_ta(<vscale x 8 x i8> %a, <vscale x 8 x
394391
define <vscale x 8 x i8> @vmadd_vx_nxv8i8_ta(<vscale x 8 x i8> %a, i8 %b, <vscale x 8 x i8> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) {
395392
; CHECK-LABEL: vmadd_vx_nxv8i8_ta:
396393
; CHECK: # %bb.0:
397-
; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma
398-
; CHECK-NEXT: vmacc.vx v9, a0, v8
399-
; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0
394+
; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, mu
395+
; CHECK-NEXT: vmadd.vx v8, a0, v9, v0.t
400396
; CHECK-NEXT: ret
401397
%elt.head = insertelement <vscale x 8 x i8> poison, i8 %b, i32 0
402398
%vb = shufflevector <vscale x 8 x i8> %elt.head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer
@@ -495,9 +491,8 @@ define <vscale x 16 x i8> @vmadd_vv_nxv16i8_ta(<vscale x 16 x i8> %a, <vscale x
495491
define <vscale x 16 x i8> @vmadd_vx_nxv16i8_ta(<vscale x 16 x i8> %a, i8 %b, <vscale x 16 x i8> %c, <vscale x 16 x i1> %m, i32 zeroext %evl) {
496492
; CHECK-LABEL: vmadd_vx_nxv16i8_ta:
497493
; CHECK: # %bb.0:
498-
; CHECK-NEXT: vsetvli zero, a1, e8, m2, ta, ma
499-
; CHECK-NEXT: vmacc.vx v10, a0, v8
500-
; CHECK-NEXT: vmerge.vvm v8, v8, v10, v0
494+
; CHECK-NEXT: vsetvli zero, a1, e8, m2, ta, mu
495+
; CHECK-NEXT: vmadd.vx v8, a0, v10, v0.t
501496
; CHECK-NEXT: ret
502497
%elt.head = insertelement <vscale x 16 x i8> poison, i8 %b, i32 0
503498
%vb = shufflevector <vscale x 16 x i8> %elt.head, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
@@ -596,9 +591,8 @@ define <vscale x 32 x i8> @vmadd_vv_nxv32i8_ta(<vscale x 32 x i8> %a, <vscale x
596591
define <vscale x 32 x i8> @vmadd_vx_nxv32i8_ta(<vscale x 32 x i8> %a, i8 %b, <vscale x 32 x i8> %c, <vscale x 32 x i1> %m, i32 zeroext %evl) {
597592
; CHECK-LABEL: vmadd_vx_nxv32i8_ta:
598593
; CHECK: # %bb.0:
599-
; CHECK-NEXT: vsetvli zero, a1, e8, m4, ta, ma
600-
; CHECK-NEXT: vmacc.vx v12, a0, v8
601-
; CHECK-NEXT: vmerge.vvm v8, v8, v12, v0
594+
; CHECK-NEXT: vsetvli zero, a1, e8, m4, ta, mu
595+
; CHECK-NEXT: vmadd.vx v8, a0, v12, v0.t
602596
; CHECK-NEXT: ret
603597
%elt.head = insertelement <vscale x 32 x i8> poison, i8 %b, i32 0
604598
%vb = shufflevector <vscale x 32 x i8> %elt.head, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer
@@ -700,9 +694,8 @@ define <vscale x 64 x i8> @vmadd_vv_nxv64i8_ta(<vscale x 64 x i8> %a, <vscale x
700694
define <vscale x 64 x i8> @vmadd_vx_nxv64i8_ta(<vscale x 64 x i8> %a, i8 %b, <vscale x 64 x i8> %c, <vscale x 64 x i1> %m, i32 zeroext %evl) {
701695
; CHECK-LABEL: vmadd_vx_nxv64i8_ta:
702696
; CHECK: # %bb.0:
703-
; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma
704-
; CHECK-NEXT: vmacc.vx v16, a0, v8
705-
; CHECK-NEXT: vmerge.vvm v8, v8, v16, v0
697+
; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, mu
698+
; CHECK-NEXT: vmadd.vx v8, a0, v16, v0.t
706699
; CHECK-NEXT: ret
707700
%elt.head = insertelement <vscale x 64 x i8> poison, i8 %b, i32 0
708701
%vb = shufflevector <vscale x 64 x i8> %elt.head, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer
@@ -801,9 +794,8 @@ define <vscale x 1 x i16> @vmadd_vv_nxv1i16_ta(<vscale x 1 x i16> %a, <vscale x
801794
define <vscale x 1 x i16> @vmadd_vx_nxv1i16_ta(<vscale x 1 x i16> %a, i16 %b, <vscale x 1 x i16> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) {
802795
; CHECK-LABEL: vmadd_vx_nxv1i16_ta:
803796
; CHECK: # %bb.0:
804-
; CHECK-NEXT: vsetvli zero, a1, e16, mf4, ta, ma
805-
; CHECK-NEXT: vmacc.vx v9, a0, v8
806-
; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0
797+
; CHECK-NEXT: vsetvli zero, a1, e16, mf4, ta, mu
798+
; CHECK-NEXT: vmadd.vx v8, a0, v9, v0.t
807799
; CHECK-NEXT: ret
808800
%elt.head = insertelement <vscale x 1 x i16> poison, i16 %b, i32 0
809801
%vb = shufflevector <vscale x 1 x i16> %elt.head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer
@@ -902,9 +894,8 @@ define <vscale x 2 x i16> @vmadd_vv_nxv2i16_ta(<vscale x 2 x i16> %a, <vscale x
902894
define <vscale x 2 x i16> @vmadd_vx_nxv2i16_ta(<vscale x 2 x i16> %a, i16 %b, <vscale x 2 x i16> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) {
903895
; CHECK-LABEL: vmadd_vx_nxv2i16_ta:
904896
; CHECK: # %bb.0:
905-
; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma
906-
; CHECK-NEXT: vmacc.vx v9, a0, v8
907-
; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0
897+
; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, mu
898+
; CHECK-NEXT: vmadd.vx v8, a0, v9, v0.t
908899
; CHECK-NEXT: ret
909900
%elt.head = insertelement <vscale x 2 x i16> poison, i16 %b, i32 0
910901
%vb = shufflevector <vscale x 2 x i16> %elt.head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer
@@ -1003,9 +994,8 @@ define <vscale x 4 x i16> @vmadd_vv_nxv4i16_ta(<vscale x 4 x i16> %a, <vscale x
1003994
define <vscale x 4 x i16> @vmadd_vx_nxv4i16_ta(<vscale x 4 x i16> %a, i16 %b, <vscale x 4 x i16> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1004995
; CHECK-LABEL: vmadd_vx_nxv4i16_ta:
1005996
; CHECK: # %bb.0:
1006-
; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma
1007-
; CHECK-NEXT: vmacc.vx v9, a0, v8
1008-
; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0
997+
; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, mu
998+
; CHECK-NEXT: vmadd.vx v8, a0, v9, v0.t
1009999
; CHECK-NEXT: ret
10101000
%elt.head = insertelement <vscale x 4 x i16> poison, i16 %b, i32 0
10111001
%vb = shufflevector <vscale x 4 x i16> %elt.head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer
@@ -1104,9 +1094,8 @@ define <vscale x 8 x i16> @vmadd_vv_nxv8i16_ta(<vscale x 8 x i16> %a, <vscale x
11041094
define <vscale x 8 x i16> @vmadd_vx_nxv8i16_ta(<vscale x 8 x i16> %a, i16 %b, <vscale x 8 x i16> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) {
11051095
; CHECK-LABEL: vmadd_vx_nxv8i16_ta:
11061096
; CHECK: # %bb.0:
1107-
; CHECK-NEXT: vsetvli zero, a1, e16, m2, ta, ma
1108-
; CHECK-NEXT: vmacc.vx v10, a0, v8
1109-
; CHECK-NEXT: vmerge.vvm v8, v8, v10, v0
1097+
; CHECK-NEXT: vsetvli zero, a1, e16, m2, ta, mu
1098+
; CHECK-NEXT: vmadd.vx v8, a0, v10, v0.t
11101099
; CHECK-NEXT: ret
11111100
%elt.head = insertelement <vscale x 8 x i16> poison, i16 %b, i32 0
11121101
%vb = shufflevector <vscale x 8 x i16> %elt.head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
@@ -1205,9 +1194,8 @@ define <vscale x 16 x i16> @vmadd_vv_nxv16i16_ta(<vscale x 16 x i16> %a, <vscale
12051194
define <vscale x 16 x i16> @vmadd_vx_nxv16i16_ta(<vscale x 16 x i16> %a, i16 %b, <vscale x 16 x i16> %c, <vscale x 16 x i1> %m, i32 zeroext %evl) {
12061195
; CHECK-LABEL: vmadd_vx_nxv16i16_ta:
12071196
; CHECK: # %bb.0:
1208-
; CHECK-NEXT: vsetvli zero, a1, e16, m4, ta, ma
1209-
; CHECK-NEXT: vmacc.vx v12, a0, v8
1210-
; CHECK-NEXT: vmerge.vvm v8, v8, v12, v0
1197+
; CHECK-NEXT: vsetvli zero, a1, e16, m4, ta, mu
1198+
; CHECK-NEXT: vmadd.vx v8, a0, v12, v0.t
12111199
; CHECK-NEXT: ret
12121200
%elt.head = insertelement <vscale x 16 x i16> poison, i16 %b, i32 0
12131201
%vb = shufflevector <vscale x 16 x i16> %elt.head, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer
@@ -1309,9 +1297,8 @@ define <vscale x 32 x i16> @vmadd_vv_nxv32i16_ta(<vscale x 32 x i16> %a, <vscale
13091297
define <vscale x 32 x i16> @vmadd_vx_nxv32i16_ta(<vscale x 32 x i16> %a, i16 %b, <vscale x 32 x i16> %c, <vscale x 32 x i1> %m, i32 zeroext %evl) {
13101298
; CHECK-LABEL: vmadd_vx_nxv32i16_ta:
13111299
; CHECK: # %bb.0:
1312-
; CHECK-NEXT: vsetvli zero, a1, e16, m8, ta, ma
1313-
; CHECK-NEXT: vmacc.vx v16, a0, v8
1314-
; CHECK-NEXT: vmerge.vvm v8, v8, v16, v0
1300+
; CHECK-NEXT: vsetvli zero, a1, e16, m8, ta, mu
1301+
; CHECK-NEXT: vmadd.vx v8, a0, v16, v0.t
13151302
; CHECK-NEXT: ret
13161303
%elt.head = insertelement <vscale x 32 x i16> poison, i16 %b, i32 0
13171304
%vb = shufflevector <vscale x 32 x i16> %elt.head, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer
@@ -1410,9 +1397,8 @@ define <vscale x 1 x i32> @vmadd_vv_nxv1i32_ta(<vscale x 1 x i32> %a, <vscale x
14101397
define <vscale x 1 x i32> @vmadd_vx_nxv1i32_ta(<vscale x 1 x i32> %a, i32 %b, <vscale x 1 x i32> %c, <vscale x 1 x i1> %m, i32 zeroext %evl) {
14111398
; CHECK-LABEL: vmadd_vx_nxv1i32_ta:
14121399
; CHECK: # %bb.0:
1413-
; CHECK-NEXT: vsetvli zero, a1, e32, mf2, ta, ma
1414-
; CHECK-NEXT: vmacc.vx v9, a0, v8
1415-
; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0
1400+
; CHECK-NEXT: vsetvli zero, a1, e32, mf2, ta, mu
1401+
; CHECK-NEXT: vmadd.vx v8, a0, v9, v0.t
14161402
; CHECK-NEXT: ret
14171403
%elt.head = insertelement <vscale x 1 x i32> poison, i32 %b, i32 0
14181404
%vb = shufflevector <vscale x 1 x i32> %elt.head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer
@@ -1511,9 +1497,8 @@ define <vscale x 2 x i32> @vmadd_vv_nxv2i32_ta(<vscale x 2 x i32> %a, <vscale x
15111497
define <vscale x 2 x i32> @vmadd_vx_nxv2i32_ta(<vscale x 2 x i32> %a, i32 %b, <vscale x 2 x i32> %c, <vscale x 2 x i1> %m, i32 zeroext %evl) {
15121498
; CHECK-LABEL: vmadd_vx_nxv2i32_ta:
15131499
; CHECK: # %bb.0:
1514-
; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma
1515-
; CHECK-NEXT: vmacc.vx v9, a0, v8
1516-
; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0
1500+
; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, mu
1501+
; CHECK-NEXT: vmadd.vx v8, a0, v9, v0.t
15171502
; CHECK-NEXT: ret
15181503
%elt.head = insertelement <vscale x 2 x i32> poison, i32 %b, i32 0
15191504
%vb = shufflevector <vscale x 2 x i32> %elt.head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
@@ -1612,9 +1597,8 @@ define <vscale x 4 x i32> @vmadd_vv_nxv4i32_ta(<vscale x 4 x i32> %a, <vscale x
16121597
define <vscale x 4 x i32> @vmadd_vx_nxv4i32_ta(<vscale x 4 x i32> %a, i32 %b, <vscale x 4 x i32> %c, <vscale x 4 x i1> %m, i32 zeroext %evl) {
16131598
; CHECK-LABEL: vmadd_vx_nxv4i32_ta:
16141599
; CHECK: # %bb.0:
1615-
; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
1616-
; CHECK-NEXT: vmacc.vx v10, a0, v8
1617-
; CHECK-NEXT: vmerge.vvm v8, v8, v10, v0
1600+
; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, mu
1601+
; CHECK-NEXT: vmadd.vx v8, a0, v10, v0.t
16181602
; CHECK-NEXT: ret
16191603
%elt.head = insertelement <vscale x 4 x i32> poison, i32 %b, i32 0
16201604
%vb = shufflevector <vscale x 4 x i32> %elt.head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
@@ -1713,9 +1697,8 @@ define <vscale x 8 x i32> @vmadd_vv_nxv8i32_ta(<vscale x 8 x i32> %a, <vscale x
17131697
define <vscale x 8 x i32> @vmadd_vx_nxv8i32_ta(<vscale x 8 x i32> %a, i32 %b, <vscale x 8 x i32> %c, <vscale x 8 x i1> %m, i32 zeroext %evl) {
17141698
; CHECK-LABEL: vmadd_vx_nxv8i32_ta:
17151699
; CHECK: # %bb.0:
1716-
; CHECK-NEXT: vsetvli zero, a1, e32, m4, ta, ma
1717-
; CHECK-NEXT: vmacc.vx v12, a0, v8
1718-
; CHECK-NEXT: vmerge.vvm v8, v8, v12, v0
1700+
; CHECK-NEXT: vsetvli zero, a1, e32, m4, ta, mu
1701+
; CHECK-NEXT: vmadd.vx v8, a0, v12, v0.t
17191702
; CHECK-NEXT: ret
17201703
%elt.head = insertelement <vscale x 8 x i32> poison, i32 %b, i32 0
17211704
%vb = shufflevector <vscale x 8 x i32> %elt.head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer
@@ -1817,9 +1800,8 @@ define <vscale x 16 x i32> @vmadd_vv_nxv16i32_ta(<vscale x 16 x i32> %a, <vscale
18171800
define <vscale x 16 x i32> @vmadd_vx_nxv16i32_ta(<vscale x 16 x i32> %a, i32 %b, <vscale x 16 x i32> %c, <vscale x 16 x i1> %m, i32 zeroext %evl) {
18181801
; CHECK-LABEL: vmadd_vx_nxv16i32_ta:
18191802
; CHECK: # %bb.0:
1820-
; CHECK-NEXT: vsetvli zero, a1, e32, m8, ta, ma
1821-
; CHECK-NEXT: vmacc.vx v16, a0, v8
1822-
; CHECK-NEXT: vmerge.vvm v8, v8, v16, v0
1803+
; CHECK-NEXT: vsetvli zero, a1, e32, m8, ta, mu
1804+
; CHECK-NEXT: vmadd.vx v8, a0, v16, v0.t
18231805
; CHECK-NEXT: ret
18241806
%elt.head = insertelement <vscale x 16 x i32> poison, i32 %b, i32 0
18251807
%vb = shufflevector <vscale x 16 x i32> %elt.head, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer
@@ -1965,9 +1947,8 @@ define <vscale x 1 x i64> @vmadd_vx_nxv1i64_ta(<vscale x 1 x i64> %a, i64 %b, <v
19651947
;
19661948
; RV64-LABEL: vmadd_vx_nxv1i64_ta:
19671949
; RV64: # %bb.0:
1968-
; RV64-NEXT: vsetvli zero, a1, e64, m1, ta, ma
1969-
; RV64-NEXT: vmacc.vx v9, a0, v8
1970-
; RV64-NEXT: vmerge.vvm v8, v8, v9, v0
1950+
; RV64-NEXT: vsetvli zero, a1, e64, m1, ta, mu
1951+
; RV64-NEXT: vmadd.vx v8, a0, v9, v0.t
19711952
; RV64-NEXT: ret
19721953
%elt.head = insertelement <vscale x 1 x i64> poison, i64 %b, i32 0
19731954
%vb = shufflevector <vscale x 1 x i64> %elt.head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
@@ -2113,9 +2094,8 @@ define <vscale x 2 x i64> @vmadd_vx_nxv2i64_ta(<vscale x 2 x i64> %a, i64 %b, <v
21132094
;
21142095
; RV64-LABEL: vmadd_vx_nxv2i64_ta:
21152096
; RV64: # %bb.0:
2116-
; RV64-NEXT: vsetvli zero, a1, e64, m2, ta, ma
2117-
; RV64-NEXT: vmacc.vx v10, a0, v8
2118-
; RV64-NEXT: vmerge.vvm v8, v8, v10, v0
2097+
; RV64-NEXT: vsetvli zero, a1, e64, m2, ta, mu
2098+
; RV64-NEXT: vmadd.vx v8, a0, v10, v0.t
21192099
; RV64-NEXT: ret
21202100
%elt.head = insertelement <vscale x 2 x i64> poison, i64 %b, i32 0
21212101
%vb = shufflevector <vscale x 2 x i64> %elt.head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
@@ -2261,9 +2241,8 @@ define <vscale x 4 x i64> @vmadd_vx_nxv4i64_ta(<vscale x 4 x i64> %a, i64 %b, <v
22612241
;
22622242
; RV64-LABEL: vmadd_vx_nxv4i64_ta:
22632243
; RV64: # %bb.0:
2264-
; RV64-NEXT: vsetvli zero, a1, e64, m4, ta, ma
2265-
; RV64-NEXT: vmacc.vx v12, a0, v8
2266-
; RV64-NEXT: vmerge.vvm v8, v8, v12, v0
2244+
; RV64-NEXT: vsetvli zero, a1, e64, m4, ta, mu
2245+
; RV64-NEXT: vmadd.vx v8, a0, v12, v0.t
22672246
; RV64-NEXT: ret
22682247
%elt.head = insertelement <vscale x 4 x i64> poison, i64 %b, i32 0
22692248
%vb = shufflevector <vscale x 4 x i64> %elt.head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
@@ -2412,9 +2391,8 @@ define <vscale x 8 x i64> @vmadd_vx_nxv8i64_ta(<vscale x 8 x i64> %a, i64 %b, <v
24122391
;
24132392
; RV64-LABEL: vmadd_vx_nxv8i64_ta:
24142393
; RV64: # %bb.0:
2415-
; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, ma
2416-
; RV64-NEXT: vmacc.vx v16, a0, v8
2417-
; RV64-NEXT: vmerge.vvm v8, v8, v16, v0
2394+
; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, mu
2395+
; RV64-NEXT: vmadd.vx v8, a0, v16, v0.t
24182396
; RV64-NEXT: ret
24192397
%elt.head = insertelement <vscale x 8 x i64> poison, i64 %b, i32 0
24202398
%vb = shufflevector <vscale x 8 x i64> %elt.head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer

0 commit comments

Comments
 (0)