Skip to content

Commit ec2e9aa

Browse files
committed
[LV][VPlan] Reduce register usage of VPEVLBasedIVPHIRecipe.
VPEVLBasedIVPHIRecipe will lower to VPInstruction scalar phi and generate scalar phi. This recipe will only use a scalar register just like other phi recipes. This patch fix the register usage for VPEVLBasedIVPHIRecipe from vector to scalar which is close to generated vector IR. https://godbolt.org/z/6Mzd6W6ha shows that no register spills when choosing <vscale x 16>.
1 parent 3990d82 commit ec2e9aa

File tree

2 files changed

+4
-5
lines changed

2 files changed

+4
-5
lines changed

llvm/lib/Transforms/Vectorize/VPlanAnalysis.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ SmallVector<VPRegisterUsage, 8> llvm::calculateRegisterUsageForPlan(
555555

556556
if (VFs[J].isScalar() ||
557557
isa<VPCanonicalIVPHIRecipe, VPReplicateRecipe, VPDerivedIVRecipe,
558-
VPScalarIVStepsRecipe>(R) ||
558+
VPEVLBasedIVPHIRecipe, VPScalarIVStepsRecipe>(R) ||
559559
(isa<VPInstruction>(R) &&
560560
all_of(cast<VPSingleDefRecipe>(R)->users(),
561561
[&](VPUser *U) {

llvm/test/Transforms/LoopVectorize/RISCV/maxbandwidth-regpressure.ll

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@
44
define i32 @dotp(ptr %a, ptr %b) {
55
; CHECK-REGS-VP: LV(REG): VF = vscale x 16
66
; CHECK-REGS-VP-NEXT: LV(REG): Found max usage: 2 item
7-
; CHECK-REGS-VP-NEXT: LV(REG): RegisterClass: RISCV::GPRRC, 5 registers
8-
; CHECK-REGS-VP-NEXT: LV(REG): RegisterClass: RISCV::VRRC, 40 registers
7+
; CHECK-REGS-VP-NEXT: LV(REG): RegisterClass: RISCV::GPRRC, 6 registers
8+
; CHECK-REGS-VP-NEXT: LV(REG): RegisterClass: RISCV::VRRC, 24 registers
99
; CHECK-REGS-VP-NEXT: LV(REG): Found invariant usage: 1 item
1010
; CHECK-REGS-VP-NEXT: LV(REG): RegisterClass: RISCV::GPRRC, 1 registers
11-
; CHECK-REGS-VP: LV(REG): Not considering vector loop of width vscale x 16 because it uses too many registers
12-
; CHECK-REGS-VP: LV: Selecting VF: vscale x 8.
11+
; CHECK-REGS-VP: LV: Selecting VF: vscale x 16.
1312
;
1413
; CHECK-NOREGS-VP: LV(REG): Not considering vector loop of width vscale x 8 because it uses too many registers
1514
; CHECK-NOREGS-VP: LV(REG): Not considering vector loop of width vscale x 16 because it uses too many registers

0 commit comments

Comments
 (0)