[GlobalISel] Use ImmutableCallSite instead of templates. NFC.
authorAhmed Bougacha <ahmed.bougacha@gmail.com>
Fri, 10 Mar 2017 00:25:44 +0000 (00:25 +0000)
committerAhmed Bougacha <ahmed.bougacha@gmail.com>
Fri, 10 Mar 2017 00:25:44 +0000 (00:25 +0000)
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

include/llvm/CodeGen/GlobalISel/CallLowering.h
lib/CodeGen/GlobalISel/CallLowering.cpp
lib/CodeGen/GlobalISel/IRTranslator.cpp

index fac5a8bd80a37f2aa8931fd549649b4084e8d5b1..14d30501f1188d68529871303ca252fd9ef2788e 100644 (file)
@@ -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 <typename CallInstTy>
-  bool lowerCall(MachineIRBuilder &MIRBuilder, const CallInstTy &CI,
+  bool lowerCall(MachineIRBuilder &MIRBuilder, ImmutableCallSite CS,
                  unsigned ResReg, ArrayRef<unsigned> ArgRegs,
                  std::function<unsigned()> GetCalleeReg) const;
 };
index 90427b27cd0ffa5409291d06acf4e5d6b9f7d97b..e45ae4a77f29b28e86f5a335e16c3341d6c0f82b 100644 (file)
 
 using namespace llvm;
 
-template<typename CallInstTy>
 bool CallLowering::lowerCall(
-    MachineIRBuilder &MIRBuilder, const CallInstTy &CI, unsigned ResReg,
+    MachineIRBuilder &MIRBuilder, ImmutableCallSite CS, unsigned ResReg,
     ArrayRef<unsigned> ArgRegs, std::function<unsigned()> 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<ArgInfo, 8> 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<unsigned> ArgRegs,
-                        std::function<unsigned()> GetCalleeReg) const;
-
-template bool
-CallLowering::lowerCall(MachineIRBuilder &MIRBuilder, const InvokeInst &CI,
-                        unsigned ResReg, ArrayRef<unsigned> ArgRegs,
-                        std::function<unsigned()> GetCalleeReg) const;
-
 template <typename FuncInfoTy>
 void CallLowering::setArgFlags(CallLowering::ArgInfo &Arg, unsigned OpIdx,
                                const DataLayout &DL,
index 1e8f6c222d71f6fc723de4c8e406900df49030e0..b8bb71dcc2c931f7490d8907b6feaaa31209aca3 100644 (file)
@@ -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;