blob: 5ab327daeca47aa8ea93d334825bad0c0e98b7a3 [file] [log] [blame]
Tim Northoverfe5f89b2016-08-29 19:07:08 +00001//===-- lib/CodeGen/GlobalISel/CallLowering.cpp - Call lowering -----------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Tim Northoverfe5f89b2016-08-29 19:07:08 +00006//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This file implements some simple delegations needed for call lowering.
11///
12//===----------------------------------------------------------------------===//
13
Diana Picusc3dbe232019-06-27 08:54:17 +000014#include "llvm/CodeGen/Analysis.h"
Amara Emersonfbaf4252019-09-03 21:42:28 +000015#include "llvm/CodeGen/GlobalISel/CallLowering.h"
16#include "llvm/CodeGen/GlobalISel/Utils.h"
Diana Picusf11f0422016-12-05 10:40:33 +000017#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
Tim Northoverfe5f89b2016-08-29 19:07:08 +000018#include "llvm/CodeGen/MachineOperand.h"
Diana Picus2d9adbf2016-12-13 10:46:12 +000019#include "llvm/CodeGen/MachineRegisterInfo.h"
David Blaikieb3bde2e2017-11-17 01:07:10 +000020#include "llvm/CodeGen/TargetLowering.h"
Tim Northover9a467182016-09-21 12:57:45 +000021#include "llvm/IR/DataLayout.h"
Diana Picusf11f0422016-12-05 10:40:33 +000022#include "llvm/IR/Instructions.h"
Mark Lacey7b8d3eb2019-07-31 20:34:02 +000023#include "llvm/IR/LLVMContext.h"
Tim Northover9a467182016-09-21 12:57:45 +000024#include "llvm/IR/Module.h"
Tim Northoverfe5f89b2016-08-29 19:07:08 +000025
Amara Emerson2b523f82019-04-09 21:22:33 +000026#define DEBUG_TYPE "call-lowering"
27
Tim Northoverfe5f89b2016-08-29 19:07:08 +000028using namespace llvm;
29
Richard Trieua87b70d2018-12-29 02:02:13 +000030void CallLowering::anchor() {}
31
Craig Topper68eb0862020-04-13 10:17:29 -070032bool CallLowering::lowerCall(MachineIRBuilder &MIRBuilder, const CallBase &CB,
Diana Picus81389962019-06-27 09:15:53 +000033 ArrayRef<Register> ResRegs,
Diana Picus43fb5ae2019-06-27 09:18:03 +000034 ArrayRef<ArrayRef<Register>> ArgRegs,
Matt Arsenaulte3a676e2019-06-24 15:50:29 +000035 Register SwiftErrorVReg,
Tim Northover3b2157a2019-05-24 08:40:13 +000036 std::function<unsigned()> GetCalleeReg) const {
Tim Northovere1a5f662019-08-09 08:26:38 +000037 CallLoweringInfo Info;
Matt Arsenaultcc3b5592020-02-24 14:08:41 -050038 const DataLayout &DL = MIRBuilder.getDataLayout();
Tim Northover9a467182016-09-21 12:57:45 +000039
Tim Northoverfe5f89b2016-08-29 19:07:08 +000040 // First step is to marshall all the function's parameters into the correct
41 // physregs and memory locations. Gather the sequence of argument types that
42 // we'll pass to the assigner function.
Tim Northover9a467182016-09-21 12:57:45 +000043 unsigned i = 0;
Craig Topper68eb0862020-04-13 10:17:29 -070044 unsigned NumFixedArgs = CB.getFunctionType()->getNumParams();
45 for (auto &Arg : CB.args()) {
Tim Northoverd9433542017-01-17 22:30:10 +000046 ArgInfo OrigArg{ArgRegs[i], Arg->getType(), ISD::ArgFlagsTy{},
47 i < NumFixedArgs};
Craig Topper68eb0862020-04-13 10:17:29 -070048 setArgFlags(OrigArg, i + AttributeList::FirstArgIndex, DL, CB);
Tim Northovere1a5f662019-08-09 08:26:38 +000049 Info.OrigArgs.push_back(OrigArg);
Tim Northover9a467182016-09-21 12:57:45 +000050 ++i;
51 }
Tim Northoverfe5f89b2016-08-29 19:07:08 +000052
Amara Emerson067dd9c2020-02-10 15:41:53 -080053 // Try looking through a bitcast from one function type to another.
54 // Commonly happens with calls to objc_msgSend().
Craig Topper68eb0862020-04-13 10:17:29 -070055 const Value *CalleeV = CB.getCalledValue()->stripPointerCasts();
Amara Emerson067dd9c2020-02-10 15:41:53 -080056 if (const Function *F = dyn_cast<Function>(CalleeV))
Tim Northovere1a5f662019-08-09 08:26:38 +000057 Info.Callee = MachineOperand::CreateGA(F, 0);
Amara Emerson067dd9c2020-02-10 15:41:53 -080058 else
59 Info.Callee = MachineOperand::CreateReg(GetCalleeReg(), false);
Tim Northoverfe5f89b2016-08-29 19:07:08 +000060
Craig Topper68eb0862020-04-13 10:17:29 -070061 Info.OrigRet = ArgInfo{ResRegs, CB.getType(), ISD::ArgFlagsTy{}};
Tim Northovere1a5f662019-08-09 08:26:38 +000062 if (!Info.OrigRet.Ty->isVoidTy())
Craig Topper68eb0862020-04-13 10:17:29 -070063 setArgFlags(Info.OrigRet, AttributeList::ReturnIndex, DL, CB);
Tim Northover9a467182016-09-21 12:57:45 +000064
Matt Arsenaultcc3b5592020-02-24 14:08:41 -050065 MachineFunction &MF = MIRBuilder.getMF();
Craig Topper68eb0862020-04-13 10:17:29 -070066 Info.KnownCallees = CB.getMetadata(LLVMContext::MD_callees);
67 Info.CallConv = CB.getCallingConv();
Tim Northovere1a5f662019-08-09 08:26:38 +000068 Info.SwiftErrorVReg = SwiftErrorVReg;
Craig Topper68eb0862020-04-13 10:17:29 -070069 Info.IsMustTailCall = CB.isMustTailCall();
70 Info.IsTailCall =
71 CB.isTailCall() &&
72 isInTailCallPosition(ImmutableCallSite(&CB), MF.getTarget()) &&
73 (MF.getFunction()
74 .getFnAttribute("disable-tail-calls")
75 .getValueAsString() != "true");
76 Info.IsVarArg = CB.getFunctionType()->isVarArg();
Tim Northovere1a5f662019-08-09 08:26:38 +000077 return lowerCall(MIRBuilder, Info);
Tim Northoverfe5f89b2016-08-29 19:07:08 +000078}
Tim Northover9a467182016-09-21 12:57:45 +000079
80template <typename FuncInfoTy>
81void CallLowering::setArgFlags(CallLowering::ArgInfo &Arg, unsigned OpIdx,
82 const DataLayout &DL,
83 const FuncInfoTy &FuncInfo) const {
Amara Emersonfbaf4252019-09-03 21:42:28 +000084 auto &Flags = Arg.Flags[0];
Reid Klecknerb5180542017-03-21 16:57:19 +000085 const AttributeList &Attrs = FuncInfo.getAttributes();
Tim Northover9a467182016-09-21 12:57:45 +000086 if (Attrs.hasAttribute(OpIdx, Attribute::ZExt))
Amara Emersonfbaf4252019-09-03 21:42:28 +000087 Flags.setZExt();
Tim Northover9a467182016-09-21 12:57:45 +000088 if (Attrs.hasAttribute(OpIdx, Attribute::SExt))
Amara Emersonfbaf4252019-09-03 21:42:28 +000089 Flags.setSExt();
Tim Northover9a467182016-09-21 12:57:45 +000090 if (Attrs.hasAttribute(OpIdx, Attribute::InReg))
Amara Emersonfbaf4252019-09-03 21:42:28 +000091 Flags.setInReg();
Tim Northover9a467182016-09-21 12:57:45 +000092 if (Attrs.hasAttribute(OpIdx, Attribute::StructRet))
Amara Emersonfbaf4252019-09-03 21:42:28 +000093 Flags.setSRet();
Tim Northover9a467182016-09-21 12:57:45 +000094 if (Attrs.hasAttribute(OpIdx, Attribute::SwiftSelf))
Amara Emersonfbaf4252019-09-03 21:42:28 +000095 Flags.setSwiftSelf();
Tim Northover9a467182016-09-21 12:57:45 +000096 if (Attrs.hasAttribute(OpIdx, Attribute::SwiftError))
Amara Emersonfbaf4252019-09-03 21:42:28 +000097 Flags.setSwiftError();
Tim Northover9a467182016-09-21 12:57:45 +000098 if (Attrs.hasAttribute(OpIdx, Attribute::ByVal))
Amara Emersonfbaf4252019-09-03 21:42:28 +000099 Flags.setByVal();
Tim Northover9a467182016-09-21 12:57:45 +0000100 if (Attrs.hasAttribute(OpIdx, Attribute::InAlloca))
Amara Emersonfbaf4252019-09-03 21:42:28 +0000101 Flags.setInAlloca();
Tim Northover9a467182016-09-21 12:57:45 +0000102
Amara Emersonfbaf4252019-09-03 21:42:28 +0000103 if (Flags.isByVal() || Flags.isInAlloca()) {
Tim Northover9a467182016-09-21 12:57:45 +0000104 Type *ElementTy = cast<PointerType>(Arg.Ty)->getElementType();
Tim Northoverb7141202019-05-30 18:48:23 +0000105
106 auto Ty = Attrs.getAttribute(OpIdx, Attribute::ByVal).getValueAsType();
Amara Emersonfbaf4252019-09-03 21:42:28 +0000107 Flags.setByValSize(DL.getTypeAllocSize(Ty ? Ty : ElementTy));
Tim Northoverb7141202019-05-30 18:48:23 +0000108
Tim Northover9a467182016-09-21 12:57:45 +0000109 // For ByVal, alignment should be passed from FE. BE will guess if
110 // this info is not there but there are cases it cannot get right.
Guillaume Chatelet9068bcc2020-04-02 15:10:30 +0000111 Align FrameAlign;
112 if (auto ParamAlign = FuncInfo.getParamAlign(OpIdx - 2))
113 FrameAlign = *ParamAlign;
Tim Northover9a467182016-09-21 12:57:45 +0000114 else
Guillaume Chatelet9068bcc2020-04-02 15:10:30 +0000115 FrameAlign = Align(getTLI()->getByValTypeAlignment(ElementTy, DL));
116 Flags.setByValAlign(FrameAlign);
Tim Northover9a467182016-09-21 12:57:45 +0000117 }
118 if (Attrs.hasAttribute(OpIdx, Attribute::Nest))
Amara Emersonfbaf4252019-09-03 21:42:28 +0000119 Flags.setNest();
Guillaume Chateletbac5f6b2019-10-21 11:01:55 +0000120 Flags.setOrigAlign(Align(DL.getABITypeAlignment(Arg.Ty)));
Tim Northover9a467182016-09-21 12:57:45 +0000121}
122
123template void
124CallLowering::setArgFlags<Function>(CallLowering::ArgInfo &Arg, unsigned OpIdx,
125 const DataLayout &DL,
126 const Function &FuncInfo) const;
127
128template void
Craig Topper68eb0862020-04-13 10:17:29 -0700129CallLowering::setArgFlags<CallBase>(CallLowering::ArgInfo &Arg, unsigned OpIdx,
Tim Northover9a467182016-09-21 12:57:45 +0000130 const DataLayout &DL,
Craig Topper68eb0862020-04-13 10:17:29 -0700131 const CallBase &FuncInfo) const;
Diana Picusf11f0422016-12-05 10:40:33 +0000132
Diana Picusc3dbe232019-06-27 08:54:17 +0000133Register CallLowering::packRegs(ArrayRef<Register> SrcRegs, Type *PackedTy,
134 MachineIRBuilder &MIRBuilder) const {
135 assert(SrcRegs.size() > 1 && "Nothing to pack");
136
137 const DataLayout &DL = MIRBuilder.getMF().getDataLayout();
138 MachineRegisterInfo *MRI = MIRBuilder.getMRI();
139
140 LLT PackedLLT = getLLTForType(*PackedTy, DL);
141
142 SmallVector<LLT, 8> LLTs;
143 SmallVector<uint64_t, 8> Offsets;
144 computeValueLLTs(DL, *PackedTy, LLTs, &Offsets);
145 assert(LLTs.size() == SrcRegs.size() && "Regs / types mismatch");
146
147 Register Dst = MRI->createGenericVirtualRegister(PackedLLT);
148 MIRBuilder.buildUndef(Dst);
149 for (unsigned i = 0; i < SrcRegs.size(); ++i) {
150 Register NewDst = MRI->createGenericVirtualRegister(PackedLLT);
151 MIRBuilder.buildInsert(NewDst, Dst, SrcRegs[i], Offsets[i]);
152 Dst = NewDst;
153 }
154
155 return Dst;
156}
157
158void CallLowering::unpackRegs(ArrayRef<Register> DstRegs, Register SrcReg,
159 Type *PackedTy,
160 MachineIRBuilder &MIRBuilder) const {
161 assert(DstRegs.size() > 1 && "Nothing to unpack");
162
Matt Arsenaultcc3b5592020-02-24 14:08:41 -0500163 const DataLayout &DL = MIRBuilder.getDataLayout();
Diana Picusc3dbe232019-06-27 08:54:17 +0000164
165 SmallVector<LLT, 8> LLTs;
166 SmallVector<uint64_t, 8> Offsets;
167 computeValueLLTs(DL, *PackedTy, LLTs, &Offsets);
168 assert(LLTs.size() == DstRegs.size() && "Regs / types mismatch");
169
170 for (unsigned i = 0; i < DstRegs.size(); ++i)
171 MIRBuilder.buildExtract(DstRegs[i], SrcReg, Offsets[i]);
172}
173
Diana Picusf11f0422016-12-05 10:40:33 +0000174bool CallLowering::handleAssignments(MachineIRBuilder &MIRBuilder,
Amara Emersonfbaf4252019-09-03 21:42:28 +0000175 SmallVectorImpl<ArgInfo> &Args,
Diana Picusf11f0422016-12-05 10:40:33 +0000176 ValueHandler &Handler) const {
177 MachineFunction &MF = MIRBuilder.getMF();
Matthias Braunf1caa282017-12-15 22:22:58 +0000178 const Function &F = MF.getFunction();
Diana Picusf11f0422016-12-05 10:40:33 +0000179 SmallVector<CCValAssign, 16> ArgLocs;
180 CCState CCInfo(F.getCallingConv(), F.isVarArg(), MF, ArgLocs, F.getContext());
Matt Arsenault1c3f4ec2019-07-16 22:41:34 +0000181 return handleAssignments(CCInfo, ArgLocs, MIRBuilder, Args, Handler);
182}
183
184bool CallLowering::handleAssignments(CCState &CCInfo,
185 SmallVectorImpl<CCValAssign> &ArgLocs,
186 MachineIRBuilder &MIRBuilder,
Amara Emersonfbaf4252019-09-03 21:42:28 +0000187 SmallVectorImpl<ArgInfo> &Args,
Matt Arsenault1c3f4ec2019-07-16 22:41:34 +0000188 ValueHandler &Handler) const {
189 MachineFunction &MF = MIRBuilder.getMF();
190 const Function &F = MF.getFunction();
191 const DataLayout &DL = F.getParent()->getDataLayout();
Diana Picusf11f0422016-12-05 10:40:33 +0000192
193 unsigned NumArgs = Args.size();
194 for (unsigned i = 0; i != NumArgs; ++i) {
195 MVT CurVT = MVT::getVT(Args[i].Ty);
Amara Emersonfbaf4252019-09-03 21:42:28 +0000196 if (Handler.assignArg(i, CurVT, CurVT, CCValAssign::Full, Args[i],
197 Args[i].Flags[0], CCInfo)) {
198 if (!CurVT.isValid())
Matt Arsenaulte3a676e2019-06-24 15:50:29 +0000199 return false;
Amara Emersonfbaf4252019-09-03 21:42:28 +0000200 MVT NewVT = TLI->getRegisterTypeForCallingConv(
Amara Emerson2b523f82019-04-09 21:22:33 +0000201 F.getContext(), F.getCallingConv(), EVT(CurVT));
Amara Emersonfbaf4252019-09-03 21:42:28 +0000202
203 // If we need to split the type over multiple regs, check it's a scenario
204 // we currently support.
205 unsigned NumParts = TLI->getNumRegistersForCallingConv(
206 F.getContext(), F.getCallingConv(), CurVT);
207 if (NumParts > 1) {
Amara Emersonfbaf4252019-09-03 21:42:28 +0000208 // For now only handle exact splits.
209 if (NewVT.getSizeInBits() * NumParts != CurVT.getSizeInBits())
210 return false;
211 }
212
Quentin Colombet9c36ec52019-10-11 20:22:57 +0000213 // For incoming arguments (physregs to vregs), we could have values in
Amara Emersonfbaf4252019-09-03 21:42:28 +0000214 // physregs (or memlocs) which we want to extract and copy to vregs.
215 // During this, we might have to deal with the LLT being split across
216 // multiple regs, so we have to record this information for later.
217 //
218 // If we have outgoing args, then we have the opposite case. We have a
219 // vreg with an LLT which we want to assign to a physical location, and
220 // we might have to record that the value has to be split later.
221 if (Handler.isIncomingArgumentHandler()) {
222 if (NumParts == 1) {
223 // Try to use the register type if we couldn't assign the VT.
224 if (Handler.assignArg(i, NewVT, NewVT, CCValAssign::Full, Args[i],
225 Args[i].Flags[0], CCInfo))
226 return false;
227 } else {
228 // We're handling an incoming arg which is split over multiple regs.
Quentin Colombet9c36ec52019-10-11 20:22:57 +0000229 // E.g. passing an s128 on AArch64.
Amara Emersonfbaf4252019-09-03 21:42:28 +0000230 ISD::ArgFlagsTy OrigFlags = Args[i].Flags[0];
231 Args[i].OrigRegs.push_back(Args[i].Regs[0]);
232 Args[i].Regs.clear();
233 Args[i].Flags.clear();
234 LLT NewLLT = getLLTForMVT(NewVT);
235 // For each split register, create and assign a vreg that will store
236 // the incoming component of the larger value. These will later be
237 // merged to form the final vreg.
238 for (unsigned Part = 0; Part < NumParts; ++Part) {
239 Register Reg =
240 MIRBuilder.getMRI()->createGenericVirtualRegister(NewLLT);
241 ISD::ArgFlagsTy Flags = OrigFlags;
242 if (Part == 0) {
243 Flags.setSplit();
244 } else {
Guillaume Chatelet805c1572020-01-21 15:00:04 +0100245 Flags.setOrigAlign(Align(1));
Amara Emersonfbaf4252019-09-03 21:42:28 +0000246 if (Part == NumParts - 1)
247 Flags.setSplitEnd();
248 }
249 Args[i].Regs.push_back(Reg);
250 Args[i].Flags.push_back(Flags);
Amara Emerson55d86f02019-09-11 23:53:23 +0000251 if (Handler.assignArg(i + Part, NewVT, NewVT, CCValAssign::Full,
252 Args[i], Args[i].Flags[Part], CCInfo)) {
Amara Emersonfbaf4252019-09-03 21:42:28 +0000253 // Still couldn't assign this smaller part type for some reason.
254 return false;
255 }
256 }
257 }
258 } else {
259 // Handling an outgoing arg that might need to be split.
260 if (NumParts < 2)
261 return false; // Don't know how to deal with this type combination.
262
263 // This type is passed via multiple registers in the calling convention.
264 // We need to extract the individual parts.
265 Register LargeReg = Args[i].Regs[0];
266 LLT SmallTy = LLT::scalar(NewVT.getSizeInBits());
267 auto Unmerge = MIRBuilder.buildUnmerge(SmallTy, LargeReg);
268 assert(Unmerge->getNumOperands() == NumParts + 1);
269 ISD::ArgFlagsTy OrigFlags = Args[i].Flags[0];
270 // We're going to replace the regs and flags with the split ones.
271 Args[i].Regs.clear();
272 Args[i].Flags.clear();
273 for (unsigned PartIdx = 0; PartIdx < NumParts; ++PartIdx) {
274 ISD::ArgFlagsTy Flags = OrigFlags;
275 if (PartIdx == 0) {
276 Flags.setSplit();
277 } else {
Guillaume Chatelet805c1572020-01-21 15:00:04 +0100278 Flags.setOrigAlign(Align(1));
Amara Emersonfbaf4252019-09-03 21:42:28 +0000279 if (PartIdx == NumParts - 1)
280 Flags.setSplitEnd();
281 }
282 Args[i].Regs.push_back(Unmerge.getReg(PartIdx));
283 Args[i].Flags.push_back(Flags);
Amara Emerson55d86f02019-09-11 23:53:23 +0000284 if (Handler.assignArg(i + PartIdx, NewVT, NewVT, CCValAssign::Full,
285 Args[i], Args[i].Flags[PartIdx], CCInfo))
Amara Emersonfbaf4252019-09-03 21:42:28 +0000286 return false;
287 }
288 }
Amara Emerson2b523f82019-04-09 21:22:33 +0000289 }
Diana Picusf11f0422016-12-05 10:40:33 +0000290 }
291
Diana Picusca6a8902017-02-16 07:53:07 +0000292 for (unsigned i = 0, e = Args.size(), j = 0; i != e; ++i, ++j) {
293 assert(j < ArgLocs.size() && "Skipped too many arg locs");
294
295 CCValAssign &VA = ArgLocs[j];
296 assert(VA.getValNo() == i && "Location doesn't correspond to current arg");
297
298 if (VA.needsCustom()) {
299 j += Handler.assignCustomValue(Args[i], makeArrayRef(ArgLocs).slice(j));
300 continue;
301 }
Diana Picusf11f0422016-12-05 10:40:33 +0000302
Diana Picus69ce1c132019-06-27 08:50:53 +0000303 // FIXME: Pack registers if we have more than one.
Matt Arsenault7e719022019-07-11 14:18:19 +0000304 Register ArgReg = Args[i].Regs[0];
Diana Picus69ce1c132019-06-27 08:50:53 +0000305
Amara Emerson55d86f02019-09-11 23:53:23 +0000306 MVT OrigVT = MVT::getVT(Args[i].Ty);
307 MVT VAVT = VA.getValVT();
Amara Emerson2b523f82019-04-09 21:22:33 +0000308 if (VA.isRegLoc()) {
Amara Emersonbc1172d2019-08-05 23:05:28 +0000309 if (Handler.isIncomingArgumentHandler() && VAVT != OrigVT) {
Amara Emersonfbaf4252019-09-03 21:42:28 +0000310 if (VAVT.getSizeInBits() < OrigVT.getSizeInBits()) {
311 // Expected to be multiple regs for a single incoming arg.
312 unsigned NumArgRegs = Args[i].Regs.size();
313 if (NumArgRegs < 2)
314 return false;
315
316 assert((j + (NumArgRegs - 1)) < ArgLocs.size() &&
317 "Too many regs for number of args");
318 for (unsigned Part = 0; Part < NumArgRegs; ++Part) {
319 // There should be Regs.size() ArgLocs per argument.
320 VA = ArgLocs[j + Part];
321 Handler.assignValueToReg(Args[i].Regs[Part], VA.getLocReg(), VA);
322 }
323 j += NumArgRegs - 1;
324 // Merge the split registers into the expected larger result vreg
325 // of the original call.
326 MIRBuilder.buildMerge(Args[i].OrigRegs[0], Args[i].Regs);
327 continue;
328 }
Amara Emerson2b523f82019-04-09 21:22:33 +0000329 const LLT VATy(VAVT);
Matt Arsenault7e719022019-07-11 14:18:19 +0000330 Register NewReg =
Amara Emerson2b523f82019-04-09 21:22:33 +0000331 MIRBuilder.getMRI()->createGenericVirtualRegister(VATy);
332 Handler.assignValueToReg(NewReg, VA.getLocReg(), VA);
333 // If it's a vector type, we either need to truncate the elements
334 // or do an unmerge to get the lower block of elements.
335 if (VATy.isVector() &&
336 VATy.getNumElements() > OrigVT.getVectorNumElements()) {
337 const LLT OrigTy(OrigVT);
338 // Just handle the case where the VA type is 2 * original type.
339 if (VATy.getNumElements() != OrigVT.getVectorNumElements() * 2) {
340 LLVM_DEBUG(dbgs()
341 << "Incoming promoted vector arg has too many elts");
342 return false;
343 }
344 auto Unmerge = MIRBuilder.buildUnmerge({OrigTy, OrigTy}, {NewReg});
Diana Picus69ce1c132019-06-27 08:50:53 +0000345 MIRBuilder.buildCopy(ArgReg, Unmerge.getReg(0));
Amara Emerson2b523f82019-04-09 21:22:33 +0000346 } else {
Diana Picus69ce1c132019-06-27 08:50:53 +0000347 MIRBuilder.buildTrunc(ArgReg, {NewReg}).getReg(0);
Amara Emerson2b523f82019-04-09 21:22:33 +0000348 }
Amara Emersonfbaf4252019-09-03 21:42:28 +0000349 } else if (!Handler.isIncomingArgumentHandler()) {
350 assert((j + (Args[i].Regs.size() - 1)) < ArgLocs.size() &&
351 "Too many regs for number of args");
352 // This is an outgoing argument that might have been split.
353 for (unsigned Part = 0; Part < Args[i].Regs.size(); ++Part) {
354 // There should be Regs.size() ArgLocs per argument.
355 VA = ArgLocs[j + Part];
356 Handler.assignValueToReg(Args[i].Regs[Part], VA.getLocReg(), VA);
357 }
358 j += Args[i].Regs.size() - 1;
Amara Emerson2b523f82019-04-09 21:22:33 +0000359 } else {
Diana Picus69ce1c132019-06-27 08:50:53 +0000360 Handler.assignValueToReg(ArgReg, VA.getLocReg(), VA);
Amara Emerson2b523f82019-04-09 21:22:33 +0000361 }
362 } else if (VA.isMemLoc()) {
Amara Emerson55d86f02019-09-11 23:53:23 +0000363 // Don't currently support loading/storing a type that needs to be split
364 // to the stack. Should be easy, just not implemented yet.
365 if (Args[i].Regs.size() > 1) {
366 LLVM_DEBUG(
367 dbgs()
368 << "Load/store a split arg to/from the stack not implemented yet");
369 return false;
370 }
Amara Emerson2b523f82019-04-09 21:22:33 +0000371 MVT VT = MVT::getVT(Args[i].Ty);
372 unsigned Size = VT == MVT::iPTR ? DL.getPointerSize()
373 : alignTo(VT.getSizeInBits(), 8) / 8;
Diana Picusf11f0422016-12-05 10:40:33 +0000374 unsigned Offset = VA.getLocMemOffset();
375 MachinePointerInfo MPO;
Matt Arsenault7e719022019-07-11 14:18:19 +0000376 Register StackAddr = Handler.getStackAddress(Size, Offset, MPO);
Diana Picus69ce1c132019-06-27 08:50:53 +0000377 Handler.assignValueToAddress(ArgReg, StackAddr, Size, MPO, VA);
Diana Picusf11f0422016-12-05 10:40:33 +0000378 } else {
379 // FIXME: Support byvals and other weirdness
380 return false;
381 }
382 }
383 return true;
384}
Diana Picus2d9adbf2016-12-13 10:46:12 +0000385
Jessica Paquettea42070a2019-09-12 22:10:36 +0000386bool CallLowering::analyzeArgInfo(CCState &CCState,
Jessica Paquette8535a862019-09-25 16:45:35 +0000387 SmallVectorImpl<ArgInfo> &Args,
388 CCAssignFn &AssignFnFixed,
389 CCAssignFn &AssignFnVarArg) const {
Jessica Paquette2af5b192019-09-10 23:25:12 +0000390 for (unsigned i = 0, e = Args.size(); i < e; ++i) {
391 MVT VT = MVT::getVT(Args[i].Ty);
Jessica Paquette8535a862019-09-25 16:45:35 +0000392 CCAssignFn &Fn = Args[i].IsFixed ? AssignFnFixed : AssignFnVarArg;
Jessica Paquette2af5b192019-09-10 23:25:12 +0000393 if (Fn(i, VT, VT, CCValAssign::Full, Args[i].Flags[0], CCState)) {
394 // Bail out on anything we can't handle.
395 LLVM_DEBUG(dbgs() << "Cannot analyze " << EVT(VT).getEVTString()
396 << " (arg number = " << i << "\n");
397 return false;
398 }
399 }
400 return true;
401}
402
403bool CallLowering::resultsCompatible(CallLoweringInfo &Info,
404 MachineFunction &MF,
405 SmallVectorImpl<ArgInfo> &InArgs,
Jessica Paquette8535a862019-09-25 16:45:35 +0000406 CCAssignFn &CalleeAssignFnFixed,
407 CCAssignFn &CalleeAssignFnVarArg,
408 CCAssignFn &CallerAssignFnFixed,
409 CCAssignFn &CallerAssignFnVarArg) const {
Jessica Paquette2af5b192019-09-10 23:25:12 +0000410 const Function &F = MF.getFunction();
411 CallingConv::ID CalleeCC = Info.CallConv;
412 CallingConv::ID CallerCC = F.getCallingConv();
413
414 if (CallerCC == CalleeCC)
415 return true;
416
417 SmallVector<CCValAssign, 16> ArgLocs1;
418 CCState CCInfo1(CalleeCC, false, MF, ArgLocs1, F.getContext());
Jessica Paquette8535a862019-09-25 16:45:35 +0000419 if (!analyzeArgInfo(CCInfo1, InArgs, CalleeAssignFnFixed,
420 CalleeAssignFnVarArg))
Jessica Paquette2af5b192019-09-10 23:25:12 +0000421 return false;
422
423 SmallVector<CCValAssign, 16> ArgLocs2;
424 CCState CCInfo2(CallerCC, false, MF, ArgLocs2, F.getContext());
Jessica Paquette8535a862019-09-25 16:45:35 +0000425 if (!analyzeArgInfo(CCInfo2, InArgs, CallerAssignFnFixed,
426 CalleeAssignFnVarArg))
Jessica Paquette2af5b192019-09-10 23:25:12 +0000427 return false;
428
429 // We need the argument locations to match up exactly. If there's more in
430 // one than the other, then we are done.
431 if (ArgLocs1.size() != ArgLocs2.size())
432 return false;
433
434 // Make sure that each location is passed in exactly the same way.
435 for (unsigned i = 0, e = ArgLocs1.size(); i < e; ++i) {
436 const CCValAssign &Loc1 = ArgLocs1[i];
437 const CCValAssign &Loc2 = ArgLocs2[i];
438
439 // We need both of them to be the same. So if one is a register and one
440 // isn't, we're done.
441 if (Loc1.isRegLoc() != Loc2.isRegLoc())
442 return false;
443
444 if (Loc1.isRegLoc()) {
445 // If they don't have the same register location, we're done.
446 if (Loc1.getLocReg() != Loc2.getLocReg())
447 return false;
448
449 // They matched, so we can move to the next ArgLoc.
450 continue;
451 }
452
453 // Loc1 wasn't a RegLoc, so they both must be MemLocs. Check if they match.
454 if (Loc1.getLocMemOffset() != Loc2.getLocMemOffset())
455 return false;
456 }
457
458 return true;
459}
460
Matt Arsenaultfaeaedf2019-06-24 16:16:12 +0000461Register CallLowering::ValueHandler::extendRegister(Register ValReg,
Diana Picus2d9adbf2016-12-13 10:46:12 +0000462 CCValAssign &VA) {
463 LLT LocTy{VA.getLocVT()};
Amara Emerson2b523f82019-04-09 21:22:33 +0000464 if (LocTy.getSizeInBits() == MRI.getType(ValReg).getSizeInBits())
465 return ValReg;
Diana Picus2d9adbf2016-12-13 10:46:12 +0000466 switch (VA.getLocInfo()) {
467 default: break;
468 case CCValAssign::Full:
469 case CCValAssign::BCvt:
470 // FIXME: bitconverting between vector types may or may not be a
471 // nop in big-endian situations.
472 return ValReg;
Aditya Nandakumarc3bfc812017-10-09 20:07:43 +0000473 case CCValAssign::AExt: {
Aditya Nandakumarc3bfc812017-10-09 20:07:43 +0000474 auto MIB = MIRBuilder.buildAnyExt(LocTy, ValReg);
Jay Foadb482e1b2020-01-23 11:51:35 +0000475 return MIB.getReg(0);
Aditya Nandakumarc3bfc812017-10-09 20:07:43 +0000476 }
Diana Picus2d9adbf2016-12-13 10:46:12 +0000477 case CCValAssign::SExt: {
Matt Arsenault7e719022019-07-11 14:18:19 +0000478 Register NewReg = MRI.createGenericVirtualRegister(LocTy);
Diana Picus2d9adbf2016-12-13 10:46:12 +0000479 MIRBuilder.buildSExt(NewReg, ValReg);
480 return NewReg;
481 }
482 case CCValAssign::ZExt: {
Matt Arsenault7e719022019-07-11 14:18:19 +0000483 Register NewReg = MRI.createGenericVirtualRegister(LocTy);
Diana Picus2d9adbf2016-12-13 10:46:12 +0000484 MIRBuilder.buildZExt(NewReg, ValReg);
485 return NewReg;
486 }
487 }
488 llvm_unreachable("unable to extend register");
489}
Richard Trieua87b70d2018-12-29 02:02:13 +0000490
491void CallLowering::ValueHandler::anchor() {}