Skip to content

Commit 52187b9

Browse files
authored
[RISCV] Move RISCVDeadRegisterDefinitions to post vector regalloc (#90636)
Currently RISCVDeadRegisterDefinitions runs after vsetvli insertion, but in #70549 vsetvli insertion runs after vector regalloc and as a result we no longer convert some vsetvli a0, a0s to vsetvli x0, a0. This patch moves it to after vector regalloc, but before scalar regalloc so we still get the benefits of reducing register pressure.
1 parent b9541f9 commit 52187b9

File tree

4 files changed

+22
-11
lines changed

4 files changed

+22
-11
lines changed

llvm/lib/Target/RISCV/RISCVDeadRegisterDefinitions.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
#include "RISCVInstrInfo.h"
1515
#include "RISCVSubtarget.h"
1616
#include "llvm/ADT/Statistic.h"
17+
#include "llvm/CodeGen/LiveDebugVariables.h"
18+
#include "llvm/CodeGen/LiveIntervals.h"
19+
#include "llvm/CodeGen/LiveStacks.h"
1720
#include "llvm/CodeGen/MachineFunctionPass.h"
1821
#include "llvm/CodeGen/MachineRegisterInfo.h"
1922

@@ -32,6 +35,12 @@ class RISCVDeadRegisterDefinitions : public MachineFunctionPass {
3235
bool runOnMachineFunction(MachineFunction &MF) override;
3336
void getAnalysisUsage(AnalysisUsage &AU) const override {
3437
AU.setPreservesCFG();
38+
AU.addRequired<LiveIntervals>();
39+
AU.addPreserved<LiveIntervals>();
40+
AU.addRequired<LiveIntervals>();
41+
AU.addPreserved<SlotIndexes>();
42+
AU.addPreserved<LiveDebugVariables>();
43+
AU.addPreserved<LiveStacks>();
3544
MachineFunctionPass::getAnalysisUsage(AU);
3645
}
3746

@@ -51,9 +60,9 @@ bool RISCVDeadRegisterDefinitions::runOnMachineFunction(MachineFunction &MF) {
5160
if (skipFunction(MF.getFunction()))
5261
return false;
5362

54-
const MachineRegisterInfo *MRI = &MF.getRegInfo();
5563
const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
5664
const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
65+
LiveIntervals &LIS = getAnalysis<LiveIntervals>();
5766
LLVM_DEBUG(dbgs() << "***** RISCVDeadRegisterDefinitions *****\n");
5867

5968
bool MadeChange = false;
@@ -77,10 +86,8 @@ bool RISCVDeadRegisterDefinitions::runOnMachineFunction(MachineFunction &MF) {
7786
LLVM_DEBUG(dbgs() << " Ignoring, def is tied operand.\n");
7887
continue;
7988
}
80-
// We should not have any relevant physreg defs that are replacable by
81-
// zero before register allocation. So we just check for dead vreg defs.
8289
Register Reg = MO.getReg();
83-
if (!Reg.isVirtual() || (!MO.isDead() && !MRI->use_nodbg_empty(Reg)))
90+
if (!Reg.isVirtual() || !MO.isDead())
8491
continue;
8592
LLVM_DEBUG(dbgs() << " Dead def operand #" << I << " in:\n ";
8693
MI.print(dbgs()));
@@ -89,8 +96,9 @@ bool RISCVDeadRegisterDefinitions::runOnMachineFunction(MachineFunction &MF) {
8996
LLVM_DEBUG(dbgs() << " Ignoring, register is not a GPR.\n");
9097
continue;
9198
}
99+
assert(LIS.hasInterval(Reg));
100+
LIS.removeInterval(Reg);
92101
MO.setReg(RISCV::X0);
93-
MO.setIsDead();
94102
LLVM_DEBUG(dbgs() << " Replacing with zero register. New:\n ";
95103
MI.print(dbgs()));
96104
++NumDeadDefsReplaced;

llvm/lib/Target/RISCV/RISCVTargetMachine.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -390,13 +390,19 @@ FunctionPass *RISCVPassConfig::createRVVRegAllocPass(bool Optimized) {
390390
bool RISCVPassConfig::addRegAssignAndRewriteFast() {
391391
addPass(createRVVRegAllocPass(false));
392392
addPass(createRISCVCoalesceVSETVLIPass());
393+
if (TM->getOptLevel() != CodeGenOptLevel::None &&
394+
EnableRISCVDeadRegisterElimination)
395+
addPass(createRISCVDeadRegisterDefinitionsPass());
393396
return TargetPassConfig::addRegAssignAndRewriteFast();
394397
}
395398

396399
bool RISCVPassConfig::addRegAssignAndRewriteOptimized() {
397400
addPass(createRVVRegAllocPass(true));
398401
addPass(createVirtRegRewriter(false));
399402
addPass(createRISCVCoalesceVSETVLIPass());
403+
if (TM->getOptLevel() != CodeGenOptLevel::None &&
404+
EnableRISCVDeadRegisterElimination)
405+
addPass(createRISCVDeadRegisterDefinitionsPass());
400406
return TargetPassConfig::addRegAssignAndRewriteOptimized();
401407
}
402408

@@ -536,9 +542,6 @@ void RISCVPassConfig::addPreRegAlloc() {
536542
if (TM->getOptLevel() != CodeGenOptLevel::None)
537543
addPass(createRISCVMergeBaseOffsetOptPass());
538544
addPass(createRISCVInsertVSETVLIPass());
539-
if (TM->getOptLevel() != CodeGenOptLevel::None &&
540-
EnableRISCVDeadRegisterElimination)
541-
addPass(createRISCVDeadRegisterDefinitionsPass());
542545
addPass(createRISCVInsertReadWriteCSRPass());
543546
addPass(createRISCVInsertWriteVXRMPass());
544547
}

llvm/test/CodeGen/RISCV/O3-pipeline.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@
116116
; CHECK-NEXT: RISC-V Pre-RA pseudo instruction expansion pass
117117
; CHECK-NEXT: RISC-V Merge Base Offset
118118
; CHECK-NEXT: RISC-V Insert VSETVLI pass
119-
; CHECK-NEXT: RISC-V Dead register definitions
120119
; CHECK-NEXT: RISC-V Insert Read/Write CSR Pass
121120
; CHECK-NEXT: RISC-V Insert Write VXRM Pass
122121
; CHECK-NEXT: Detect Dead Lanes
@@ -144,6 +143,7 @@
144143
; CHECK-NEXT: Greedy Register Allocator
145144
; CHECK-NEXT: Virtual Register Rewriter
146145
; CHECK-NEXT: RISC-V Coalesce VSETVLI pass
146+
; CHECK-NEXT: RISC-V Dead register definitions
147147
; CHECK-NEXT: Virtual Register Map
148148
; CHECK-NEXT: Live Register Matrix
149149
; CHECK-NEXT: Greedy Register Allocator

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,13 @@ define <vscale x 1 x double> @test3(i64 %avl, i8 zeroext %cond, <vscale x 1 x do
8888
; CHECK: # %bb.0: # %entry
8989
; CHECK-NEXT: beqz a1, .LBB2_2
9090
; CHECK-NEXT: # %bb.1: # %if.then
91-
; CHECK-NEXT: vsetvli a0, a0, e64, m1, ta, ma
91+
; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma
9292
; CHECK-NEXT: vfadd.vv v9, v8, v9
9393
; CHECK-NEXT: vfmul.vv v8, v9, v8
9494
; CHECK-NEXT: # implicit-def: $x10
9595
; CHECK-NEXT: ret
9696
; CHECK-NEXT: .LBB2_2: # %if.else
97-
; CHECK-NEXT: vsetvli a0, a0, e64, m1, ta, ma
97+
; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma
9898
; CHECK-NEXT: vfsub.vv v9, v8, v9
9999
; CHECK-NEXT: vfmul.vv v8, v9, v8
100100
; CHECK-NEXT: # implicit-def: $x10

0 commit comments

Comments
 (0)