Skip to content

Commit 6c607cf

Browse files
authored
[RISCV] Preserve tail agnostic policy in foldVMV_V_V (#105788)
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 9fef09f commit 6c607cf

File tree

2 files changed

+49
-4
lines changed

2 files changed

+49
-4
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: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,45 @@ body: |
1818
%y:gpr = ADDI $x0, 1
1919
%z:vr = PseudoVMV_V_V_M1 %passthru, %x, 4, 5 /* e32 */, 0 /* tu, mu */
2020
...
21+
---
22+
name: tail_agnostic
23+
body: |
24+
bb.0:
25+
liveins: $v8
26+
; CHECK-LABEL: name: tail_agnostic
27+
; CHECK: liveins: $v8
28+
; CHECK-NEXT: {{ $}}
29+
; CHECK-NEXT: %passthru:vr = COPY $v8
30+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 %passthru, $noreg, $noreg, 4, 5 /* e32 */, 1 /* ta, mu */
31+
%passthru:vr = COPY $v8
32+
%x:vr = PseudoVADD_VV_M1 %passthru, $noreg, $noreg, 4, 5 /* e32 */, 0 /* tu, mu */
33+
%y:vr = PseudoVMV_V_V_M1 %passthru, %x, 4, 5 /* e32 */, 1 /* ta, mu */
34+
...
35+
---
36+
name: tail_agnostic_larger_vl
37+
body: |
38+
bb.0:
39+
liveins: $v8
40+
; CHECK-LABEL: name: tail_agnostic_larger_vl
41+
; CHECK: liveins: $v8
42+
; CHECK-NEXT: {{ $}}
43+
; CHECK-NEXT: %passthru:vr = COPY $v8
44+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 %passthru, $noreg, $noreg, 4, 5 /* e32 */, 0 /* tu, mu */
45+
%passthru:vr = COPY $v8
46+
%x:vr = PseudoVADD_VV_M1 %passthru, $noreg, $noreg, 4, 5 /* e32 */, 0 /* tu, mu */
47+
%y:vr = PseudoVMV_V_V_M1 %passthru, %x, 5, 5 /* e32 */, 1 /* ta, mu */
48+
...
49+
---
50+
name: undef_passthru_src_undef_passthru
51+
body: |
52+
bb.0:
53+
liveins: $v8
54+
; CHECK-LABEL: name: undef_passthru_src_undef_passthru
55+
; CHECK: liveins: $v8
56+
; CHECK-NEXT: {{ $}}
57+
; CHECK-NEXT: %passthru:vr = COPY $v8
58+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 4, 5 /* e32 */, 1 /* ta, mu */
59+
%passthru:vr = COPY $v8
60+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 4, 5 /* e32 */, 0 /* tu, mu */
61+
%y:vr = PseudoVMV_V_V_M1 $noreg, %x, 4, 5 /* e32 */, 0 /* tu, mu */
62+
...

0 commit comments

Comments
 (0)