Skip to content

Commit d1d74fd

Browse files
committed
[RISCV] Preserve tail agnostic policy in foldVMV_V_V
This patch helps avoid regressions in an upcoming patch by making sure we don't accidentally lose a tail agnostic policy when folding a vmv.v.v into its source. The previous comment about RISCVInsertVSETVLI relaxing the policy didn't take into account the fact that there's a policy operand on vmv.v.v, which can be tail agnostic. If the tail is agnostic (via either the policy operand or the passthru being undef) and vmv.v.v's VL <= Src's VL, then Src's tail can be made agnostic.
1 parent 89c89b8 commit d1d74fd

File tree

2 files changed

+9
-6
lines changed

2 files changed

+9
-6
lines changed

llvm/lib/Target/RISCV/RISCVVectorPeephole.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -529,10 +529,13 @@ bool RISCVVectorPeephole::foldVMV_V_V(MachineInstr &MI) {
529529
*Src->getParent()->getParent()));
530530
}
531531

532-
// Use a conservative tu,mu policy, RISCVInsertVSETVLI will relax it if
533-
// passthru is undef.
534-
Src->getOperand(RISCVII::getVecPolicyOpNum(Src->getDesc()))
535-
.setImm(RISCVII::TAIL_UNDISTURBED_MASK_UNDISTURBED);
532+
// If MI was tail agnostic and the VL didn't increase, preserve it.
533+
int64_t Policy = RISCVII::TAIL_UNDISTURBED_MASK_UNDISTURBED;
534+
bool TailAgnostic = (MI.getOperand(5).getImm() & RISCVII::TAIL_AGNOSTIC) ||
535+
Passthru.getReg() == RISCV::NoRegister;
536+
if (TailAgnostic && isVLKnownLE(MI.getOperand(3), SrcVL))
537+
Policy |= RISCVII::TAIL_AGNOSTIC;
538+
Src->getOperand(RISCVII::getVecPolicyOpNum(Src->getDesc())).setImm(Policy);
536539

537540
MRI->replaceRegWith(MI.getOperand(0).getReg(), Src->getOperand(0).getReg());
538541
MI.eraseFromParent();

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

Lines changed: 2 additions & 2 deletions
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 */
@@ -55,7 +55,7 @@ body: |
5555
; CHECK: liveins: $v8
5656
; CHECK-NEXT: {{ $}}
5757
; CHECK-NEXT: %passthru:vr = COPY $v8
58-
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 4, 5 /* e32 */, 0 /* tu, mu */
58+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 4, 5 /* e32 */, 1 /* ta, mu */
5959
%passthru:vr = COPY $v8
6060
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 4, 5 /* e32 */, 0 /* tu, mu */
6161
%y:vr = PseudoVMV_V_V_M1 $noreg, %x, 4, 5 /* e32 */, 0 /* tu, mu */

0 commit comments

Comments
 (0)