From: Ahmed Bougacha Date: Fri, 10 Mar 2017 00:25:44 +0000 (+0000) Subject: [GlobalISel] Use ImmutableCallSite instead of templates. NFC. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a3782b7e75ef17565d53ee9716cfb48a0f7a40cb;p=llvm [GlobalISel] Use ImmutableCallSite instead of templates. NFC. ImmutableCallSite abstracts away CallInst and InvokeInst. Use it! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297426 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/CodeGen/GlobalISel/CallLowering.h b/include/llvm/CodeGen/GlobalISel/CallLowering.h index fac5a8bd80a..14d30501f11 100644 --- a/include/llvm/CodeGen/GlobalISel/CallLowering.h +++ b/include/llvm/CodeGen/GlobalISel/CallLowering.h @@ -177,11 +177,10 @@ public: return false; } - /// This hook must be implemented to lower the given call instruction, - /// including argument and return value marshalling. + /// Lower the given call instruction, including argument and return value + /// marshalling. /// - /// \p CI is either a CallInst or InvokeInst reference (other instantiations - /// will fail at link time). + /// \p CI is the call/invoke instruction. /// /// \p ResReg is a register where the call's return value should be stored (or /// 0 if there is no return value). @@ -195,8 +194,7 @@ public: /// range of an immediate jump. /// /// \return true if the lowering succeeded, false otherwise. - template - bool lowerCall(MachineIRBuilder &MIRBuilder, const CallInstTy &CI, + bool lowerCall(MachineIRBuilder &MIRBuilder, ImmutableCallSite CS, unsigned ResReg, ArrayRef ArgRegs, std::function GetCalleeReg) const; }; diff --git a/lib/CodeGen/GlobalISel/CallLowering.cpp b/lib/CodeGen/GlobalISel/CallLowering.cpp index 90427b27cd0..e45ae4a77f2 100644 --- a/lib/CodeGen/GlobalISel/CallLowering.cpp +++ b/lib/CodeGen/GlobalISel/CallLowering.cpp @@ -23,49 +23,38 @@ using namespace llvm; -template bool CallLowering::lowerCall( - MachineIRBuilder &MIRBuilder, const CallInstTy &CI, unsigned ResReg, + MachineIRBuilder &MIRBuilder, ImmutableCallSite CS, unsigned ResReg, ArrayRef ArgRegs, std::function GetCalleeReg) const { - auto &DL = CI.getParent()->getParent()->getParent()->getDataLayout(); + auto &DL = CS.getParent()->getParent()->getParent()->getDataLayout(); // First step is to marshall all the function's parameters into the correct // physregs and memory locations. Gather the sequence of argument types that // we'll pass to the assigner function. SmallVector OrigArgs; unsigned i = 0; - unsigned NumFixedArgs = CI.getFunctionType()->getNumParams(); - for (auto &Arg : CI.arg_operands()) { + unsigned NumFixedArgs = CS.getFunctionType()->getNumParams(); + for (auto &Arg : CS.args()) { ArgInfo OrigArg{ArgRegs[i], Arg->getType(), ISD::ArgFlagsTy{}, i < NumFixedArgs}; - setArgFlags(OrigArg, i + 1, DL, CI); + setArgFlags(OrigArg, i + 1, DL, CS); OrigArgs.push_back(OrigArg); ++i; } MachineOperand Callee = MachineOperand::CreateImm(0); - if (Function *F = CI.getCalledFunction()) + if (const Function *F = CS.getCalledFunction()) Callee = MachineOperand::CreateGA(F, 0); else Callee = MachineOperand::CreateReg(GetCalleeReg(), false); - ArgInfo OrigRet{ResReg, CI.getType(), ISD::ArgFlagsTy{}}; + ArgInfo OrigRet{ResReg, CS.getType(), ISD::ArgFlagsTy{}}; if (!OrigRet.Ty->isVoidTy()) - setArgFlags(OrigRet, AttributeSet::ReturnIndex, DL, CI); + setArgFlags(OrigRet, AttributeSet::ReturnIndex, DL, CS); return lowerCall(MIRBuilder, Callee, OrigRet, OrigArgs); } -template bool -CallLowering::lowerCall(MachineIRBuilder &MIRBuilder, const CallInst &CI, - unsigned ResReg, ArrayRef ArgRegs, - std::function GetCalleeReg) const; - -template bool -CallLowering::lowerCall(MachineIRBuilder &MIRBuilder, const InvokeInst &CI, - unsigned ResReg, ArrayRef ArgRegs, - std::function GetCalleeReg) const; - template void CallLowering::setArgFlags(CallLowering::ArgInfo &Arg, unsigned OpIdx, const DataLayout &DL, diff --git a/lib/CodeGen/GlobalISel/IRTranslator.cpp b/lib/CodeGen/GlobalISel/IRTranslator.cpp index 1e8f6c222d7..b8bb71dcc2c 100644 --- a/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -749,7 +749,7 @@ bool IRTranslator::translateCall(const User &U, MachineIRBuilder &MIRBuilder) { Args.push_back(getOrCreateVReg(*Arg)); MF->getFrameInfo().setHasCalls(true); - return CLI->lowerCall(MIRBuilder, CI, Res, Args, [&]() { + return CLI->lowerCall(MIRBuilder, &CI, Res, Args, [&]() { return getOrCreateVReg(*CI.getCalledValue()); }); } @@ -815,7 +815,7 @@ bool IRTranslator::translateInvoke(const User &U, for (auto &Arg: I.arg_operands()) Args.push_back(getOrCreateVReg(*Arg)); - if (!CLI->lowerCall(MIRBuilder, I, Res, Args, + if (!CLI->lowerCall(MIRBuilder, &I, Res, Args, [&]() { return getOrCreateVReg(*I.getCalledValue()); })) return false;