Skip to content

Commit 11a7e77

Browse files
committed
[RISCV] Canonicalize AVL=setvli to AVL=Imm or AVL=VLMAX
This patch adds a transform to the local prepass in InsertVSETVLI which canonicalizes an AVL of a register from another vsetvli into immediate or VLMAX when VTYPE is the same. In this patch, I chose to be conservative and avoid arbitrary vreg forwarding due to profitability concerns about possibility overlapping live ranges. This has the effect of eliminating vsetvli instructions in loops which are walking either VLMAX or a constant number of lanes per iteration. Differential Revision: https://reviews.llvm.org/D125812
1 parent ff6fe39 commit 11a7e77

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp

+23
Original file line numberDiff line numberDiff line change
@@ -1242,6 +1242,29 @@ void RISCVInsertVSETVLI::doLocalPrepass(MachineBasicBlock &MBB) {
12421242
}
12431243
}
12441244
}
1245+
1246+
// If AVL is defined by a vsetvli with the same vtype, we can
1247+
// replace the AVL operand with the AVL of the defining vsetvli.
1248+
// We avoid general register AVLs to avoid extending live ranges
1249+
// without being sure we can kill the original source reg entirely.
1250+
// TODO: We can ignore policy bits here, we only need VL to be the same.
1251+
if (Require.hasAVLReg() && Require.getAVLReg().isVirtual()) {
1252+
if (MachineInstr *DefMI = MRI->getVRegDef(Require.getAVLReg())) {
1253+
if (isVectorConfigInstr(*DefMI)) {
1254+
VSETVLIInfo DefInfo = getInfoForVSETVLI(*DefMI);
1255+
if (DefInfo.hasSameVTYPE(Require) &&
1256+
(DefInfo.hasAVLImm() || DefInfo.getAVLReg() == RISCV::X0)) {
1257+
MachineOperand &VLOp = MI.getOperand(getVLOpNum(MI));
1258+
if (DefInfo.hasAVLImm())
1259+
VLOp.ChangeToImmediate(DefInfo.getAVLImm());
1260+
else
1261+
VLOp.ChangeToRegister(DefInfo.getAVLReg(), /*IsDef*/ false);
1262+
CurInfo = computeInfoForInstr(MI, TSFlags, MRI);
1263+
continue;
1264+
}
1265+
}
1266+
}
1267+
}
12451268
}
12461269
CurInfo = computeInfoForInstr(MI, TSFlags, MRI);
12471270
continue;

llvm/test/CodeGen/RISCV/rvv/vsetvli-insert-crossbb.ll

+6-8
Original file line numberDiff line numberDiff line change
@@ -591,21 +591,20 @@ define void @vlmax(i64 %N, double* %c, double* %a, double* %b) {
591591
; CHECK-NEXT: blez a0, .LBB11_3
592592
; CHECK-NEXT: # %bb.1: # %for.body.preheader
593593
; CHECK-NEXT: li a5, 0
594-
; CHECK-NEXT: li t1, 0
594+
; CHECK-NEXT: li t0, 0
595595
; CHECK-NEXT: slli a7, a6, 3
596596
; CHECK-NEXT: .LBB11_2: # %for.body
597597
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
598-
; CHECK-NEXT: add t0, a2, a5
599-
; CHECK-NEXT: vsetvli zero, a6, e64, m1, ta, mu
600-
; CHECK-NEXT: vle64.v v8, (t0)
598+
; CHECK-NEXT: add a4, a2, a5
599+
; CHECK-NEXT: vle64.v v8, (a4)
601600
; CHECK-NEXT: add a4, a3, a5
602601
; CHECK-NEXT: vle64.v v9, (a4)
603602
; CHECK-NEXT: vfadd.vv v8, v8, v9
604603
; CHECK-NEXT: add a4, a1, a5
605604
; CHECK-NEXT: vse64.v v8, (a4)
606-
; CHECK-NEXT: add t1, t1, a6
605+
; CHECK-NEXT: add t0, t0, a6
607606
; CHECK-NEXT: add a5, a5, a7
608-
; CHECK-NEXT: blt t1, a0, .LBB11_2
607+
; CHECK-NEXT: blt t0, a0, .LBB11_2
609608
; CHECK-NEXT: .LBB11_3: # %for.end
610609
; CHECK-NEXT: ret
611610
entry:
@@ -645,7 +644,6 @@ define void @vector_init_vlmax(i64 %N, double* %c) {
645644
; CHECK-NEXT: vmv.v.i v8, 0
646645
; CHECK-NEXT: .LBB12_2: # %for.body
647646
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
648-
; CHECK-NEXT: vsetvli zero, a2, e64, m1, ta, mu
649647
; CHECK-NEXT: vse64.v v8, (a1)
650648
; CHECK-NEXT: add a3, a3, a2
651649
; CHECK-NEXT: add a1, a1, a4
@@ -719,7 +717,7 @@ define void @vector_init_vsetvli_fv(i64 %N, double* %c) {
719717
; CHECK-NEXT: vmv.v.i v8, 0
720718
; CHECK-NEXT: .LBB14_1: # %for.body
721719
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
722-
; CHECK-NEXT: vsetvli zero, a3, e64, m1, ta, mu
720+
; CHECK-NEXT: vsetivli zero, 4, e64, m1, ta, mu
723721
; CHECK-NEXT: vse64.v v8, (a1)
724722
; CHECK-NEXT: add a2, a2, a3
725723
; CHECK-NEXT: add a1, a1, a4

0 commit comments

Comments
 (0)