1 //===- llvm/lib/Target/X86/X86CallLowering.cpp - Call lowering ------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
10 /// This file implements the lowering of LLVM calls to machine code calls for
13 //===----------------------------------------------------------------------===//
15 #include "X86CallLowering.h"
16 #include "X86CallingConv.h"
17 #include "X86ISelLowering.h"
18 #include "X86InstrInfo.h"
19 #include "X86RegisterInfo.h"
20 #include "X86Subtarget.h"
21 #include "llvm/ADT/ArrayRef.h"
22 #include "llvm/ADT/SmallVector.h"
23 #include "llvm/CodeGen/Analysis.h"
24 #include "llvm/CodeGen/CallingConvLower.h"
25 #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
26 #include "llvm/CodeGen/GlobalISel/Utils.h"
27 #include "llvm/CodeGen/LowLevelType.h"
28 #include "llvm/CodeGen/MachineBasicBlock.h"
29 #include "llvm/CodeGen/MachineFrameInfo.h"
30 #include "llvm/CodeGen/MachineFunction.h"
31 #include "llvm/CodeGen/MachineInstrBuilder.h"
32 #include "llvm/CodeGen/MachineMemOperand.h"
33 #include "llvm/CodeGen/MachineOperand.h"
34 #include "llvm/CodeGen/MachineRegisterInfo.h"
35 #include "llvm/CodeGen/TargetInstrInfo.h"
36 #include "llvm/CodeGen/TargetSubtargetInfo.h"
37 #include "llvm/CodeGen/ValueTypes.h"
38 #include "llvm/IR/Attributes.h"
39 #include "llvm/IR/DataLayout.h"
40 #include "llvm/IR/Function.h"
41 #include "llvm/IR/Value.h"
42 #include "llvm/MC/MCRegisterInfo.h"
43 #include "llvm/Support/LowLevelTypeImpl.h"
44 #include "llvm/Support/MachineValueType.h"
50 X86CallLowering::X86CallLowering(const X86TargetLowering
&TLI
)
51 : CallLowering(&TLI
) {}
53 bool X86CallLowering::splitToValueTypes(const ArgInfo
&OrigArg
,
54 SmallVectorImpl
<ArgInfo
> &SplitArgs
,
56 MachineRegisterInfo
&MRI
,
57 SplitArgTy PerformArgSplit
) const {
58 const X86TargetLowering
&TLI
= *getTLI
<X86TargetLowering
>();
59 LLVMContext
&Context
= OrigArg
.Ty
->getContext();
61 SmallVector
<EVT
, 4> SplitVTs
;
62 SmallVector
<uint64_t, 4> Offsets
;
63 ComputeValueVTs(TLI
, DL
, OrigArg
.Ty
, SplitVTs
, &Offsets
, 0);
64 assert(OrigArg
.Regs
.size() == 1 && "Can't handle multple regs yet");
66 if (OrigArg
.Ty
->isVoidTy())
70 unsigned NumParts
= TLI
.getNumRegisters(Context
, VT
);
73 // replace the original type ( pointer -> GPR ).
74 SplitArgs
.emplace_back(OrigArg
.Regs
[0], VT
.getTypeForEVT(Context
),
75 OrigArg
.Flags
, OrigArg
.IsFixed
);
79 SmallVector
<Register
, 8> SplitRegs
;
81 EVT PartVT
= TLI
.getRegisterType(Context
, VT
);
82 Type
*PartTy
= PartVT
.getTypeForEVT(Context
);
84 for (unsigned i
= 0; i
< NumParts
; ++i
) {
86 ArgInfo
{MRI
.createGenericVirtualRegister(getLLTForType(*PartTy
, DL
)),
87 PartTy
, OrigArg
.Flags
};
88 SplitArgs
.push_back(Info
);
89 SplitRegs
.push_back(Info
.Regs
[0]);
92 PerformArgSplit(SplitRegs
);
98 struct OutgoingValueHandler
: public CallLowering::ValueHandler
{
99 OutgoingValueHandler(MachineIRBuilder
&MIRBuilder
, MachineRegisterInfo
&MRI
,
100 MachineInstrBuilder
&MIB
, CCAssignFn
*AssignFn
)
101 : ValueHandler(MIRBuilder
, MRI
, AssignFn
), MIB(MIB
),
102 DL(MIRBuilder
.getMF().getDataLayout()),
103 STI(MIRBuilder
.getMF().getSubtarget
<X86Subtarget
>()) {}
105 Register
getStackAddress(uint64_t Size
, int64_t Offset
,
106 MachinePointerInfo
&MPO
) override
{
107 LLT p0
= LLT::pointer(0, DL
.getPointerSizeInBits(0));
108 LLT SType
= LLT::scalar(DL
.getPointerSizeInBits(0));
109 Register SPReg
= MRI
.createGenericVirtualRegister(p0
);
110 MIRBuilder
.buildCopy(SPReg
, STI
.getRegisterInfo()->getStackRegister());
112 Register OffsetReg
= MRI
.createGenericVirtualRegister(SType
);
113 MIRBuilder
.buildConstant(OffsetReg
, Offset
);
115 Register AddrReg
= MRI
.createGenericVirtualRegister(p0
);
116 MIRBuilder
.buildGEP(AddrReg
, SPReg
, OffsetReg
);
118 MPO
= MachinePointerInfo::getStack(MIRBuilder
.getMF(), Offset
);
122 void assignValueToReg(Register ValVReg
, Register PhysReg
,
123 CCValAssign
&VA
) override
{
124 MIB
.addUse(PhysReg
, RegState::Implicit
);
127 // If we are copying the value to a physical register with the
128 // size larger than the size of the value itself - build AnyExt
129 // to the size of the register first and only then do the copy.
130 // The example of that would be copying from s32 to xmm0, for which
131 // case ValVT == LocVT == MVT::f32. If LocSize and ValSize are not equal
132 // we expect normal extendRegister mechanism to work.
133 unsigned PhysRegSize
=
134 MRI
.getTargetRegisterInfo()->getRegSizeInBits(PhysReg
, MRI
);
135 unsigned ValSize
= VA
.getValVT().getSizeInBits();
136 unsigned LocSize
= VA
.getLocVT().getSizeInBits();
137 if (PhysRegSize
> ValSize
&& LocSize
== ValSize
) {
138 assert((PhysRegSize
== 128 || PhysRegSize
== 80) && "We expect that to be 128 bit");
139 auto MIB
= MIRBuilder
.buildAnyExt(LLT::scalar(PhysRegSize
), ValVReg
);
140 ExtReg
= MIB
->getOperand(0).getReg();
142 ExtReg
= extendRegister(ValVReg
, VA
);
144 MIRBuilder
.buildCopy(PhysReg
, ExtReg
);
147 void assignValueToAddress(Register ValVReg
, Register Addr
, uint64_t Size
,
148 MachinePointerInfo
&MPO
, CCValAssign
&VA
) override
{
149 Register ExtReg
= extendRegister(ValVReg
, VA
);
150 auto MMO
= MIRBuilder
.getMF().getMachineMemOperand(
151 MPO
, MachineMemOperand::MOStore
, VA
.getLocVT().getStoreSize(),
153 MIRBuilder
.buildStore(ExtReg
, Addr
, *MMO
);
156 bool assignArg(unsigned ValNo
, MVT ValVT
, MVT LocVT
,
157 CCValAssign::LocInfo LocInfo
,
158 const CallLowering::ArgInfo
&Info
, CCState
&State
) override
{
159 bool Res
= AssignFn(ValNo
, ValVT
, LocVT
, LocInfo
, Info
.Flags
, State
);
160 StackSize
= State
.getNextStackOffset();
162 static const MCPhysReg XMMArgRegs
[] = {X86::XMM0
, X86::XMM1
, X86::XMM2
,
163 X86::XMM3
, X86::XMM4
, X86::XMM5
,
164 X86::XMM6
, X86::XMM7
};
166 NumXMMRegs
= State
.getFirstUnallocated(XMMArgRegs
);
171 uint64_t getStackSize() { return StackSize
; }
172 uint64_t getNumXmmRegs() { return NumXMMRegs
; }
175 MachineInstrBuilder
&MIB
;
176 uint64_t StackSize
= 0;
177 const DataLayout
&DL
;
178 const X86Subtarget
&STI
;
179 unsigned NumXMMRegs
= 0;
182 } // end anonymous namespace
184 bool X86CallLowering::lowerReturn(
185 MachineIRBuilder
&MIRBuilder
, const Value
*Val
,
186 ArrayRef
<Register
> VRegs
) const {
187 assert(((Val
&& !VRegs
.empty()) || (!Val
&& VRegs
.empty())) &&
188 "Return value without a vreg");
189 auto MIB
= MIRBuilder
.buildInstrNoInsert(X86::RET
).addImm(0);
191 if (!VRegs
.empty()) {
192 MachineFunction
&MF
= MIRBuilder
.getMF();
193 const Function
&F
= MF
.getFunction();
194 MachineRegisterInfo
&MRI
= MF
.getRegInfo();
195 auto &DL
= MF
.getDataLayout();
196 LLVMContext
&Ctx
= Val
->getType()->getContext();
197 const X86TargetLowering
&TLI
= *getTLI
<X86TargetLowering
>();
199 SmallVector
<EVT
, 4> SplitEVTs
;
200 ComputeValueVTs(TLI
, DL
, Val
->getType(), SplitEVTs
);
201 assert(VRegs
.size() == SplitEVTs
.size() &&
202 "For each split Type there should be exactly one VReg.");
204 SmallVector
<ArgInfo
, 8> SplitArgs
;
205 for (unsigned i
= 0; i
< SplitEVTs
.size(); ++i
) {
206 ArgInfo CurArgInfo
= ArgInfo
{VRegs
[i
], SplitEVTs
[i
].getTypeForEVT(Ctx
)};
207 setArgFlags(CurArgInfo
, AttributeList::ReturnIndex
, DL
, F
);
208 if (!splitToValueTypes(CurArgInfo
, SplitArgs
, DL
, MRI
,
209 [&](ArrayRef
<Register
> Regs
) {
210 MIRBuilder
.buildUnmerge(Regs
, VRegs
[i
]);
215 OutgoingValueHandler
Handler(MIRBuilder
, MRI
, MIB
, RetCC_X86
);
216 if (!handleAssignments(MIRBuilder
, SplitArgs
, Handler
))
220 MIRBuilder
.insertInstr(MIB
);
226 struct IncomingValueHandler
: public CallLowering::ValueHandler
{
227 IncomingValueHandler(MachineIRBuilder
&MIRBuilder
, MachineRegisterInfo
&MRI
,
228 CCAssignFn
*AssignFn
)
229 : ValueHandler(MIRBuilder
, MRI
, AssignFn
),
230 DL(MIRBuilder
.getMF().getDataLayout()) {}
232 bool isArgumentHandler() const override
{ return true; }
234 Register
getStackAddress(uint64_t Size
, int64_t Offset
,
235 MachinePointerInfo
&MPO
) override
{
236 auto &MFI
= MIRBuilder
.getMF().getFrameInfo();
237 int FI
= MFI
.CreateFixedObject(Size
, Offset
, true);
238 MPO
= MachinePointerInfo::getFixedStack(MIRBuilder
.getMF(), FI
);
240 unsigned AddrReg
= MRI
.createGenericVirtualRegister(
241 LLT::pointer(0, DL
.getPointerSizeInBits(0)));
242 MIRBuilder
.buildFrameIndex(AddrReg
, FI
);
246 void assignValueToAddress(Register ValVReg
, Register Addr
, uint64_t Size
,
247 MachinePointerInfo
&MPO
, CCValAssign
&VA
) override
{
248 auto MMO
= MIRBuilder
.getMF().getMachineMemOperand(
249 MPO
, MachineMemOperand::MOLoad
| MachineMemOperand::MOInvariant
, Size
,
251 MIRBuilder
.buildLoad(ValVReg
, Addr
, *MMO
);
254 void assignValueToReg(Register ValVReg
, Register PhysReg
,
255 CCValAssign
&VA
) override
{
256 markPhysRegUsed(PhysReg
);
258 switch (VA
.getLocInfo()) {
260 // If we are copying the value from a physical register with the
261 // size larger than the size of the value itself - build the copy
262 // of the phys reg first and then build the truncation of that copy.
263 // The example of that would be copying from xmm0 to s32, for which
264 // case ValVT == LocVT == MVT::f32. If LocSize and ValSize are not equal
265 // we expect this to be handled in SExt/ZExt/AExt case.
266 unsigned PhysRegSize
=
267 MRI
.getTargetRegisterInfo()->getRegSizeInBits(PhysReg
, MRI
);
268 unsigned ValSize
= VA
.getValVT().getSizeInBits();
269 unsigned LocSize
= VA
.getLocVT().getSizeInBits();
270 if (PhysRegSize
> ValSize
&& LocSize
== ValSize
) {
271 auto Copy
= MIRBuilder
.buildCopy(LLT::scalar(PhysRegSize
), PhysReg
);
272 MIRBuilder
.buildTrunc(ValVReg
, Copy
);
276 MIRBuilder
.buildCopy(ValVReg
, PhysReg
);
279 case CCValAssign::LocInfo::SExt
:
280 case CCValAssign::LocInfo::ZExt
:
281 case CCValAssign::LocInfo::AExt
: {
282 auto Copy
= MIRBuilder
.buildCopy(LLT
{VA
.getLocVT()}, PhysReg
);
283 MIRBuilder
.buildTrunc(ValVReg
, Copy
);
289 /// How the physical register gets marked varies between formal
290 /// parameters (it's a basic-block live-in), and a call instruction
291 /// (it's an implicit-def of the BL).
292 virtual void markPhysRegUsed(unsigned PhysReg
) = 0;
295 const DataLayout
&DL
;
298 struct FormalArgHandler
: public IncomingValueHandler
{
299 FormalArgHandler(MachineIRBuilder
&MIRBuilder
, MachineRegisterInfo
&MRI
,
300 CCAssignFn
*AssignFn
)
301 : IncomingValueHandler(MIRBuilder
, MRI
, AssignFn
) {}
303 void markPhysRegUsed(unsigned PhysReg
) override
{
304 MIRBuilder
.getMBB().addLiveIn(PhysReg
);
308 struct CallReturnHandler
: public IncomingValueHandler
{
309 CallReturnHandler(MachineIRBuilder
&MIRBuilder
, MachineRegisterInfo
&MRI
,
310 CCAssignFn
*AssignFn
, MachineInstrBuilder
&MIB
)
311 : IncomingValueHandler(MIRBuilder
, MRI
, AssignFn
), MIB(MIB
) {}
313 void markPhysRegUsed(unsigned PhysReg
) override
{
314 MIB
.addDef(PhysReg
, RegState::Implicit
);
318 MachineInstrBuilder
&MIB
;
321 } // end anonymous namespace
323 bool X86CallLowering::lowerFormalArguments(
324 MachineIRBuilder
&MIRBuilder
, const Function
&F
,
325 ArrayRef
<ArrayRef
<Register
>> VRegs
) const {
329 // TODO: handle variadic function
333 MachineFunction
&MF
= MIRBuilder
.getMF();
334 MachineRegisterInfo
&MRI
= MF
.getRegInfo();
335 auto DL
= MF
.getDataLayout();
337 SmallVector
<ArgInfo
, 8> SplitArgs
;
339 for (auto &Arg
: F
.args()) {
341 // TODO: handle not simple cases.
342 if (Arg
.hasAttribute(Attribute::ByVal
) ||
343 Arg
.hasAttribute(Attribute::InReg
) ||
344 Arg
.hasAttribute(Attribute::StructRet
) ||
345 Arg
.hasAttribute(Attribute::SwiftSelf
) ||
346 Arg
.hasAttribute(Attribute::SwiftError
) ||
347 Arg
.hasAttribute(Attribute::Nest
) || VRegs
[Idx
].size() > 1)
350 ArgInfo
OrigArg(VRegs
[Idx
], Arg
.getType());
351 setArgFlags(OrigArg
, Idx
+ AttributeList::FirstArgIndex
, DL
, F
);
352 if (!splitToValueTypes(OrigArg
, SplitArgs
, DL
, MRI
,
353 [&](ArrayRef
<Register
> Regs
) {
354 MIRBuilder
.buildMerge(VRegs
[Idx
][0], Regs
);
360 MachineBasicBlock
&MBB
= MIRBuilder
.getMBB();
362 MIRBuilder
.setInstr(*MBB
.begin());
364 FormalArgHandler
Handler(MIRBuilder
, MRI
, CC_X86
);
365 if (!handleAssignments(MIRBuilder
, SplitArgs
, Handler
))
368 // Move back to the end of the basic block.
369 MIRBuilder
.setMBB(MBB
);
374 bool X86CallLowering::lowerCall(MachineIRBuilder
&MIRBuilder
,
375 CallingConv::ID CallConv
,
376 const MachineOperand
&Callee
,
377 const ArgInfo
&OrigRet
,
378 ArrayRef
<ArgInfo
> OrigArgs
) const {
379 MachineFunction
&MF
= MIRBuilder
.getMF();
380 const Function
&F
= MF
.getFunction();
381 MachineRegisterInfo
&MRI
= MF
.getRegInfo();
382 auto &DL
= F
.getParent()->getDataLayout();
383 const X86Subtarget
&STI
= MF
.getSubtarget
<X86Subtarget
>();
384 const TargetInstrInfo
&TII
= *STI
.getInstrInfo();
385 auto TRI
= STI
.getRegisterInfo();
387 // Handle only Linux C, X86_64_SysV calling conventions for now.
388 if (!STI
.isTargetLinux() ||
389 !(CallConv
== CallingConv::C
|| CallConv
== CallingConv::X86_64_SysV
))
392 unsigned AdjStackDown
= TII
.getCallFrameSetupOpcode();
393 auto CallSeqStart
= MIRBuilder
.buildInstr(AdjStackDown
);
395 // Create a temporarily-floating call instruction so we can add the implicit
396 // uses of arg registers.
397 bool Is64Bit
= STI
.is64Bit();
398 unsigned CallOpc
= Callee
.isReg()
399 ? (Is64Bit
? X86::CALL64r
: X86::CALL32r
)
400 : (Is64Bit
? X86::CALL64pcrel32
: X86::CALLpcrel32
);
402 auto MIB
= MIRBuilder
.buildInstrNoInsert(CallOpc
).add(Callee
).addRegMask(
403 TRI
->getCallPreservedMask(MF
, CallConv
));
405 SmallVector
<ArgInfo
, 8> SplitArgs
;
406 for (const auto &OrigArg
: OrigArgs
) {
408 // TODO: handle not simple cases.
409 if (OrigArg
.Flags
.isByVal())
412 if (OrigArg
.Regs
.size() > 1)
415 if (!splitToValueTypes(OrigArg
, SplitArgs
, DL
, MRI
,
416 [&](ArrayRef
<Register
> Regs
) {
417 MIRBuilder
.buildUnmerge(Regs
, OrigArg
.Regs
[0]);
421 // Do the actual argument marshalling.
422 OutgoingValueHandler
Handler(MIRBuilder
, MRI
, MIB
, CC_X86
);
423 if (!handleAssignments(MIRBuilder
, SplitArgs
, Handler
))
426 bool IsFixed
= OrigArgs
.empty() ? true : OrigArgs
.back().IsFixed
;
427 if (STI
.is64Bit() && !IsFixed
&& !STI
.isCallingConvWin64(CallConv
)) {
428 // From AMD64 ABI document:
429 // For calls that may call functions that use varargs or stdargs
430 // (prototype-less calls or calls to functions containing ellipsis (...) in
431 // the declaration) %al is used as hidden argument to specify the number
432 // of SSE registers used. The contents of %al do not need to match exactly
433 // the number of registers, but must be an ubound on the number of SSE
434 // registers used and is in the range 0 - 8 inclusive.
436 MIRBuilder
.buildInstr(X86::MOV8ri
)
438 .addImm(Handler
.getNumXmmRegs());
439 MIB
.addUse(X86::AL
, RegState::Implicit
);
442 // Now we can add the actual call instruction to the correct basic block.
443 MIRBuilder
.insertInstr(MIB
);
445 // If Callee is a reg, since it is used by a target specific
446 // instruction, it must have a register class matching the
447 // constraint of that instruction.
449 MIB
->getOperand(0).setReg(constrainOperandRegClass(
450 MF
, *TRI
, MRI
, *MF
.getSubtarget().getInstrInfo(),
451 *MF
.getSubtarget().getRegBankInfo(), *MIB
, MIB
->getDesc(), Callee
, 0));
453 // Finally we can copy the returned value back into its virtual-register. In
454 // symmetry with the arguments, the physical register must be an
455 // implicit-define of the call instruction.
457 if (!OrigRet
.Ty
->isVoidTy()) {
458 if (OrigRet
.Regs
.size() > 1)
462 SmallVector
<Register
, 8> NewRegs
;
464 if (!splitToValueTypes(OrigRet
, SplitArgs
, DL
, MRI
,
465 [&](ArrayRef
<Register
> Regs
) {
466 NewRegs
.assign(Regs
.begin(), Regs
.end());
470 CallReturnHandler
Handler(MIRBuilder
, MRI
, RetCC_X86
, MIB
);
471 if (!handleAssignments(MIRBuilder
, SplitArgs
, Handler
))
474 if (!NewRegs
.empty())
475 MIRBuilder
.buildMerge(OrigRet
.Regs
[0], NewRegs
);
478 CallSeqStart
.addImm(Handler
.getStackSize())
479 .addImm(0 /* see getFrameTotalSize */)
480 .addImm(0 /* see getFrameAdjustment */);
482 unsigned AdjStackUp
= TII
.getCallFrameDestroyOpcode();
483 MIRBuilder
.buildInstr(AdjStackUp
)
484 .addImm(Handler
.getStackSize())
485 .addImm(0 /* NumBytesForCalleeToPop */);