Skip to content

Commit 086370f

Browse files
sushmaunnibhavimshockwave
authored andcommitted
[M68k][GloballSel] Lower outgoing return values in IRTranslator
Implementation of lowerReturn in the IRTranslator for the M68k backend. Differential Revision: https://reviews.llvm.org/D105332
1 parent 98f0783 commit 086370f

File tree

4 files changed

+93
-11
lines changed

4 files changed

+93
-11
lines changed

llvm/lib/Target/M68k/GlSel/M68kCallLowering.cpp

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,59 @@ using namespace llvm;
2626

2727
M68kCallLowering::M68kCallLowering(const M68kTargetLowering &TLI)
2828
: CallLowering(&TLI) {}
29+
30+
struct OutgoingArgHandler : public CallLowering::OutgoingValueHandler {
31+
OutgoingArgHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI,
32+
MachineInstrBuilder MIB)
33+
: OutgoingValueHandler(MIRBuilder, MRI), MIB(MIB) {}
34+
35+
void assignValueToReg(Register ValVReg, Register PhysReg,
36+
CCValAssign &VA) override {
37+
MIB.addUse(PhysReg, RegState::Implicit);
38+
Register ExtReg = extendRegister(ValVReg, VA);
39+
MIRBuilder.buildCopy(PhysReg, ExtReg);
40+
}
41+
42+
void assignValueToAddress(Register ValVReg, Register Addr, LLT MemTy,
43+
MachinePointerInfo &MPO, CCValAssign &VA) override {
44+
llvm_unreachable("unimplemented");
45+
}
46+
47+
Register getStackAddress(uint64_t Size, int64_t Offset,
48+
MachinePointerInfo &MPO,
49+
ISD::ArgFlagsTy Flags) override {
50+
llvm_unreachable("unimplemented");
51+
}
52+
53+
MachineInstrBuilder MIB;
54+
};
2955
bool M68kCallLowering::lowerReturn(MachineIRBuilder &MIRBuilder,
3056
const Value *Val, ArrayRef<Register> VRegs,
3157
FunctionLoweringInfo &FLI,
3258
Register SwiftErrorVReg) const {
3359

34-
if (Val)
35-
return false;
36-
MIRBuilder.buildInstr(M68k::RTS);
37-
return true;
60+
auto MIB = MIRBuilder.buildInstrNoInsert(M68k::RTS);
61+
bool Success = true;
62+
MachineFunction &MF = MIRBuilder.getMF();
63+
const Function &F = MF.getFunction();
64+
MachineRegisterInfo &MRI = MF.getRegInfo();
65+
const M68kTargetLowering &TLI = *getTLI<M68kTargetLowering>();
66+
CCAssignFn *AssignFn =
67+
TLI.getCCAssignFn(F.getCallingConv(), true, F.isVarArg());
68+
auto &DL = F.getParent()->getDataLayout();
69+
if (!VRegs.empty()) {
70+
SmallVector<ArgInfo, 8> SplitArgs;
71+
ArgInfo OrigArg{VRegs, Val->getType()};
72+
setArgFlags(OrigArg, AttributeList::ReturnIndex, DL, F);
73+
splitToValueTypes(OrigArg, SplitArgs, DL, F.getCallingConv());
74+
OutgoingValueAssigner ArgAssigner(AssignFn);
75+
OutgoingArgHandler ArgHandler(MIRBuilder, MRI, MIB);
76+
Success = determineAndHandleAssignments(ArgHandler, ArgAssigner, SplitArgs,
77+
MIRBuilder, F.getCallingConv(),
78+
F.isVarArg());
79+
}
80+
MIRBuilder.insertInstr(MIB);
81+
return Success;
3882
}
3983

4084
bool M68kCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
@@ -56,7 +100,7 @@ bool M68kCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
56100
}
57101

58102
CCAssignFn *AssignFn =
59-
TLI.getCCAssignFnForCall(F.getCallingConv(), false, F.isVarArg());
103+
TLI.getCCAssignFn(F.getCallingConv(), false, F.isVarArg());
60104
IncomingValueAssigner ArgAssigner(AssignFn);
61105
FormalArgHandler ArgHandler(MIRBuilder, MRI);
62106
return determineAndHandleAssignments(ArgHandler, ArgAssigner, SplitArgs,

llvm/lib/Target/M68k/M68kISelLowering.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3413,8 +3413,10 @@ const char *M68kTargetLowering::getTargetNodeName(unsigned Opcode) const {
34133413
}
34143414
}
34153415

3416-
CCAssignFn *M68kTargetLowering::getCCAssignFnForCall(CallingConv::ID CC,
3417-
bool Return,
3418-
bool IsVarArg) const {
3419-
return CC_M68k_C;
3416+
CCAssignFn *M68kTargetLowering::getCCAssignFn(CallingConv::ID CC, bool Return,
3417+
bool IsVarArg) const {
3418+
if (Return)
3419+
return RetCC_M68k_C;
3420+
else
3421+
return CC_M68k_C;
34203422
}

llvm/lib/Target/M68k/M68kISelLowering.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,8 @@ class M68kTargetLowering : public TargetLowering {
171171
EmitInstrWithCustomInserter(MachineInstr &MI,
172172
MachineBasicBlock *MBB) const override;
173173

174-
CCAssignFn *getCCAssignFnForCall(CallingConv::ID CC, bool Return,
175-
bool IsVarArg) const;
174+
CCAssignFn *getCCAssignFn(CallingConv::ID CC, bool Return,
175+
bool IsVarArg) const;
176176

177177
private:
178178
unsigned GetAlignedArgumentStackSize(unsigned StackSize,

llvm/test/CodeGen/M68k/GlobalISel/irtranslator-ret.ll

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,3 +175,39 @@ define void @test_arg_lowering_struct(%struct.A %a) #0 {
175175
; CHECK: RTS
176176
ret void
177177
}
178+
179+
define i8 @test_ret1(i8 %a) {
180+
; CHECK-LABEL: name: test_ret1
181+
; CHECK: bb.1 (%ir-block.0):
182+
; CHECK: [[G_F_I1:%[0-9]+]]:_(p0) = G_FRAME_INDEX
183+
; CHECK: [[G_LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[G_F_I1]](p0)
184+
; CHECK: [[G_TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[G_LOAD1]](s32)
185+
; CHECK: $bd0 = COPY [[G_TRUNC1]](s8)
186+
; CHECK: RTS implicit $bd0
187+
ret i8 %a
188+
}
189+
190+
define i32 @test_ret2(i32 %a) {
191+
; CHECK-LABEL: name: test_ret2
192+
; CHECK: bb.1 (%ir-block.0):
193+
; CHECK: [[G_F_I1:%[0-9]+]]:_(p0) = G_FRAME_INDEX
194+
; CHECK: [[G_LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[G_F_I1]](p0)
195+
; CHECK: $d0 = COPY [[G_LOAD1]](s32)
196+
; CHECK: RTS implicit $d0
197+
ret i32 %a
198+
}
199+
200+
define i64 @test_ret3(i64 %a) {
201+
; CHECK-LABEL: name: test_ret3
202+
; CHECK: bb.1 (%ir-block.0):
203+
; CHECK: [[G_F_I1:%[0-9]+]]:_(p0) = G_FRAME_INDEX
204+
; CHECK: [[G_LOAD1:%[0-9]+]]:_(s32) = G_LOAD [[G_F_I1]](p0)
205+
; CHECK: [[G_F_I2:%[0-9]+]]:_(p0) = G_FRAME_INDEX
206+
; CHECK: [[G_LOAD2:%[0-9]+]]:_(s32) = G_LOAD [[G_F_I2]](p0)
207+
; CHECK: [[G_MERGE_VAL:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[G_LOAD1]](s32), [[G_LOAD2]](s32)
208+
; CHECK: [[G_UNMERGE_VAL1:%[0-9]+]]:_(s32), [[G_UNMERGE_VAL2:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[G_MERGE_VAL]](s64)
209+
; CHECK: $d0 = COPY [[G_UNMERGE_VAL1]](s32)
210+
; CHECK: $d1 = COPY [[G_UNMERGE_VAL2]](s32)
211+
; CHECK: RTS implicit $d0, implicit $d1
212+
ret i64 %a
213+
}

0 commit comments

Comments
 (0)