From 68eb08646c012555bb6b1ab1678d6d745b0a3ebe Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Mon, 13 Apr 2020 10:17:29 -0700 Subject: [PATCH] [CallSite removal][GlobalISel] Use CallBase instead of CallSite in lowerCall and translateCallBase. Differential Revision: https://reviews.llvm.org/D78001 --- .../include/llvm/CodeGen/GlobalISel/CallLowering.h | 2 +- .../include/llvm/CodeGen/GlobalISel/IRTranslator.h | 3 +- llvm/lib/CodeGen/GlobalISel/CallLowering.cpp | 38 +++++++++++----------- llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 19 +++++------ 4 files changed, 30 insertions(+), 32 deletions(-) diff --git a/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h b/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h index 533a12b..cf21ee9 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h @@ -328,7 +328,7 @@ public: /// range of an immediate jump. /// /// \return true if the lowering succeeded, false otherwise. - bool lowerCall(MachineIRBuilder &MIRBuilder, ImmutableCallSite CS, + bool lowerCall(MachineIRBuilder &MIRBuilder, const CallBase &Call, ArrayRef ResRegs, ArrayRef> ArgRegs, Register SwiftErrorVReg, std::function GetCalleeReg) const; diff --git a/llvm/include/llvm/CodeGen/GlobalISel/IRTranslator.h b/llvm/include/llvm/CodeGen/GlobalISel/IRTranslator.h index a4aa4a7..490a3a1 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/IRTranslator.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/IRTranslator.h @@ -244,8 +244,7 @@ private: SmallVectorImpl *Offsets = nullptr); /// Common code for translating normal calls or invokes. - bool translateCallSite(const ImmutableCallSite &CS, - MachineIRBuilder &MIRBuilder); + bool translateCallBase(const CallBase &CB, MachineIRBuilder &MIRBuilder); /// Translate call instruction. /// \pre \p U is a call instruction. diff --git a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp index 7dcc7bf..5ab327d 100644 --- a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp +++ b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp @@ -29,7 +29,7 @@ using namespace llvm; void CallLowering::anchor() {} -bool CallLowering::lowerCall(MachineIRBuilder &MIRBuilder, ImmutableCallSite CS, +bool CallLowering::lowerCall(MachineIRBuilder &MIRBuilder, const CallBase &CB, ArrayRef ResRegs, ArrayRef> ArgRegs, Register SwiftErrorVReg, @@ -41,39 +41,39 @@ bool CallLowering::lowerCall(MachineIRBuilder &MIRBuilder, ImmutableCallSite CS, // physregs and memory locations. Gather the sequence of argument types that // we'll pass to the assigner function. unsigned i = 0; - unsigned NumFixedArgs = CS.getFunctionType()->getNumParams(); - for (auto &Arg : CS.args()) { + unsigned NumFixedArgs = CB.getFunctionType()->getNumParams(); + for (auto &Arg : CB.args()) { ArgInfo OrigArg{ArgRegs[i], Arg->getType(), ISD::ArgFlagsTy{}, i < NumFixedArgs}; - setArgFlags(OrigArg, i + AttributeList::FirstArgIndex, DL, CS); + setArgFlags(OrigArg, i + AttributeList::FirstArgIndex, DL, CB); Info.OrigArgs.push_back(OrigArg); ++i; } // Try looking through a bitcast from one function type to another. // Commonly happens with calls to objc_msgSend(). - const Value *CalleeV = CS.getCalledValue()->stripPointerCasts(); + const Value *CalleeV = CB.getCalledValue()->stripPointerCasts(); if (const Function *F = dyn_cast(CalleeV)) Info.Callee = MachineOperand::CreateGA(F, 0); else Info.Callee = MachineOperand::CreateReg(GetCalleeReg(), false); - Info.OrigRet = ArgInfo{ResRegs, CS.getType(), ISD::ArgFlagsTy{}}; + Info.OrigRet = ArgInfo{ResRegs, CB.getType(), ISD::ArgFlagsTy{}}; if (!Info.OrigRet.Ty->isVoidTy()) - setArgFlags(Info.OrigRet, AttributeList::ReturnIndex, DL, CS); + setArgFlags(Info.OrigRet, AttributeList::ReturnIndex, DL, CB); MachineFunction &MF = MIRBuilder.getMF(); - Info.KnownCallees = - CS.getInstruction()->getMetadata(LLVMContext::MD_callees); - Info.CallConv = CS.getCallingConv(); + Info.KnownCallees = CB.getMetadata(LLVMContext::MD_callees); + Info.CallConv = CB.getCallingConv(); Info.SwiftErrorVReg = SwiftErrorVReg; - Info.IsMustTailCall = CS.isMustTailCall(); - Info.IsTailCall = CS.isTailCall() && - isInTailCallPosition(CS, MF.getTarget()) && - (MF.getFunction() - .getFnAttribute("disable-tail-calls") - .getValueAsString() != "true"); - Info.IsVarArg = CS.getFunctionType()->isVarArg(); + Info.IsMustTailCall = CB.isMustTailCall(); + Info.IsTailCall = + CB.isTailCall() && + isInTailCallPosition(ImmutableCallSite(&CB), MF.getTarget()) && + (MF.getFunction() + .getFnAttribute("disable-tail-calls") + .getValueAsString() != "true"); + Info.IsVarArg = CB.getFunctionType()->isVarArg(); return lowerCall(MIRBuilder, Info); } @@ -126,9 +126,9 @@ CallLowering::setArgFlags(CallLowering::ArgInfo &Arg, unsigned OpIdx, const Function &FuncInfo) const; template void -CallLowering::setArgFlags(CallLowering::ArgInfo &Arg, unsigned OpIdx, +CallLowering::setArgFlags(CallLowering::ArgInfo &Arg, unsigned OpIdx, const DataLayout &DL, - const CallInst &FuncInfo) const; + const CallBase &FuncInfo) const; Register CallLowering::packRegs(ArrayRef SrcRegs, Type *PackedTy, MachineIRBuilder &MIRBuilder) const { diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 51127ec..34b8ab7 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -1598,24 +1598,23 @@ bool IRTranslator::translateInlineAsm(const CallInst &CI, return true; } -bool IRTranslator::translateCallSite(const ImmutableCallSite &CS, +bool IRTranslator::translateCallBase(const CallBase &CB, MachineIRBuilder &MIRBuilder) { - const Instruction &I = *CS.getInstruction(); - ArrayRef Res = getOrCreateVRegs(I); + ArrayRef Res = getOrCreateVRegs(CB); SmallVector, 8> Args; Register SwiftInVReg = 0; Register SwiftErrorVReg = 0; - for (auto &Arg : CS.args()) { + for (auto &Arg : CB.args()) { if (CLI->supportSwiftError() && isSwiftError(Arg)) { assert(SwiftInVReg == 0 && "Expected only one swift error argument"); LLT Ty = getLLTForType(*Arg->getType(), *DL); SwiftInVReg = MRI->createGenericVirtualRegister(Ty); MIRBuilder.buildCopy(SwiftInVReg, SwiftError.getOrCreateVRegUseAt( - &I, &MIRBuilder.getMBB(), Arg)); + &CB, &MIRBuilder.getMBB(), Arg)); Args.emplace_back(makeArrayRef(SwiftInVReg)); SwiftErrorVReg = - SwiftError.getOrCreateVRegDefAt(&I, &MIRBuilder.getMBB(), Arg); + SwiftError.getOrCreateVRegDefAt(&CB, &MIRBuilder.getMBB(), Arg); continue; } Args.push_back(getOrCreateVRegs(*Arg)); @@ -1625,8 +1624,8 @@ bool IRTranslator::translateCallSite(const ImmutableCallSite &CS, // optimize into tail calls. Instead, we defer that to selection where a final // scan is done to check if any instructions are calls. bool Success = - CLI->lowerCall(MIRBuilder, CS, Res, Args, SwiftErrorVReg, - [&]() { return getOrCreateVReg(*CS.getCalledValue()); }); + CLI->lowerCall(MIRBuilder, CB, Res, Args, SwiftErrorVReg, + [&]() { return getOrCreateVReg(*CB.getCalledValue()); }); // Check if we just inserted a tail call. if (Success) { @@ -1664,7 +1663,7 @@ bool IRTranslator::translateCall(const User &U, MachineIRBuilder &MIRBuilder) { } if (!F || !F->isIntrinsic() || ID == Intrinsic::not_intrinsic) - return translateCallSite(&CI, MIRBuilder); + return translateCallBase(CI, MIRBuilder); assert(ID != Intrinsic::not_intrinsic && "unknown intrinsic"); @@ -1757,7 +1756,7 @@ bool IRTranslator::translateInvoke(const User &U, MCSymbol *BeginSymbol = Context.createTempSymbol(); MIRBuilder.buildInstr(TargetOpcode::EH_LABEL).addSym(BeginSymbol); - if (!translateCallSite(&I, MIRBuilder)) + if (!translateCallBase(I, MIRBuilder)) return false; MCSymbol *EndSymbol = Context.createTempSymbol(); -- 2.7.4