Skip to content

Commit 78b2287

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 5e1d34a commit 78b2287

File tree

3 files changed

+12
-8
lines changed

3 files changed

+12
-8
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.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)