blob: cbe9e60864d368af08fe5904c4c3f3a919bfa747 [file] [log] [blame]
Zvi Rackover76dbf262016-11-15 06:34:33 +00001//===-- llvm/lib/Target/X86/X86CallLowering.cpp - Call lowering -----------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9///
10/// \file
11/// This file implements the lowering of LLVM calls to machine code calls for
12/// GlobalISel.
13///
14//===----------------------------------------------------------------------===//
15
16#include "X86CallLowering.h"
Igor Breger8a924be2017-03-23 12:13:29 +000017#include "X86CallingConv.h"
Zvi Rackover76dbf262016-11-15 06:34:33 +000018#include "X86ISelLowering.h"
19#include "X86InstrInfo.h"
Igor Breger9ea154d2017-01-29 08:35:42 +000020#include "X86TargetMachine.h"
Igor Breger9ea154d2017-01-29 08:35:42 +000021
Igor Breger9d5571a2017-07-05 06:24:13 +000022#include "llvm/CodeGen/Analysis.h"
Zvi Rackover76dbf262016-11-15 06:34:33 +000023#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
Igor Breger88a3d5c2017-08-20 09:25:22 +000024#include "llvm/CodeGen/GlobalISel/Utils.h"
Igor Breger9ea154d2017-01-29 08:35:42 +000025#include "llvm/CodeGen/MachineRegisterInfo.h"
Igor Breger8a924be2017-03-23 12:13:29 +000026#include "llvm/CodeGen/MachineValueType.h"
Igor Breger9ea154d2017-01-29 08:35:42 +000027#include "llvm/Target/TargetSubtargetInfo.h"
Zvi Rackover76dbf262016-11-15 06:34:33 +000028
29using namespace llvm;
30
Igor Breger9ea154d2017-01-29 08:35:42 +000031#include "X86GenCallingConv.inc"
32
Zvi Rackover76dbf262016-11-15 06:34:33 +000033X86CallLowering::X86CallLowering(const X86TargetLowering &TLI)
34 : CallLowering(&TLI) {}
35
Igor Breger9d5571a2017-07-05 06:24:13 +000036bool X86CallLowering::splitToValueTypes(const ArgInfo &OrigArg,
Igor Breger5c31a4c2017-02-06 08:37:41 +000037 SmallVectorImpl<ArgInfo> &SplitArgs,
38 const DataLayout &DL,
39 MachineRegisterInfo &MRI,
40 SplitArgTy PerformArgSplit) const {
41
42 const X86TargetLowering &TLI = *getTLI<X86TargetLowering>();
43 LLVMContext &Context = OrigArg.Ty->getContext();
Igor Breger9d5571a2017-07-05 06:24:13 +000044
45 SmallVector<EVT, 4> SplitVTs;
46 SmallVector<uint64_t, 4> Offsets;
47 ComputeValueVTs(TLI, DL, OrigArg.Ty, SplitVTs, &Offsets, 0);
48
49 if (SplitVTs.size() != 1) {
50 // TODO: support struct/array split
51 return false;
52 }
53
54 EVT VT = SplitVTs[0];
Igor Breger5c31a4c2017-02-06 08:37:41 +000055 unsigned NumParts = TLI.getNumRegisters(Context, VT);
56
57 if (NumParts == 1) {
Igor Bregera8ba5722017-03-23 15:25:57 +000058 // replace the original type ( pointer -> GPR ).
59 SplitArgs.emplace_back(OrigArg.Reg, VT.getTypeForEVT(Context),
60 OrigArg.Flags, OrigArg.IsFixed);
Igor Breger9d5571a2017-07-05 06:24:13 +000061 return true;
Igor Breger5c31a4c2017-02-06 08:37:41 +000062 }
63
Igor Breger5c31a4c2017-02-06 08:37:41 +000064 SmallVector<unsigned, 8> SplitRegs;
65
66 EVT PartVT = TLI.getRegisterType(Context, VT);
67 Type *PartTy = PartVT.getTypeForEVT(Context);
68
69 for (unsigned i = 0; i < NumParts; ++i) {
Daniel Sanders52b4ce72017-03-07 23:20:35 +000070 ArgInfo Info =
71 ArgInfo{MRI.createGenericVirtualRegister(getLLTForType(*PartTy, DL)),
72 PartTy, OrigArg.Flags};
Igor Breger5c31a4c2017-02-06 08:37:41 +000073 SplitArgs.push_back(Info);
Igor Breger87aafa02017-04-24 17:05:52 +000074 SplitRegs.push_back(Info.Reg);
Igor Breger5c31a4c2017-02-06 08:37:41 +000075 }
Igor Breger87aafa02017-04-24 17:05:52 +000076
77 PerformArgSplit(SplitRegs);
Igor Breger9d5571a2017-07-05 06:24:13 +000078 return true;
Igor Breger5c31a4c2017-02-06 08:37:41 +000079}
80
81namespace {
Igor Breger88a3d5c2017-08-20 09:25:22 +000082struct OutgoingValueHandler : public CallLowering::ValueHandler {
83 OutgoingValueHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI,
84 MachineInstrBuilder &MIB, CCAssignFn *AssignFn)
85 : ValueHandler(MIRBuilder, MRI, AssignFn), MIB(MIB), StackSize(0),
86 DL(MIRBuilder.getMF().getDataLayout()),
87 STI(MIRBuilder.getMF().getSubtarget<X86Subtarget>()) {}
Igor Breger5c31a4c2017-02-06 08:37:41 +000088
89 unsigned getStackAddress(uint64_t Size, int64_t Offset,
90 MachinePointerInfo &MPO) override {
Igor Breger88a3d5c2017-08-20 09:25:22 +000091
92 LLT p0 = LLT::pointer(0, DL.getPointerSizeInBits(0));
93 LLT SType = LLT::scalar(DL.getPointerSizeInBits(0));
94 unsigned SPReg = MRI.createGenericVirtualRegister(p0);
95 MIRBuilder.buildCopy(SPReg, STI.getRegisterInfo()->getStackRegister());
96
97 unsigned OffsetReg = MRI.createGenericVirtualRegister(SType);
98 MIRBuilder.buildConstant(OffsetReg, Offset);
99
100 unsigned AddrReg = MRI.createGenericVirtualRegister(p0);
101 MIRBuilder.buildGEP(AddrReg, SPReg, OffsetReg);
102
103 MPO = MachinePointerInfo::getStack(MIRBuilder.getMF(), Offset);
104 return AddrReg;
Igor Breger5c31a4c2017-02-06 08:37:41 +0000105 }
106
107 void assignValueToReg(unsigned ValVReg, unsigned PhysReg,
108 CCValAssign &VA) override {
109 MIB.addUse(PhysReg, RegState::Implicit);
110 unsigned ExtReg = extendRegister(ValVReg, VA);
111 MIRBuilder.buildCopy(PhysReg, ExtReg);
112 }
113
114 void assignValueToAddress(unsigned ValVReg, unsigned Addr, uint64_t Size,
115 MachinePointerInfo &MPO, CCValAssign &VA) override {
Igor Breger88a3d5c2017-08-20 09:25:22 +0000116
117 unsigned ExtReg = extendRegister(ValVReg, VA);
118 auto MMO = MIRBuilder.getMF().getMachineMemOperand(
119 MPO, MachineMemOperand::MOStore, VA.getLocVT().getStoreSize(),
120 /* Alignment */ 0);
121 MIRBuilder.buildStore(ExtReg, Addr, *MMO);
Igor Breger5c31a4c2017-02-06 08:37:41 +0000122 }
123
Igor Breger88a3d5c2017-08-20 09:25:22 +0000124 bool assignArg(unsigned ValNo, MVT ValVT, MVT LocVT,
125 CCValAssign::LocInfo LocInfo,
126 const CallLowering::ArgInfo &Info, CCState &State) override {
127
128 if (!Info.IsFixed)
129 return true; // TODO: handle variadic function
130
131 bool Res = AssignFn(ValNo, ValVT, LocVT, LocInfo, Info.Flags, State);
132 StackSize = State.getNextStackOffset();
133 return Res;
134 }
135
136 uint64_t getStackSize() { return StackSize; }
137
138protected:
Igor Breger5c31a4c2017-02-06 08:37:41 +0000139 MachineInstrBuilder &MIB;
Igor Breger88a3d5c2017-08-20 09:25:22 +0000140 uint64_t StackSize;
141 const DataLayout &DL;
142 const X86Subtarget &STI;
Igor Breger5c31a4c2017-02-06 08:37:41 +0000143};
144} // End anonymous namespace.
145
Zvi Rackover76dbf262016-11-15 06:34:33 +0000146bool X86CallLowering::lowerReturn(MachineIRBuilder &MIRBuilder,
147 const Value *Val, unsigned VReg) const {
Zvi Rackover76dbf262016-11-15 06:34:33 +0000148
Igor Breger5c31a4c2017-02-06 08:37:41 +0000149 assert(((Val && VReg) || (!Val && !VReg)) && "Return value without a vreg");
Igor Breger9ea154d2017-01-29 08:35:42 +0000150
Igor Breger5c31a4c2017-02-06 08:37:41 +0000151 auto MIB = MIRBuilder.buildInstrNoInsert(X86::RET).addImm(0);
Zvi Rackover76dbf262016-11-15 06:34:33 +0000152
Igor Breger5c31a4c2017-02-06 08:37:41 +0000153 if (VReg) {
154 MachineFunction &MF = MIRBuilder.getMF();
155 MachineRegisterInfo &MRI = MF.getRegInfo();
156 auto &DL = MF.getDataLayout();
157 const Function &F = *MF.getFunction();
158
159 ArgInfo OrigArg{VReg, Val->getType()};
Reid Klecknerb5180542017-03-21 16:57:19 +0000160 setArgFlags(OrigArg, AttributeList::ReturnIndex, DL, F);
Igor Breger5c31a4c2017-02-06 08:37:41 +0000161
162 SmallVector<ArgInfo, 8> SplitArgs;
Igor Breger9d5571a2017-07-05 06:24:13 +0000163 if (!splitToValueTypes(OrigArg, SplitArgs, DL, MRI,
164 [&](ArrayRef<unsigned> Regs) {
165 MIRBuilder.buildUnmerge(Regs, VReg);
166 }))
167 return false;
Igor Breger5c31a4c2017-02-06 08:37:41 +0000168
Igor Breger88a3d5c2017-08-20 09:25:22 +0000169 OutgoingValueHandler Handler(MIRBuilder, MRI, MIB, RetCC_X86);
Igor Breger8a924be2017-03-23 12:13:29 +0000170 if (!handleAssignments(MIRBuilder, SplitArgs, Handler))
Igor Breger5c31a4c2017-02-06 08:37:41 +0000171 return false;
172 }
173
174 MIRBuilder.insertInstr(MIB);
Zvi Rackover76dbf262016-11-15 06:34:33 +0000175 return true;
176}
177
Igor Breger9ea154d2017-01-29 08:35:42 +0000178namespace {
Igor Breger88a3d5c2017-08-20 09:25:22 +0000179struct IncomingValueHandler : public CallLowering::ValueHandler {
180 IncomingValueHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI,
181 CCAssignFn *AssignFn)
182 : ValueHandler(MIRBuilder, MRI, AssignFn),
183 DL(MIRBuilder.getMF().getDataLayout()) {}
Igor Breger9ea154d2017-01-29 08:35:42 +0000184
185 unsigned getStackAddress(uint64_t Size, int64_t Offset,
186 MachinePointerInfo &MPO) override {
187
188 auto &MFI = MIRBuilder.getMF().getFrameInfo();
189 int FI = MFI.CreateFixedObject(Size, Offset, true);
190 MPO = MachinePointerInfo::getFixedStack(MIRBuilder.getMF(), FI);
191
Igor Breger8a924be2017-03-23 12:13:29 +0000192 unsigned AddrReg = MRI.createGenericVirtualRegister(
193 LLT::pointer(0, DL.getPointerSizeInBits(0)));
Igor Breger9ea154d2017-01-29 08:35:42 +0000194 MIRBuilder.buildFrameIndex(AddrReg, FI);
195 return AddrReg;
196 }
197
198 void assignValueToAddress(unsigned ValVReg, unsigned Addr, uint64_t Size,
199 MachinePointerInfo &MPO, CCValAssign &VA) override {
200
201 auto MMO = MIRBuilder.getMF().getMachineMemOperand(
202 MPO, MachineMemOperand::MOLoad | MachineMemOperand::MOInvariant, Size,
203 0);
204 MIRBuilder.buildLoad(ValVReg, Addr, *MMO);
205 }
206
Igor Breger88a3d5c2017-08-20 09:25:22 +0000207protected:
208 const DataLayout &DL;
209};
210
211struct FormalArgHandler : public IncomingValueHandler {
212 FormalArgHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI,
213 CCAssignFn *AssignFn)
214 : IncomingValueHandler(MIRBuilder, MRI, AssignFn) {}
215
Igor Breger9ea154d2017-01-29 08:35:42 +0000216 void assignValueToReg(unsigned ValVReg, unsigned PhysReg,
217 CCValAssign &VA) override {
218 MIRBuilder.getMBB().addLiveIn(PhysReg);
219 MIRBuilder.buildCopy(ValVReg, PhysReg);
220 }
Igor Breger9ea154d2017-01-29 08:35:42 +0000221};
Igor Breger88a3d5c2017-08-20 09:25:22 +0000222
223struct CallReturnHandler : public IncomingValueHandler {
224 CallReturnHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI,
225 CCAssignFn *AssignFn, MachineInstrBuilder &MIB)
226 : IncomingValueHandler(MIRBuilder, MRI, AssignFn), MIB(MIB) {}
227
228 void assignValueToReg(unsigned ValVReg, unsigned PhysReg,
229 CCValAssign &VA) override {
230 MIB.addDef(PhysReg, RegState::Implicit);
231 MIRBuilder.buildCopy(ValVReg, PhysReg);
232 }
233
234protected:
235 MachineInstrBuilder &MIB;
236};
237
Igor Breger8a924be2017-03-23 12:13:29 +0000238} // namespace
Igor Breger9ea154d2017-01-29 08:35:42 +0000239
Zvi Rackover76dbf262016-11-15 06:34:33 +0000240bool X86CallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
241 const Function &F,
242 ArrayRef<unsigned> VRegs) const {
Igor Breger9ea154d2017-01-29 08:35:42 +0000243 if (F.arg_empty())
244 return true;
245
Igor Breger8a924be2017-03-23 12:13:29 +0000246 // TODO: handle variadic function
Igor Breger9ea154d2017-01-29 08:35:42 +0000247 if (F.isVarArg())
248 return false;
249
Igor Breger5c31a4c2017-02-06 08:37:41 +0000250 MachineFunction &MF = MIRBuilder.getMF();
251 MachineRegisterInfo &MRI = MF.getRegInfo();
252 auto DL = MF.getDataLayout();
Igor Breger9ea154d2017-01-29 08:35:42 +0000253
Igor Breger5c31a4c2017-02-06 08:37:41 +0000254 SmallVector<ArgInfo, 8> SplitArgs;
Igor Breger9ea154d2017-01-29 08:35:42 +0000255 unsigned Idx = 0;
Reid Kleckner45707d42017-03-16 22:59:15 +0000256 for (auto &Arg : F.args()) {
Igor Breger0c979d42017-07-05 11:40:35 +0000257
258 // TODO: handle not simple cases.
259 if (Arg.hasAttribute(Attribute::ByVal) ||
260 Arg.hasAttribute(Attribute::InReg) ||
261 Arg.hasAttribute(Attribute::StructRet) ||
262 Arg.hasAttribute(Attribute::SwiftSelf) ||
263 Arg.hasAttribute(Attribute::SwiftError) ||
264 Arg.hasAttribute(Attribute::Nest))
265 return false;
266
Igor Breger5c31a4c2017-02-06 08:37:41 +0000267 ArgInfo OrigArg(VRegs[Idx], Arg.getType());
Igor Breger0c979d42017-07-05 11:40:35 +0000268 setArgFlags(OrigArg, Idx + AttributeList::FirstArgIndex, DL, F);
Igor Breger9d5571a2017-07-05 06:24:13 +0000269 if (!splitToValueTypes(OrigArg, SplitArgs, DL, MRI,
270 [&](ArrayRef<unsigned> Regs) {
271 MIRBuilder.buildMerge(VRegs[Idx], Regs);
272 }))
273 return false;
Igor Breger9ea154d2017-01-29 08:35:42 +0000274 Idx++;
275 }
276
Igor Breger5c31a4c2017-02-06 08:37:41 +0000277 MachineBasicBlock &MBB = MIRBuilder.getMBB();
278 if (!MBB.empty())
Igor Breger8a924be2017-03-23 12:13:29 +0000279 MIRBuilder.setInstr(*MBB.begin());
Igor Breger5c31a4c2017-02-06 08:37:41 +0000280
Igor Breger88a3d5c2017-08-20 09:25:22 +0000281 FormalArgHandler Handler(MIRBuilder, MRI, CC_X86);
Igor Breger5c31a4c2017-02-06 08:37:41 +0000282 if (!handleAssignments(MIRBuilder, SplitArgs, Handler))
283 return false;
284
285 // Move back to the end of the basic block.
286 MIRBuilder.setMBB(MBB);
287
288 return true;
Zvi Rackover76dbf262016-11-15 06:34:33 +0000289}
Igor Breger88a3d5c2017-08-20 09:25:22 +0000290
291bool X86CallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
292 CallingConv::ID CallConv,
293 const MachineOperand &Callee,
294 const ArgInfo &OrigRet,
295 ArrayRef<ArgInfo> OrigArgs) const {
296
297 MachineFunction &MF = MIRBuilder.getMF();
298 const Function &F = *MF.getFunction();
299 MachineRegisterInfo &MRI = MF.getRegInfo();
300 auto &DL = F.getParent()->getDataLayout();
301 const X86Subtarget &STI = MF.getSubtarget<X86Subtarget>();
302 const TargetInstrInfo &TII = *STI.getInstrInfo();
303 auto TRI = STI.getRegisterInfo();
304
305 // Handle only Linux C, X86_64_SysV calling conventions for now.
306 if (!STI.isTargetLinux() ||
307 !(CallConv == CallingConv::C || CallConv == CallingConv::X86_64_SysV))
308 return false;
309
310 unsigned AdjStackDown = TII.getCallFrameSetupOpcode();
311 auto CallSeqStart = MIRBuilder.buildInstr(AdjStackDown);
312
313 // Create a temporarily-floating call instruction so we can add the implicit
314 // uses of arg registers.
315 bool Is64Bit = STI.is64Bit();
316 unsigned CallOpc = Callee.isReg()
317 ? (Is64Bit ? X86::CALL64r : X86::CALL32r)
318 : (Is64Bit ? X86::CALL64pcrel32 : X86::CALLpcrel32);
319
320 auto MIB = MIRBuilder.buildInstrNoInsert(CallOpc).add(Callee).addRegMask(
321 TRI->getCallPreservedMask(MF, CallConv));
322
323 SmallVector<ArgInfo, 8> SplitArgs;
324 for (const auto &OrigArg : OrigArgs) {
325 if (!splitToValueTypes(OrigArg, SplitArgs, DL, MRI,
326 [&](ArrayRef<unsigned> Regs) {
327 MIRBuilder.buildUnmerge(Regs, OrigArg.Reg);
328 }))
329 return false;
330 }
331 // Do the actual argument marshalling.
332 OutgoingValueHandler Handler(MIRBuilder, MRI, MIB, CC_X86);
333 if (!handleAssignments(MIRBuilder, SplitArgs, Handler))
334 return false;
335
336 // Now we can add the actual call instruction to the correct basic block.
337 MIRBuilder.insertInstr(MIB);
338
339 // If Callee is a reg, since it is used by a target specific
340 // instruction, it must have a register class matching the
341 // constraint of that instruction.
342 if (Callee.isReg())
343 MIB->getOperand(0).setReg(constrainOperandRegClass(
344 MF, *TRI, MRI, *MF.getSubtarget().getInstrInfo(),
345 *MF.getSubtarget().getRegBankInfo(), *MIB, MIB->getDesc(),
346 Callee.getReg(), 0));
347
348 // Finally we can copy the returned value back into its virtual-register. In
349 // symmetry with the arguments, the physical register must be an
350 // implicit-define of the call instruction.
351
352 if (OrigRet.Reg) {
353 SplitArgs.clear();
354 SmallVector<unsigned, 8> NewRegs;
355
356 if (!splitToValueTypes(OrigRet, SplitArgs, DL, MRI,
357 [&](ArrayRef<unsigned> Regs) {
358 NewRegs.assign(Regs.begin(), Regs.end());
359 }))
360 return false;
361
362 CallReturnHandler Handler(MIRBuilder, MRI, RetCC_X86, MIB);
363 if (!handleAssignments(MIRBuilder, SplitArgs, Handler))
364 return false;
365
366 if (!NewRegs.empty())
367 MIRBuilder.buildMerge(OrigRet.Reg, NewRegs);
368 }
369
370 CallSeqStart.addImm(Handler.getStackSize())
371 .addImm(0 /* see getFrameTotalSize */)
372 .addImm(0 /* see getFrameAdjustment */);
373
374 unsigned AdjStackUp = TII.getCallFrameDestroyOpcode();
375 MIRBuilder.buildInstr(AdjStackUp)
376 .addImm(Handler.getStackSize())
377 .addImm(0 /* NumBytesForCalleeToPop */);
378
379 return true;
380}