Skip to content

Commit 7bab2f5

Browse files
committed
[RISCV] Preserve tail agnostic policy in some vector peepholes
This patch helps avoid regressions in an upcoming patch by making sure we don't accidentally lose a tail agnostic policy when doing some peepholes. There are two places this happens: 1. When converting a vmerge.vvm with an all ones mask to a vmv.v.v, if vmerge's passthru was undefined the tail will always be undef, even if the new passthru (vmerge's old false operand) isn't undef. We can use ta here. 2. When folding a vmv.v.v into its source, if the vmv.v.v had a ta policy we can copy it over, provided that we kept the same VL.
1 parent 33c3df1 commit 7bab2f5

File tree

4 files changed

+13
-9
lines changed

4 files changed

+13
-9
lines changed

llvm/lib/Target/RISCV/RISCVVectorPeephole.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -365,8 +365,10 @@ bool RISCVVectorPeephole::convertVMergeToVMv(MachineInstr &MI) const {
365365
MI.removeOperand(1); // Passthru operand
366366
MI.tieOperands(0, 1); // Tie false to dest
367367
MI.removeOperand(3); // Mask operand
368-
MI.addOperand(
369-
MachineOperand::CreateImm(RISCVII::TAIL_UNDISTURBED_MASK_UNDISTURBED));
368+
int64_t Policy = RISCVII::TAIL_UNDISTURBED_MASK_UNDISTURBED;
369+
if (PassthruReg == RISCV::NoRegister)
370+
Policy |= RISCVII::TAIL_AGNOSTIC;
371+
MI.addOperand(MachineOperand::CreateImm(Policy));
370372

371373
// vmv.v.v doesn't have a mask operand, so we may be able to inflate the
372374
// register class for the destination and passthru operands e.g. VRNoV0 -> VR
@@ -520,10 +522,12 @@ bool RISCVVectorPeephole::foldVMV_V_V(MachineInstr &MI) {
520522
*Src->getParent()->getParent()));
521523
}
522524

523-
// Use a conservative tu,mu policy, RISCVInsertVSETVLI will relax it if
524-
// passthru is undef.
525-
Src->getOperand(RISCVII::getVecPolicyOpNum(Src->getDesc()))
526-
.setImm(RISCVII::TAIL_UNDISTURBED_MASK_UNDISTURBED);
525+
// If MI had a ta policy and the VL didn't increase, we can preserve it.
526+
int64_t Policy = RISCVII::TAIL_UNDISTURBED_MASK_UNDISTURBED;
527+
if ((MI.getOperand(5).getImm() & RISCVII::TAIL_AGNOSTIC) &&
528+
isVLKnownLE(MI.getOperand(3), SrcVL))
529+
Policy |= RISCVII::TAIL_AGNOSTIC;
530+
Src->getOperand(RISCVII::getVecPolicyOpNum(Src->getDesc())).setImm(Policy);
527531

528532
MRI->replaceRegWith(MI.getOperand(0).getReg(), Src->getOperand(0).getReg());
529533
MI.eraseFromParent();

llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-to-vmv.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
define <vscale x 1 x i64> @undef_passthru(<vscale x 1 x i64> %false, <vscale x 1 x i64> %true, i64 %vl) {
55
; CHECK-LABEL: undef_passthru:
66
; CHECK: # %bb.0:
7-
; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, ma
7+
; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma
88
; CHECK-NEXT: vmv.v.v v8, v9
99
; CHECK-NEXT: ret
1010
%v = call <vscale x 1 x i64> @llvm.riscv.vmerge.nxv1i64.nxv1i64(<vscale x 1 x i64> poison, <vscale x 1 x i64> %false, <vscale x 1 x i64> %true, <vscale x 1 x i1> splat (i1 true), i64 %vl)

llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-to-vmv.mir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ body: |
1515
; CHECK-NEXT: %avl:gprnox0 = COPY $x1
1616
; CHECK-NEXT: %mask:vmv0 = PseudoVMSET_M_B8 %avl, 5 /* e32 */
1717
; CHECK-NEXT: $v0 = COPY %mask
18-
; CHECK-NEXT: %x:vr = PseudoVMV_V_V_M1 %false, %true, %avl, 5 /* e32 */, 0 /* tu, mu */
18+
; CHECK-NEXT: %x:vr = PseudoVMV_V_V_M1 %false, %true, %avl, 5 /* e32 */, 1 /* ta, mu */
1919
%false:vr = COPY $v8
2020
%true:vr = COPY $v9
2121
%avl:gprnox0 = COPY $x1

llvm/test/CodeGen/RISCV/rvv/vmv.v.v-peephole.mir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ body: |
2727
; CHECK: liveins: $v8
2828
; CHECK-NEXT: {{ $}}
2929
; CHECK-NEXT: %passthru:vr = COPY $v8
30-
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 %passthru, $noreg, $noreg, 4, 5 /* e32 */, 0 /* tu, mu */
30+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 %passthru, $noreg, $noreg, 4, 5 /* e32 */, 1 /* ta, mu */
3131
%passthru:vr = COPY $v8
3232
%x:vr = PseudoVADD_VV_M1 %passthru, $noreg, $noreg, 4, 5 /* e32 */, 0 /* tu, mu */
3333
%y:vr = PseudoVMV_V_V_M1 %passthru, %x, 4, 5 /* e32 */, 1 /* ta, mu */

0 commit comments

Comments
 (0)