Tim Northover | fe5f89b | 2016-08-29 19:07:08 +0000 | [diff] [blame] | 1 | //===-- lib/CodeGen/GlobalISel/CallLowering.cpp - Call lowering -----------===// |
| 2 | // |
Chandler Carruth | 2946cd7 | 2019-01-19 08:50:56 +0000 | [diff] [blame] | 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 |
Tim Northover | fe5f89b | 2016-08-29 19:07:08 +0000 | [diff] [blame] | 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | /// |
| 9 | /// \file |
| 10 | /// This file implements some simple delegations needed for call lowering. |
| 11 | /// |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
Tim Northover | fe5f89b | 2016-08-29 19:07:08 +0000 | [diff] [blame] | 14 | #include "llvm/CodeGen/GlobalISel/CallLowering.h" |
Diana Picus | c3dbe23 | 2019-06-27 08:54:17 +0000 | [diff] [blame] | 15 | #include "llvm/CodeGen/Analysis.h" |
Diana Picus | f11f042 | 2016-12-05 10:40:33 +0000 | [diff] [blame] | 16 | #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" |
Tim Northover | fe5f89b | 2016-08-29 19:07:08 +0000 | [diff] [blame] | 17 | #include "llvm/CodeGen/MachineOperand.h" |
Diana Picus | 2d9adbf | 2016-12-13 10:46:12 +0000 | [diff] [blame] | 18 | #include "llvm/CodeGen/MachineRegisterInfo.h" |
David Blaikie | b3bde2e | 2017-11-17 01:07:10 +0000 | [diff] [blame] | 19 | #include "llvm/CodeGen/TargetLowering.h" |
Tim Northover | 9a46718 | 2016-09-21 12:57:45 +0000 | [diff] [blame] | 20 | #include "llvm/IR/DataLayout.h" |
Diana Picus | f11f042 | 2016-12-05 10:40:33 +0000 | [diff] [blame] | 21 | #include "llvm/IR/Instructions.h" |
Mark Lacey | 7b8d3eb | 2019-07-31 20:34:02 +0000 | [diff] [blame] | 22 | #include "llvm/IR/LLVMContext.h" |
Tim Northover | 9a46718 | 2016-09-21 12:57:45 +0000 | [diff] [blame] | 23 | #include "llvm/IR/Module.h" |
Tim Northover | fe5f89b | 2016-08-29 19:07:08 +0000 | [diff] [blame] | 24 | |
Amara Emerson | 2b523f8 | 2019-04-09 21:22:33 +0000 | [diff] [blame] | 25 | #define DEBUG_TYPE "call-lowering" |
| 26 | |
Tim Northover | fe5f89b | 2016-08-29 19:07:08 +0000 | [diff] [blame] | 27 | using namespace llvm; |
| 28 | |
Richard Trieu | a87b70d | 2018-12-29 02:02:13 +0000 | [diff] [blame] | 29 | void CallLowering::anchor() {} |
| 30 | |
Tim Northover | 3b2157a | 2019-05-24 08:40:13 +0000 | [diff] [blame] | 31 | bool CallLowering::lowerCall(MachineIRBuilder &MIRBuilder, ImmutableCallSite CS, |
Diana Picus | 8138996 | 2019-06-27 09:15:53 +0000 | [diff] [blame] | 32 | ArrayRef<Register> ResRegs, |
Diana Picus | 43fb5ae | 2019-06-27 09:18:03 +0000 | [diff] [blame] | 33 | ArrayRef<ArrayRef<Register>> ArgRegs, |
Matt Arsenault | e3a676e | 2019-06-24 15:50:29 +0000 | [diff] [blame] | 34 | Register SwiftErrorVReg, |
Tim Northover | 3b2157a | 2019-05-24 08:40:13 +0000 | [diff] [blame] | 35 | std::function<unsigned()> GetCalleeReg) const { |
Tim Northover | e1a5f66 | 2019-08-09 08:26:38 +0000 | [diff] [blame] | 36 | CallLoweringInfo Info; |
Ahmed Bougacha | d22b84b | 2017-03-10 00:25:44 +0000 | [diff] [blame] | 37 | auto &DL = CS.getParent()->getParent()->getParent()->getDataLayout(); |
Tim Northover | 9a46718 | 2016-09-21 12:57:45 +0000 | [diff] [blame] | 38 | |
Tim Northover | fe5f89b | 2016-08-29 19:07:08 +0000 | [diff] [blame] | 39 | // First step is to marshall all the function's parameters into the correct |
| 40 | // physregs and memory locations. Gather the sequence of argument types that |
| 41 | // we'll pass to the assigner function. |
Tim Northover | 9a46718 | 2016-09-21 12:57:45 +0000 | [diff] [blame] | 42 | unsigned i = 0; |
Ahmed Bougacha | d22b84b | 2017-03-10 00:25:44 +0000 | [diff] [blame] | 43 | unsigned NumFixedArgs = CS.getFunctionType()->getNumParams(); |
| 44 | for (auto &Arg : CS.args()) { |
Tim Northover | d943354 | 2017-01-17 22:30:10 +0000 | [diff] [blame] | 45 | ArgInfo OrigArg{ArgRegs[i], Arg->getType(), ISD::ArgFlagsTy{}, |
| 46 | i < NumFixedArgs}; |
Reid Kleckner | a0b45f4 | 2017-05-03 18:17:31 +0000 | [diff] [blame] | 47 | setArgFlags(OrigArg, i + AttributeList::FirstArgIndex, DL, CS); |
Tim Northover | e1a5f66 | 2019-08-09 08:26:38 +0000 | [diff] [blame] | 48 | Info.OrigArgs.push_back(OrigArg); |
Tim Northover | 9a46718 | 2016-09-21 12:57:45 +0000 | [diff] [blame] | 49 | ++i; |
| 50 | } |
Tim Northover | fe5f89b | 2016-08-29 19:07:08 +0000 | [diff] [blame] | 51 | |
Ahmed Bougacha | d22b84b | 2017-03-10 00:25:44 +0000 | [diff] [blame] | 52 | if (const Function *F = CS.getCalledFunction()) |
Tim Northover | e1a5f66 | 2019-08-09 08:26:38 +0000 | [diff] [blame] | 53 | Info.Callee = MachineOperand::CreateGA(F, 0); |
Tim Northover | fe5f89b | 2016-08-29 19:07:08 +0000 | [diff] [blame] | 54 | else |
Tim Northover | e1a5f66 | 2019-08-09 08:26:38 +0000 | [diff] [blame] | 55 | Info.Callee = MachineOperand::CreateReg(GetCalleeReg(), false); |
Tim Northover | fe5f89b | 2016-08-29 19:07:08 +0000 | [diff] [blame] | 56 | |
Tim Northover | e1a5f66 | 2019-08-09 08:26:38 +0000 | [diff] [blame] | 57 | Info.OrigRet = ArgInfo{ResRegs, CS.getType(), ISD::ArgFlagsTy{}}; |
| 58 | if (!Info.OrigRet.Ty->isVoidTy()) |
| 59 | setArgFlags(Info.OrigRet, AttributeList::ReturnIndex, DL, CS); |
Tim Northover | 9a46718 | 2016-09-21 12:57:45 +0000 | [diff] [blame] | 60 | |
Tim Northover | e1a5f66 | 2019-08-09 08:26:38 +0000 | [diff] [blame] | 61 | Info.KnownCallees = |
Mark Lacey | 7b8d3eb | 2019-07-31 20:34:02 +0000 | [diff] [blame] | 62 | CS.getInstruction()->getMetadata(LLVMContext::MD_callees); |
Tim Northover | e1a5f66 | 2019-08-09 08:26:38 +0000 | [diff] [blame] | 63 | Info.CallConv = CS.getCallingConv(); |
| 64 | Info.SwiftErrorVReg = SwiftErrorVReg; |
Jessica Paquette | af0bd41 | 2019-08-28 16:19:01 +0000 | [diff] [blame] | 65 | Info.IsMustTailCall = CS.isMustTailCall(); |
Mark Lacey | 7b8d3eb | 2019-07-31 20:34:02 +0000 | [diff] [blame] | 66 | |
Tim Northover | e1a5f66 | 2019-08-09 08:26:38 +0000 | [diff] [blame] | 67 | return lowerCall(MIRBuilder, Info); |
Tim Northover | fe5f89b | 2016-08-29 19:07:08 +0000 | [diff] [blame] | 68 | } |
Tim Northover | 9a46718 | 2016-09-21 12:57:45 +0000 | [diff] [blame] | 69 | |
| 70 | template <typename FuncInfoTy> |
| 71 | void CallLowering::setArgFlags(CallLowering::ArgInfo &Arg, unsigned OpIdx, |
| 72 | const DataLayout &DL, |
| 73 | const FuncInfoTy &FuncInfo) const { |
Reid Kleckner | b518054 | 2017-03-21 16:57:19 +0000 | [diff] [blame] | 74 | const AttributeList &Attrs = FuncInfo.getAttributes(); |
Tim Northover | 9a46718 | 2016-09-21 12:57:45 +0000 | [diff] [blame] | 75 | if (Attrs.hasAttribute(OpIdx, Attribute::ZExt)) |
| 76 | Arg.Flags.setZExt(); |
| 77 | if (Attrs.hasAttribute(OpIdx, Attribute::SExt)) |
| 78 | Arg.Flags.setSExt(); |
| 79 | if (Attrs.hasAttribute(OpIdx, Attribute::InReg)) |
| 80 | Arg.Flags.setInReg(); |
| 81 | if (Attrs.hasAttribute(OpIdx, Attribute::StructRet)) |
| 82 | Arg.Flags.setSRet(); |
| 83 | if (Attrs.hasAttribute(OpIdx, Attribute::SwiftSelf)) |
| 84 | Arg.Flags.setSwiftSelf(); |
| 85 | if (Attrs.hasAttribute(OpIdx, Attribute::SwiftError)) |
| 86 | Arg.Flags.setSwiftError(); |
| 87 | if (Attrs.hasAttribute(OpIdx, Attribute::ByVal)) |
| 88 | Arg.Flags.setByVal(); |
| 89 | if (Attrs.hasAttribute(OpIdx, Attribute::InAlloca)) |
| 90 | Arg.Flags.setInAlloca(); |
| 91 | |
| 92 | if (Arg.Flags.isByVal() || Arg.Flags.isInAlloca()) { |
| 93 | Type *ElementTy = cast<PointerType>(Arg.Ty)->getElementType(); |
Tim Northover | b714120 | 2019-05-30 18:48:23 +0000 | [diff] [blame] | 94 | |
| 95 | auto Ty = Attrs.getAttribute(OpIdx, Attribute::ByVal).getValueAsType(); |
| 96 | Arg.Flags.setByValSize(DL.getTypeAllocSize(Ty ? Ty : ElementTy)); |
| 97 | |
Tim Northover | 9a46718 | 2016-09-21 12:57:45 +0000 | [diff] [blame] | 98 | // For ByVal, alignment should be passed from FE. BE will guess if |
| 99 | // this info is not there but there are cases it cannot get right. |
| 100 | unsigned FrameAlign; |
Reid Kleckner | ee4930b | 2017-05-02 22:07:37 +0000 | [diff] [blame] | 101 | if (FuncInfo.getParamAlignment(OpIdx - 2)) |
| 102 | FrameAlign = FuncInfo.getParamAlignment(OpIdx - 2); |
Tim Northover | 9a46718 | 2016-09-21 12:57:45 +0000 | [diff] [blame] | 103 | else |
| 104 | FrameAlign = getTLI()->getByValTypeAlignment(ElementTy, DL); |
| 105 | Arg.Flags.setByValAlign(FrameAlign); |
| 106 | } |
| 107 | if (Attrs.hasAttribute(OpIdx, Attribute::Nest)) |
| 108 | Arg.Flags.setNest(); |
| 109 | Arg.Flags.setOrigAlign(DL.getABITypeAlignment(Arg.Ty)); |
| 110 | } |
| 111 | |
| 112 | template void |
| 113 | CallLowering::setArgFlags<Function>(CallLowering::ArgInfo &Arg, unsigned OpIdx, |
| 114 | const DataLayout &DL, |
| 115 | const Function &FuncInfo) const; |
| 116 | |
| 117 | template void |
| 118 | CallLowering::setArgFlags<CallInst>(CallLowering::ArgInfo &Arg, unsigned OpIdx, |
| 119 | const DataLayout &DL, |
| 120 | const CallInst &FuncInfo) const; |
Diana Picus | f11f042 | 2016-12-05 10:40:33 +0000 | [diff] [blame] | 121 | |
Diana Picus | c3dbe23 | 2019-06-27 08:54:17 +0000 | [diff] [blame] | 122 | Register CallLowering::packRegs(ArrayRef<Register> SrcRegs, Type *PackedTy, |
| 123 | MachineIRBuilder &MIRBuilder) const { |
| 124 | assert(SrcRegs.size() > 1 && "Nothing to pack"); |
| 125 | |
| 126 | const DataLayout &DL = MIRBuilder.getMF().getDataLayout(); |
| 127 | MachineRegisterInfo *MRI = MIRBuilder.getMRI(); |
| 128 | |
| 129 | LLT PackedLLT = getLLTForType(*PackedTy, DL); |
| 130 | |
| 131 | SmallVector<LLT, 8> LLTs; |
| 132 | SmallVector<uint64_t, 8> Offsets; |
| 133 | computeValueLLTs(DL, *PackedTy, LLTs, &Offsets); |
| 134 | assert(LLTs.size() == SrcRegs.size() && "Regs / types mismatch"); |
| 135 | |
| 136 | Register Dst = MRI->createGenericVirtualRegister(PackedLLT); |
| 137 | MIRBuilder.buildUndef(Dst); |
| 138 | for (unsigned i = 0; i < SrcRegs.size(); ++i) { |
| 139 | Register NewDst = MRI->createGenericVirtualRegister(PackedLLT); |
| 140 | MIRBuilder.buildInsert(NewDst, Dst, SrcRegs[i], Offsets[i]); |
| 141 | Dst = NewDst; |
| 142 | } |
| 143 | |
| 144 | return Dst; |
| 145 | } |
| 146 | |
| 147 | void CallLowering::unpackRegs(ArrayRef<Register> DstRegs, Register SrcReg, |
| 148 | Type *PackedTy, |
| 149 | MachineIRBuilder &MIRBuilder) const { |
| 150 | assert(DstRegs.size() > 1 && "Nothing to unpack"); |
| 151 | |
| 152 | const DataLayout &DL = MIRBuilder.getMF().getDataLayout(); |
| 153 | |
| 154 | SmallVector<LLT, 8> LLTs; |
| 155 | SmallVector<uint64_t, 8> Offsets; |
| 156 | computeValueLLTs(DL, *PackedTy, LLTs, &Offsets); |
| 157 | assert(LLTs.size() == DstRegs.size() && "Regs / types mismatch"); |
| 158 | |
| 159 | for (unsigned i = 0; i < DstRegs.size(); ++i) |
| 160 | MIRBuilder.buildExtract(DstRegs[i], SrcReg, Offsets[i]); |
| 161 | } |
| 162 | |
Diana Picus | f11f042 | 2016-12-05 10:40:33 +0000 | [diff] [blame] | 163 | bool CallLowering::handleAssignments(MachineIRBuilder &MIRBuilder, |
Diana Picus | f11f042 | 2016-12-05 10:40:33 +0000 | [diff] [blame] | 164 | ArrayRef<ArgInfo> Args, |
| 165 | ValueHandler &Handler) const { |
| 166 | MachineFunction &MF = MIRBuilder.getMF(); |
Matthias Braun | f1caa28 | 2017-12-15 22:22:58 +0000 | [diff] [blame] | 167 | const Function &F = MF.getFunction(); |
Diana Picus | f11f042 | 2016-12-05 10:40:33 +0000 | [diff] [blame] | 168 | SmallVector<CCValAssign, 16> ArgLocs; |
| 169 | CCState CCInfo(F.getCallingConv(), F.isVarArg(), MF, ArgLocs, F.getContext()); |
Matt Arsenault | 1c3f4ec | 2019-07-16 22:41:34 +0000 | [diff] [blame] | 170 | return handleAssignments(CCInfo, ArgLocs, MIRBuilder, Args, Handler); |
| 171 | } |
| 172 | |
| 173 | bool CallLowering::handleAssignments(CCState &CCInfo, |
| 174 | SmallVectorImpl<CCValAssign> &ArgLocs, |
| 175 | MachineIRBuilder &MIRBuilder, |
| 176 | ArrayRef<ArgInfo> Args, |
| 177 | ValueHandler &Handler) const { |
| 178 | MachineFunction &MF = MIRBuilder.getMF(); |
| 179 | const Function &F = MF.getFunction(); |
| 180 | const DataLayout &DL = F.getParent()->getDataLayout(); |
Diana Picus | f11f042 | 2016-12-05 10:40:33 +0000 | [diff] [blame] | 181 | |
| 182 | unsigned NumArgs = Args.size(); |
| 183 | for (unsigned i = 0; i != NumArgs; ++i) { |
| 184 | MVT CurVT = MVT::getVT(Args[i].Ty); |
Amara Emerson | 2b523f8 | 2019-04-09 21:22:33 +0000 | [diff] [blame] | 185 | if (Handler.assignArg(i, CurVT, CurVT, CCValAssign::Full, Args[i], CCInfo)) { |
| 186 | // Try to use the register type if we couldn't assign the VT. |
Amara Emerson | bc1172d | 2019-08-05 23:05:28 +0000 | [diff] [blame] | 187 | if (!Handler.isIncomingArgumentHandler() || !CurVT.isValid()) |
Matt Arsenault | e3a676e | 2019-06-24 15:50:29 +0000 | [diff] [blame] | 188 | return false; |
Amara Emerson | 2b523f8 | 2019-04-09 21:22:33 +0000 | [diff] [blame] | 189 | CurVT = TLI->getRegisterTypeForCallingConv( |
| 190 | F.getContext(), F.getCallingConv(), EVT(CurVT)); |
| 191 | if (Handler.assignArg(i, CurVT, CurVT, CCValAssign::Full, Args[i], CCInfo)) |
| 192 | return false; |
| 193 | } |
Diana Picus | f11f042 | 2016-12-05 10:40:33 +0000 | [diff] [blame] | 194 | } |
| 195 | |
Diana Picus | ca6a890 | 2017-02-16 07:53:07 +0000 | [diff] [blame] | 196 | for (unsigned i = 0, e = Args.size(), j = 0; i != e; ++i, ++j) { |
| 197 | assert(j < ArgLocs.size() && "Skipped too many arg locs"); |
| 198 | |
| 199 | CCValAssign &VA = ArgLocs[j]; |
| 200 | assert(VA.getValNo() == i && "Location doesn't correspond to current arg"); |
| 201 | |
| 202 | if (VA.needsCustom()) { |
| 203 | j += Handler.assignCustomValue(Args[i], makeArrayRef(ArgLocs).slice(j)); |
| 204 | continue; |
| 205 | } |
Diana Picus | f11f042 | 2016-12-05 10:40:33 +0000 | [diff] [blame] | 206 | |
Diana Picus | 69ce1c13 | 2019-06-27 08:50:53 +0000 | [diff] [blame] | 207 | assert(Args[i].Regs.size() == 1 && |
| 208 | "Can't handle multiple virtual regs yet"); |
| 209 | |
| 210 | // FIXME: Pack registers if we have more than one. |
Matt Arsenault | 7e71902 | 2019-07-11 14:18:19 +0000 | [diff] [blame] | 211 | Register ArgReg = Args[i].Regs[0]; |
Diana Picus | 69ce1c13 | 2019-06-27 08:50:53 +0000 | [diff] [blame] | 212 | |
Amara Emerson | 2b523f8 | 2019-04-09 21:22:33 +0000 | [diff] [blame] | 213 | if (VA.isRegLoc()) { |
| 214 | MVT OrigVT = MVT::getVT(Args[i].Ty); |
| 215 | MVT VAVT = VA.getValVT(); |
Amara Emerson | bc1172d | 2019-08-05 23:05:28 +0000 | [diff] [blame] | 216 | if (Handler.isIncomingArgumentHandler() && VAVT != OrigVT) { |
Amara Emerson | 2b523f8 | 2019-04-09 21:22:33 +0000 | [diff] [blame] | 217 | if (VAVT.getSizeInBits() < OrigVT.getSizeInBits()) |
| 218 | return false; // Can't handle this type of arg yet. |
| 219 | const LLT VATy(VAVT); |
Matt Arsenault | 7e71902 | 2019-07-11 14:18:19 +0000 | [diff] [blame] | 220 | Register NewReg = |
Amara Emerson | 2b523f8 | 2019-04-09 21:22:33 +0000 | [diff] [blame] | 221 | MIRBuilder.getMRI()->createGenericVirtualRegister(VATy); |
| 222 | Handler.assignValueToReg(NewReg, VA.getLocReg(), VA); |
| 223 | // If it's a vector type, we either need to truncate the elements |
| 224 | // or do an unmerge to get the lower block of elements. |
| 225 | if (VATy.isVector() && |
| 226 | VATy.getNumElements() > OrigVT.getVectorNumElements()) { |
| 227 | const LLT OrigTy(OrigVT); |
| 228 | // Just handle the case where the VA type is 2 * original type. |
| 229 | if (VATy.getNumElements() != OrigVT.getVectorNumElements() * 2) { |
| 230 | LLVM_DEBUG(dbgs() |
| 231 | << "Incoming promoted vector arg has too many elts"); |
| 232 | return false; |
| 233 | } |
| 234 | auto Unmerge = MIRBuilder.buildUnmerge({OrigTy, OrigTy}, {NewReg}); |
Diana Picus | 69ce1c13 | 2019-06-27 08:50:53 +0000 | [diff] [blame] | 235 | MIRBuilder.buildCopy(ArgReg, Unmerge.getReg(0)); |
Amara Emerson | 2b523f8 | 2019-04-09 21:22:33 +0000 | [diff] [blame] | 236 | } else { |
Diana Picus | 69ce1c13 | 2019-06-27 08:50:53 +0000 | [diff] [blame] | 237 | MIRBuilder.buildTrunc(ArgReg, {NewReg}).getReg(0); |
Amara Emerson | 2b523f8 | 2019-04-09 21:22:33 +0000 | [diff] [blame] | 238 | } |
| 239 | } else { |
Diana Picus | 69ce1c13 | 2019-06-27 08:50:53 +0000 | [diff] [blame] | 240 | Handler.assignValueToReg(ArgReg, VA.getLocReg(), VA); |
Amara Emerson | 2b523f8 | 2019-04-09 21:22:33 +0000 | [diff] [blame] | 241 | } |
| 242 | } else if (VA.isMemLoc()) { |
| 243 | MVT VT = MVT::getVT(Args[i].Ty); |
| 244 | unsigned Size = VT == MVT::iPTR ? DL.getPointerSize() |
| 245 | : alignTo(VT.getSizeInBits(), 8) / 8; |
Diana Picus | f11f042 | 2016-12-05 10:40:33 +0000 | [diff] [blame] | 246 | unsigned Offset = VA.getLocMemOffset(); |
| 247 | MachinePointerInfo MPO; |
Matt Arsenault | 7e71902 | 2019-07-11 14:18:19 +0000 | [diff] [blame] | 248 | Register StackAddr = Handler.getStackAddress(Size, Offset, MPO); |
Diana Picus | 69ce1c13 | 2019-06-27 08:50:53 +0000 | [diff] [blame] | 249 | Handler.assignValueToAddress(ArgReg, StackAddr, Size, MPO, VA); |
Diana Picus | f11f042 | 2016-12-05 10:40:33 +0000 | [diff] [blame] | 250 | } else { |
| 251 | // FIXME: Support byvals and other weirdness |
| 252 | return false; |
| 253 | } |
| 254 | } |
| 255 | return true; |
| 256 | } |
Diana Picus | 2d9adbf | 2016-12-13 10:46:12 +0000 | [diff] [blame] | 257 | |
Matt Arsenault | faeaedf | 2019-06-24 16:16:12 +0000 | [diff] [blame] | 258 | Register CallLowering::ValueHandler::extendRegister(Register ValReg, |
Diana Picus | 2d9adbf | 2016-12-13 10:46:12 +0000 | [diff] [blame] | 259 | CCValAssign &VA) { |
| 260 | LLT LocTy{VA.getLocVT()}; |
Amara Emerson | 2b523f8 | 2019-04-09 21:22:33 +0000 | [diff] [blame] | 261 | if (LocTy.getSizeInBits() == MRI.getType(ValReg).getSizeInBits()) |
| 262 | return ValReg; |
Diana Picus | 2d9adbf | 2016-12-13 10:46:12 +0000 | [diff] [blame] | 263 | switch (VA.getLocInfo()) { |
| 264 | default: break; |
| 265 | case CCValAssign::Full: |
| 266 | case CCValAssign::BCvt: |
| 267 | // FIXME: bitconverting between vector types may or may not be a |
| 268 | // nop in big-endian situations. |
| 269 | return ValReg; |
Aditya Nandakumar | c3bfc81 | 2017-10-09 20:07:43 +0000 | [diff] [blame] | 270 | case CCValAssign::AExt: { |
Aditya Nandakumar | c3bfc81 | 2017-10-09 20:07:43 +0000 | [diff] [blame] | 271 | auto MIB = MIRBuilder.buildAnyExt(LocTy, ValReg); |
| 272 | return MIB->getOperand(0).getReg(); |
| 273 | } |
Diana Picus | 2d9adbf | 2016-12-13 10:46:12 +0000 | [diff] [blame] | 274 | case CCValAssign::SExt: { |
Matt Arsenault | 7e71902 | 2019-07-11 14:18:19 +0000 | [diff] [blame] | 275 | Register NewReg = MRI.createGenericVirtualRegister(LocTy); |
Diana Picus | 2d9adbf | 2016-12-13 10:46:12 +0000 | [diff] [blame] | 276 | MIRBuilder.buildSExt(NewReg, ValReg); |
| 277 | return NewReg; |
| 278 | } |
| 279 | case CCValAssign::ZExt: { |
Matt Arsenault | 7e71902 | 2019-07-11 14:18:19 +0000 | [diff] [blame] | 280 | Register NewReg = MRI.createGenericVirtualRegister(LocTy); |
Diana Picus | 2d9adbf | 2016-12-13 10:46:12 +0000 | [diff] [blame] | 281 | MIRBuilder.buildZExt(NewReg, ValReg); |
| 282 | return NewReg; |
| 283 | } |
| 284 | } |
| 285 | llvm_unreachable("unable to extend register"); |
| 286 | } |
Richard Trieu | a87b70d | 2018-12-29 02:02:13 +0000 | [diff] [blame] | 287 | |
| 288 | void CallLowering::ValueHandler::anchor() {} |