Skip to content

Commit 972709a

Browse files
authored
[RISCV][GISel] Minor refactoring of RISCVCallReturnHandler and RISCVIncomingValueHandler to match other targets (llvm#69757)
Forward assignValueToReg to the base class to make the copy. Add markPhysRegUsed to contain the differences between call handling and argument handling. Introduce RISCVFormalArgHandler. This structure matches how AArch64, AMDGPU, and X86 are structured. I've also added `MIRBuilder.getMRI()->addLiveIn(PhysReg);` to match the other targets.
1 parent 6456e0b commit 972709a

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

llvm/lib/Target/RISCV/GISel/RISCVCallLowering.cpp

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -164,28 +164,39 @@ struct RISCVIncomingValueHandler : public CallLowering::IncomingValueHandler {
164164

165165
void assignValueToReg(Register ValVReg, Register PhysReg,
166166
CCValAssign VA) override {
167-
// Copy argument received in physical register to desired VReg.
168-
MIRBuilder.getMBB().addLiveIn(PhysReg);
169-
MIRBuilder.buildCopy(ValVReg, PhysReg);
167+
markPhysRegUsed(PhysReg);
168+
IncomingValueHandler::assignValueToReg(ValVReg, PhysReg, VA);
170169
}
171170

171+
/// How the physical register gets marked varies between formal
172+
/// parameters (it's a basic-block live-in), and a call instruction
173+
/// (it's an implicit-def of the BL).
174+
virtual void markPhysRegUsed(MCRegister PhysReg) = 0;
175+
172176
private:
173177
const RISCVSubtarget &Subtarget;
174178
};
175179

180+
struct RISCVFormalArgHandler : public RISCVIncomingValueHandler {
181+
RISCVFormalArgHandler(MachineIRBuilder &B, MachineRegisterInfo &MRI)
182+
: RISCVIncomingValueHandler(B, MRI) {}
183+
184+
void markPhysRegUsed(MCRegister PhysReg) override {
185+
MIRBuilder.getMRI()->addLiveIn(PhysReg);
186+
MIRBuilder.getMBB().addLiveIn(PhysReg);
187+
}
188+
};
189+
176190
struct RISCVCallReturnHandler : public RISCVIncomingValueHandler {
177191
RISCVCallReturnHandler(MachineIRBuilder &B, MachineRegisterInfo &MRI,
178192
MachineInstrBuilder &MIB)
179193
: RISCVIncomingValueHandler(B, MRI), MIB(MIB) {}
180194

181-
MachineInstrBuilder MIB;
182-
183-
void assignValueToReg(Register ValVReg, Register PhysReg,
184-
CCValAssign VA) override {
185-
// Copy argument received in physical register to desired VReg.
195+
void markPhysRegUsed(MCRegister PhysReg) override {
186196
MIB.addDef(PhysReg, RegState::Implicit);
187-
MIRBuilder.buildCopy(ValVReg, PhysReg);
188197
}
198+
199+
MachineInstrBuilder MIB;
189200
};
190201

191202
} // namespace
@@ -312,7 +323,7 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
312323
RISCVIncomingValueAssigner Assigner(
313324
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
314325
/*IsRet=*/false);
315-
RISCVIncomingValueHandler Handler(MIRBuilder, MF.getRegInfo());
326+
RISCVFormalArgHandler Handler(MIRBuilder, MF.getRegInfo());
316327

317328
return determineAndHandleAssignments(Handler, Assigner, SplitArgInfos,
318329
MIRBuilder, CC, F.isVarArg());

0 commit comments

Comments
 (0)