blob: 2162b2f041b4b905ece508e885d692ff0bf706b3 [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 =
Craig Topper30430932020-04-13 23:04:52 -070071 CB.isTailCall() && isInTailCallPosition(CB, MF.getTarget()) &&
Craig Topper68eb0862020-04-13 10:17:29 -070072 (MF.getFunction()
73 .getFnAttribute("disable-tail-calls")
74 .getValueAsString() != "true");
75 Info.IsVarArg = CB.getFunctionType()->isVarArg();
Tim Northovere1a5f662019-08-09 08:26:38 +000076 return lowerCall(MIRBuilder, Info);
Tim Northoverfe5f89b2016-08-29 19:07:08 +000077}
Tim Northover9a467182016-09-21 12:57:45 +000078
79template <typename FuncInfoTy>
80void CallLowering::setArgFlags(CallLowering::ArgInfo &Arg, unsigned OpIdx,
81 const DataLayout &DL,
82 const FuncInfoTy &FuncInfo) const {
Amara Emersonfbaf4252019-09-03 21:42:28 +000083 auto &Flags = Arg.Flags[0];
Reid Klecknerb5180542017-03-21 16:57:19 +000084 const AttributeList &Attrs = FuncInfo.getAttributes();
Tim Northover9a467182016-09-21 12:57:45 +000085 if (Attrs.hasAttribute(OpIdx, Attribute::ZExt))
Amara Emersonfbaf4252019-09-03 21:42:28 +000086 Flags.setZExt();
Tim Northover9a467182016-09-21 12:57:45 +000087 if (Attrs.hasAttribute(OpIdx, Attribute::SExt))
Amara Emersonfbaf4252019-09-03 21:42:28 +000088 Flags.setSExt();
Tim Northover9a467182016-09-21 12:57:45 +000089 if (Attrs.hasAttribute(OpIdx, Attribute::InReg))
Amara Emersonfbaf4252019-09-03 21:42:28 +000090 Flags.setInReg();
Tim Northover9a467182016-09-21 12:57:45 +000091 if (Attrs.hasAttribute(OpIdx, Attribute::StructRet))
Amara Emersonfbaf4252019-09-03 21:42:28 +000092 Flags.setSRet();
Tim Northover9a467182016-09-21 12:57:45 +000093 if (Attrs.hasAttribute(OpIdx, Attribute::SwiftSelf))
Amara Emersonfbaf4252019-09-03 21:42:28 +000094 Flags.setSwiftSelf();
Tim Northover9a467182016-09-21 12:57:45 +000095 if (Attrs.hasAttribute(OpIdx, Attribute::SwiftError))
Amara Emersonfbaf4252019-09-03 21:42:28 +000096 Flags.setSwiftError();
Tim Northover9a467182016-09-21 12:57:45 +000097 if (Attrs.hasAttribute(OpIdx, Attribute::ByVal))
Amara Emersonfbaf4252019-09-03 21:42:28 +000098 Flags.setByVal();
Tim Northover9a467182016-09-21 12:57:45 +000099 if (Attrs.hasAttribute(OpIdx, Attribute::InAlloca))
Amara Emersonfbaf4252019-09-03 21:42:28 +0000100 Flags.setInAlloca();
Tim Northover9a467182016-09-21 12:57:45 +0000101
Amara Emersonfbaf4252019-09-03 21:42:28 +0000102 if (Flags.isByVal() || Flags.isInAlloca()) {
Tim Northover9a467182016-09-21 12:57:45 +0000103 Type *ElementTy = cast<PointerType>(Arg.Ty)->getElementType();
Tim Northoverb7141202019-05-30 18:48:23 +0000104
105 auto Ty = Attrs.getAttribute(OpIdx, Attribute::ByVal).getValueAsType();
Amara Emersonfbaf4252019-09-03 21:42:28 +0000106 Flags.setByValSize(DL.getTypeAllocSize(Ty ? Ty : ElementTy));
Tim Northoverb7141202019-05-30 18:48:23 +0000107
Tim Northover9a467182016-09-21 12:57:45 +0000108 // For ByVal, alignment should be passed from FE. BE will guess if
109 // this info is not there but there are cases it cannot get right.
Guillaume Chatelet9068bcc2020-04-02 15:10:30 +0000110 Align FrameAlign;
111 if (auto ParamAlign = FuncInfo.getParamAlign(OpIdx - 2))
112 FrameAlign = *ParamAlign;
Tim Northover9a467182016-09-21 12:57:45 +0000113 else
Guillaume Chatelet9068bcc2020-04-02 15:10:30 +0000114 FrameAlign = Align(getTLI()->getByValTypeAlignment(ElementTy, DL));
115 Flags.setByValAlign(FrameAlign);
Tim Northover9a467182016-09-21 12:57:45 +0000116 }
117 if (Attrs.hasAttribute(OpIdx, Attribute::Nest))
Amara Emersonfbaf4252019-09-03 21:42:28 +0000118 Flags.setNest();
Guillaume Chateletbac5f6b2019-10-21 11:01:55 +0000119 Flags.setOrigAlign(Align(DL.getABITypeAlignment(Arg.Ty)));
Tim Northover9a467182016-09-21 12:57:45 +0000120}
121
122template void
123CallLowering::setArgFlags<Function>(CallLowering::ArgInfo &Arg, unsigned OpIdx,
124 const DataLayout &DL,
125 const Function &FuncInfo) const;
126
127template void
Craig Topper68eb0862020-04-13 10:17:29 -0700128CallLowering::setArgFlags<CallBase>(CallLowering::ArgInfo &Arg, unsigned OpIdx,
Tim Northover9a467182016-09-21 12:57:45 +0000129 const DataLayout &DL,
Craig Topper68eb0862020-04-13 10:17:29 -0700130 const CallBase &FuncInfo) const;
Diana Picusf11f0422016-12-05 10:40:33 +0000131
Diana Picusc3dbe232019-06-27 08:54:17 +0000132Register CallLowering::packRegs(ArrayRef<Register> SrcRegs, Type *PackedTy,
133 MachineIRBuilder &MIRBuilder) const {
134 assert(SrcRegs.size() > 1 && "Nothing to pack");
135
136 const DataLayout &DL = MIRBuilder.getMF().getDataLayout();
137 MachineRegisterInfo *MRI = MIRBuilder.getMRI();
138
139 LLT PackedLLT = getLLTForType(*PackedTy, DL);
140
141 SmallVector<LLT, 8> LLTs;
142 SmallVector<uint64_t, 8> Offsets;
143 computeValueLLTs(DL, *PackedTy, LLTs, &Offsets);
144 assert(LLTs.size() == SrcRegs.size() && "Regs / types mismatch");
145
146 Register Dst = MRI->createGenericVirtualRegister(PackedLLT);
147 MIRBuilder.buildUndef(Dst);
148 for (unsigned i = 0; i < SrcRegs.size(); ++i) {
149 Register NewDst = MRI->createGenericVirtualRegister(PackedLLT);
150 MIRBuilder.buildInsert(NewDst, Dst, SrcRegs[i], Offsets[i]);
151 Dst = NewDst;
152 }
153
154 return Dst;
155}
156
157void CallLowering::unpackRegs(ArrayRef<Register> DstRegs, Register SrcReg,
158 Type *PackedTy,
159 MachineIRBuilder &MIRBuilder) const {
160 assert(DstRegs.size() > 1 && "Nothing to unpack");
161
Matt Arsenaultcc3b5592020-02-24 14:08:41 -0500162 const DataLayout &DL = MIRBuilder.getDataLayout();
Diana Picusc3dbe232019-06-27 08:54:17 +0000163
164 SmallVector<LLT, 8> LLTs;
165 SmallVector<uint64_t, 8> Offsets;
166 computeValueLLTs(DL, *PackedTy, LLTs, &Offsets);
167 assert(LLTs.size() == DstRegs.size() && "Regs / types mismatch");
168
169 for (unsigned i = 0; i < DstRegs.size(); ++i)
170 MIRBuilder.buildExtract(DstRegs[i], SrcReg, Offsets[i]);
171}
172
Diana Picusf11f0422016-12-05 10:40:33 +0000173bool CallLowering::handleAssignments(MachineIRBuilder &MIRBuilder,
Amara Emersonfbaf4252019-09-03 21:42:28 +0000174 SmallVectorImpl<ArgInfo> &Args,
Diana Picusf11f0422016-12-05 10:40:33 +0000175 ValueHandler &Handler) const {
176 MachineFunction &MF = MIRBuilder.getMF();
Matthias Braunf1caa282017-12-15 22:22:58 +0000177 const Function &F = MF.getFunction();
Diana Picusf11f0422016-12-05 10:40:33 +0000178 SmallVector<CCValAssign, 16> ArgLocs;
179 CCState CCInfo(F.getCallingConv(), F.isVarArg(), MF, ArgLocs, F.getContext());
Matt Arsenault1c3f4ec2019-07-16 22:41:34 +0000180 return handleAssignments(CCInfo, ArgLocs, MIRBuilder, Args, Handler);
181}
182
183bool CallLowering::handleAssignments(CCState &CCInfo,
184 SmallVectorImpl<CCValAssign> &ArgLocs,
185 MachineIRBuilder &MIRBuilder,
Amara Emersonfbaf4252019-09-03 21:42:28 +0000186 SmallVectorImpl<ArgInfo> &Args,
Matt Arsenault1c3f4ec2019-07-16 22:41:34 +0000187 ValueHandler &Handler) const {
188 MachineFunction &MF = MIRBuilder.getMF();
189 const Function &F = MF.getFunction();
190 const DataLayout &DL = F.getParent()->getDataLayout();
Diana Picusf11f0422016-12-05 10:40:33 +0000191
192 unsigned NumArgs = Args.size();
193 for (unsigned i = 0; i != NumArgs; ++i) {
194 MVT CurVT = MVT::getVT(Args[i].Ty);
Amara Emersonfbaf4252019-09-03 21:42:28 +0000195 if (Handler.assignArg(i, CurVT, CurVT, CCValAssign::Full, Args[i],
196 Args[i].Flags[0], CCInfo)) {
197 if (!CurVT.isValid())
Matt Arsenaulte3a676e2019-06-24 15:50:29 +0000198 return false;
Amara Emersonfbaf4252019-09-03 21:42:28 +0000199 MVT NewVT = TLI->getRegisterTypeForCallingConv(
Amara Emerson2b523f82019-04-09 21:22:33 +0000200 F.getContext(), F.getCallingConv(), EVT(CurVT));
Amara Emersonfbaf4252019-09-03 21:42:28 +0000201
202 // If we need to split the type over multiple regs, check it's a scenario
203 // we currently support.
204 unsigned NumParts = TLI->getNumRegistersForCallingConv(
205 F.getContext(), F.getCallingConv(), CurVT);
206 if (NumParts > 1) {
Amara Emersonfbaf4252019-09-03 21:42:28 +0000207 // For now only handle exact splits.
208 if (NewVT.getSizeInBits() * NumParts != CurVT.getSizeInBits())
209 return false;
210 }
211
Quentin Colombet9c36ec52019-10-11 20:22:57 +0000212 // For incoming arguments (physregs to vregs), we could have values in
Amara Emersonfbaf4252019-09-03 21:42:28 +0000213 // physregs (or memlocs) which we want to extract and copy to vregs.
214 // During this, we might have to deal with the LLT being split across
215 // multiple regs, so we have to record this information for later.
216 //
217 // If we have outgoing args, then we have the opposite case. We have a
218 // vreg with an LLT which we want to assign to a physical location, and
219 // we might have to record that the value has to be split later.
220 if (Handler.isIncomingArgumentHandler()) {
221 if (NumParts == 1) {
222 // Try to use the register type if we couldn't assign the VT.
223 if (Handler.assignArg(i, NewVT, NewVT, CCValAssign::Full, Args[i],
224 Args[i].Flags[0], CCInfo))
225 return false;
226 } else {
227 // We're handling an incoming arg which is split over multiple regs.
Quentin Colombet9c36ec52019-10-11 20:22:57 +0000228 // E.g. passing an s128 on AArch64.
Amara Emersonfbaf4252019-09-03 21:42:28 +0000229 ISD::ArgFlagsTy OrigFlags = Args[i].Flags[0];
230 Args[i].OrigRegs.push_back(Args[i].Regs[0]);
231 Args[i].Regs.clear();
232 Args[i].Flags.clear();
233 LLT NewLLT = getLLTForMVT(NewVT);
234 // For each split register, create and assign a vreg that will store
235 // the incoming component of the larger value. These will later be
236 // merged to form the final vreg.
237 for (unsigned Part = 0; Part < NumParts; ++Part) {
238 Register Reg =
239 MIRBuilder.getMRI()->createGenericVirtualRegister(NewLLT);
240 ISD::ArgFlagsTy Flags = OrigFlags;
241 if (Part == 0) {
242 Flags.setSplit();
243 } else {
Guillaume Chatelet805c1572020-01-21 15:00:04 +0100244 Flags.setOrigAlign(Align(1));
Amara Emersonfbaf4252019-09-03 21:42:28 +0000245 if (Part == NumParts - 1)
246 Flags.setSplitEnd();
247 }
248 Args[i].Regs.push_back(Reg);
249 Args[i].Flags.push_back(Flags);
Amara Emerson55d86f02019-09-11 23:53:23 +0000250 if (Handler.assignArg(i + Part, NewVT, NewVT, CCValAssign::Full,
251 Args[i], Args[i].Flags[Part], CCInfo)) {
Amara Emersonfbaf4252019-09-03 21:42:28 +0000252 // Still couldn't assign this smaller part type for some reason.
253 return false;
254 }
255 }
256 }
257 } else {
258 // Handling an outgoing arg that might need to be split.
259 if (NumParts < 2)
260 return false; // Don't know how to deal with this type combination.
261
262 // This type is passed via multiple registers in the calling convention.
263 // We need to extract the individual parts.
264 Register LargeReg = Args[i].Regs[0];
265 LLT SmallTy = LLT::scalar(NewVT.getSizeInBits());
266 auto Unmerge = MIRBuilder.buildUnmerge(SmallTy, LargeReg);
267 assert(Unmerge->getNumOperands() == NumParts + 1);
268 ISD::ArgFlagsTy OrigFlags = Args[i].Flags[0];
269 // We're going to replace the regs and flags with the split ones.
270 Args[i].Regs.clear();
271 Args[i].Flags.clear();
272 for (unsigned PartIdx = 0; PartIdx < NumParts; ++PartIdx) {
273 ISD::ArgFlagsTy Flags = OrigFlags;
274 if (PartIdx == 0) {
275 Flags.setSplit();
276 } else {
Guillaume Chatelet805c1572020-01-21 15:00:04 +0100277 Flags.setOrigAlign(Align(1));
Amara Emersonfbaf4252019-09-03 21:42:28 +0000278 if (PartIdx == NumParts - 1)
279 Flags.setSplitEnd();
280 }
281 Args[i].Regs.push_back(Unmerge.getReg(PartIdx));
282 Args[i].Flags.push_back(Flags);
Amara Emerson55d86f02019-09-11 23:53:23 +0000283 if (Handler.assignArg(i + PartIdx, NewVT, NewVT, CCValAssign::Full,
284 Args[i], Args[i].Flags[PartIdx], CCInfo))
Amara Emersonfbaf4252019-09-03 21:42:28 +0000285 return false;
286 }
287 }
Amara Emerson2b523f82019-04-09 21:22:33 +0000288 }
Diana Picusf11f0422016-12-05 10:40:33 +0000289 }
290
Diana Picusca6a8902017-02-16 07:53:07 +0000291 for (unsigned i = 0, e = Args.size(), j = 0; i != e; ++i, ++j) {
292 assert(j < ArgLocs.size() && "Skipped too many arg locs");
293
294 CCValAssign &VA = ArgLocs[j];
295 assert(VA.getValNo() == i && "Location doesn't correspond to current arg");
296
297 if (VA.needsCustom()) {
298 j += Handler.assignCustomValue(Args[i], makeArrayRef(ArgLocs).slice(j));
299 continue;
300 }
Diana Picusf11f0422016-12-05 10:40:33 +0000301
Diana Picus69ce1c132019-06-27 08:50:53 +0000302 // FIXME: Pack registers if we have more than one.
Matt Arsenault7e719022019-07-11 14:18:19 +0000303 Register ArgReg = Args[i].Regs[0];
Diana Picus69ce1c132019-06-27 08:50:53 +0000304
Amara Emerson55d86f02019-09-11 23:53:23 +0000305 MVT OrigVT = MVT::getVT(Args[i].Ty);
306 MVT VAVT = VA.getValVT();
Amara Emerson2b523f82019-04-09 21:22:33 +0000307 if (VA.isRegLoc()) {
Amara Emersonbc1172d2019-08-05 23:05:28 +0000308 if (Handler.isIncomingArgumentHandler() && VAVT != OrigVT) {
Amara Emersonfbaf4252019-09-03 21:42:28 +0000309 if (VAVT.getSizeInBits() < OrigVT.getSizeInBits()) {
310 // Expected to be multiple regs for a single incoming arg.
311 unsigned NumArgRegs = Args[i].Regs.size();
312 if (NumArgRegs < 2)
313 return false;
314
315 assert((j + (NumArgRegs - 1)) < ArgLocs.size() &&
316 "Too many regs for number of args");
317 for (unsigned Part = 0; Part < NumArgRegs; ++Part) {
318 // There should be Regs.size() ArgLocs per argument.
319 VA = ArgLocs[j + Part];
320 Handler.assignValueToReg(Args[i].Regs[Part], VA.getLocReg(), VA);
321 }
322 j += NumArgRegs - 1;
323 // Merge the split registers into the expected larger result vreg
324 // of the original call.
325 MIRBuilder.buildMerge(Args[i].OrigRegs[0], Args[i].Regs);
326 continue;
327 }
Amara Emerson2b523f82019-04-09 21:22:33 +0000328 const LLT VATy(VAVT);
Matt Arsenault7e719022019-07-11 14:18:19 +0000329 Register NewReg =
Amara Emerson2b523f82019-04-09 21:22:33 +0000330 MIRBuilder.getMRI()->createGenericVirtualRegister(VATy);
331 Handler.assignValueToReg(NewReg, VA.getLocReg(), VA);
332 // If it's a vector type, we either need to truncate the elements
333 // or do an unmerge to get the lower block of elements.
334 if (VATy.isVector() &&
335 VATy.getNumElements() > OrigVT.getVectorNumElements()) {
336 const LLT OrigTy(OrigVT);
337 // Just handle the case where the VA type is 2 * original type.
338 if (VATy.getNumElements() != OrigVT.getVectorNumElements() * 2) {
339 LLVM_DEBUG(dbgs()
340 << "Incoming promoted vector arg has too many elts");
341 return false;
342 }
343 auto Unmerge = MIRBuilder.buildUnmerge({OrigTy, OrigTy}, {NewReg});
Diana Picus69ce1c132019-06-27 08:50:53 +0000344 MIRBuilder.buildCopy(ArgReg, Unmerge.getReg(0));
Amara Emerson2b523f82019-04-09 21:22:33 +0000345 } else {
Diana Picus69ce1c132019-06-27 08:50:53 +0000346 MIRBuilder.buildTrunc(ArgReg, {NewReg}).getReg(0);
Amara Emerson2b523f82019-04-09 21:22:33 +0000347 }
Amara Emersonfbaf4252019-09-03 21:42:28 +0000348 } else if (!Handler.isIncomingArgumentHandler()) {
349 assert((j + (Args[i].Regs.size() - 1)) < ArgLocs.size() &&
350 "Too many regs for number of args");
351 // This is an outgoing argument that might have been split.
352 for (unsigned Part = 0; Part < Args[i].Regs.size(); ++Part) {
353 // There should be Regs.size() ArgLocs per argument.
354 VA = ArgLocs[j + Part];
355 Handler.assignValueToReg(Args[i].Regs[Part], VA.getLocReg(), VA);
356 }
357 j += Args[i].Regs.size() - 1;
Amara Emerson2b523f82019-04-09 21:22:33 +0000358 } else {
Diana Picus69ce1c132019-06-27 08:50:53 +0000359 Handler.assignValueToReg(ArgReg, VA.getLocReg(), VA);
Amara Emerson2b523f82019-04-09 21:22:33 +0000360 }
361 } else if (VA.isMemLoc()) {
Amara Emerson55d86f02019-09-11 23:53:23 +0000362 // Don't currently support loading/storing a type that needs to be split
363 // to the stack. Should be easy, just not implemented yet.
364 if (Args[i].Regs.size() > 1) {
365 LLVM_DEBUG(
366 dbgs()
367 << "Load/store a split arg to/from the stack not implemented yet");
368 return false;
369 }
Amara Emerson2b523f82019-04-09 21:22:33 +0000370 MVT VT = MVT::getVT(Args[i].Ty);
371 unsigned Size = VT == MVT::iPTR ? DL.getPointerSize()
372 : alignTo(VT.getSizeInBits(), 8) / 8;
Diana Picusf11f0422016-12-05 10:40:33 +0000373 unsigned Offset = VA.getLocMemOffset();
374 MachinePointerInfo MPO;
Matt Arsenault7e719022019-07-11 14:18:19 +0000375 Register StackAddr = Handler.getStackAddress(Size, Offset, MPO);
Diana Picus69ce1c132019-06-27 08:50:53 +0000376 Handler.assignValueToAddress(ArgReg, StackAddr, Size, MPO, VA);
Diana Picusf11f0422016-12-05 10:40:33 +0000377 } else {
378 // FIXME: Support byvals and other weirdness
379 return false;
380 }
381 }
382 return true;
383}
Diana Picus2d9adbf2016-12-13 10:46:12 +0000384
Jessica Paquettea42070a2019-09-12 22:10:36 +0000385bool CallLowering::analyzeArgInfo(CCState &CCState,
Jessica Paquette8535a862019-09-25 16:45:35 +0000386 SmallVectorImpl<ArgInfo> &Args,
387 CCAssignFn &AssignFnFixed,
388 CCAssignFn &AssignFnVarArg) const {
Jessica Paquette2af5b192019-09-10 23:25:12 +0000389 for (unsigned i = 0, e = Args.size(); i < e; ++i) {
390 MVT VT = MVT::getVT(Args[i].Ty);
Jessica Paquette8535a862019-09-25 16:45:35 +0000391 CCAssignFn &Fn = Args[i].IsFixed ? AssignFnFixed : AssignFnVarArg;
Jessica Paquette2af5b192019-09-10 23:25:12 +0000392 if (Fn(i, VT, VT, CCValAssign::Full, Args[i].Flags[0], CCState)) {
393 // Bail out on anything we can't handle.
394 LLVM_DEBUG(dbgs() << "Cannot analyze " << EVT(VT).getEVTString()
395 << " (arg number = " << i << "\n");
396 return false;
397 }
398 }
399 return true;
400}
401
402bool CallLowering::resultsCompatible(CallLoweringInfo &Info,
403 MachineFunction &MF,
404 SmallVectorImpl<ArgInfo> &InArgs,
Jessica Paquette8535a862019-09-25 16:45:35 +0000405 CCAssignFn &CalleeAssignFnFixed,
406 CCAssignFn &CalleeAssignFnVarArg,
407 CCAssignFn &CallerAssignFnFixed,
408 CCAssignFn &CallerAssignFnVarArg) const {
Jessica Paquette2af5b192019-09-10 23:25:12 +0000409 const Function &F = MF.getFunction();
410 CallingConv::ID CalleeCC = Info.CallConv;
411 CallingConv::ID CallerCC = F.getCallingConv();
412
413 if (CallerCC == CalleeCC)
414 return true;
415
416 SmallVector<CCValAssign, 16> ArgLocs1;
417 CCState CCInfo1(CalleeCC, false, MF, ArgLocs1, F.getContext());
Jessica Paquette8535a862019-09-25 16:45:35 +0000418 if (!analyzeArgInfo(CCInfo1, InArgs, CalleeAssignFnFixed,
419 CalleeAssignFnVarArg))
Jessica Paquette2af5b192019-09-10 23:25:12 +0000420 return false;
421
422 SmallVector<CCValAssign, 16> ArgLocs2;
423 CCState CCInfo2(CallerCC, false, MF, ArgLocs2, F.getContext());
Jessica Paquette8535a862019-09-25 16:45:35 +0000424 if (!analyzeArgInfo(CCInfo2, InArgs, CallerAssignFnFixed,
425 CalleeAssignFnVarArg))
Jessica Paquette2af5b192019-09-10 23:25:12 +0000426 return false;
427
428 // We need the argument locations to match up exactly. If there's more in
429 // one than the other, then we are done.
430 if (ArgLocs1.size() != ArgLocs2.size())
431 return false;
432
433 // Make sure that each location is passed in exactly the same way.
434 for (unsigned i = 0, e = ArgLocs1.size(); i < e; ++i) {
435 const CCValAssign &Loc1 = ArgLocs1[i];
436 const CCValAssign &Loc2 = ArgLocs2[i];
437
438 // We need both of them to be the same. So if one is a register and one
439 // isn't, we're done.
440 if (Loc1.isRegLoc() != Loc2.isRegLoc())
441 return false;
442
443 if (Loc1.isRegLoc()) {
444 // If they don't have the same register location, we're done.
445 if (Loc1.getLocReg() != Loc2.getLocReg())
446 return false;
447
448 // They matched, so we can move to the next ArgLoc.
449 continue;
450 }
451
452 // Loc1 wasn't a RegLoc, so they both must be MemLocs. Check if they match.
453 if (Loc1.getLocMemOffset() != Loc2.getLocMemOffset())
454 return false;
455 }
456
457 return true;
458}
459
Matt Arsenaultfaeaedf2019-06-24 16:16:12 +0000460Register CallLowering::ValueHandler::extendRegister(Register ValReg,
Diana Picus2d9adbf2016-12-13 10:46:12 +0000461 CCValAssign &VA) {
462 LLT LocTy{VA.getLocVT()};
Amara Emerson2b523f82019-04-09 21:22:33 +0000463 if (LocTy.getSizeInBits() == MRI.getType(ValReg).getSizeInBits())
464 return ValReg;
Diana Picus2d9adbf2016-12-13 10:46:12 +0000465 switch (VA.getLocInfo()) {
466 default: break;
467 case CCValAssign::Full:
468 case CCValAssign::BCvt:
469 // FIXME: bitconverting between vector types may or may not be a
470 // nop in big-endian situations.
471 return ValReg;
Aditya Nandakumarc3bfc812017-10-09 20:07:43 +0000472 case CCValAssign::AExt: {
Aditya Nandakumarc3bfc812017-10-09 20:07:43 +0000473 auto MIB = MIRBuilder.buildAnyExt(LocTy, ValReg);
Jay Foadb482e1b2020-01-23 11:51:35 +0000474 return MIB.getReg(0);
Aditya Nandakumarc3bfc812017-10-09 20:07:43 +0000475 }
Diana Picus2d9adbf2016-12-13 10:46:12 +0000476 case CCValAssign::SExt: {
Matt Arsenault7e719022019-07-11 14:18:19 +0000477 Register NewReg = MRI.createGenericVirtualRegister(LocTy);
Diana Picus2d9adbf2016-12-13 10:46:12 +0000478 MIRBuilder.buildSExt(NewReg, ValReg);
479 return NewReg;
480 }
481 case CCValAssign::ZExt: {
Matt Arsenault7e719022019-07-11 14:18:19 +0000482 Register NewReg = MRI.createGenericVirtualRegister(LocTy);
Diana Picus2d9adbf2016-12-13 10:46:12 +0000483 MIRBuilder.buildZExt(NewReg, ValReg);
484 return NewReg;
485 }
486 }
487 llvm_unreachable("unable to extend register");
488}
Richard Trieua87b70d2018-12-29 02:02:13 +0000489
490void CallLowering::ValueHandler::anchor() {}