From: Quentin Colombet Date: Thu, 11 Feb 2016 19:59:41 +0000 (+0000) Subject: [GlobalISel] Add the necessary plumbing to lower formal arguments. X-Git-Tag: llvmorg-3.9.0-rc1~14391 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fd9d0a07d8f74b22f8f7cb8f803ac7f8321a0204;p=platform%2Fupstream%2Fllvm.git [GlobalISel] Add the necessary plumbing to lower formal arguments. llvm-svn: 260579 --- diff --git a/llvm/include/llvm/Target/TargetLowering.h b/llvm/include/llvm/Target/TargetLowering.h index 857e59a..4f38f64 100644 --- a/llvm/include/llvm/Target/TargetLowering.h +++ b/llvm/include/llvm/Target/TargetLowering.h @@ -33,6 +33,9 @@ #include "llvm/IR/Attributes.h" #include "llvm/IR/CallSite.h" #include "llvm/IR/CallingConv.h" +#ifdef LLVM_BUILD_GLOBAL_ISEL +# include "llvm/IR/Function.h" +#endif #include "llvm/IR/IRBuilder.h" #include "llvm/IR/InlineAsm.h" #include "llvm/IR/Instructions.h" @@ -2517,6 +2520,22 @@ public: unsigned VReg) const { return false; } + + /// This hook must be implemented to lower the incoming (formal) + /// arguments, described by \p Args, for GlobalISel. Each argument + /// must end up in the related virtual register described by VRegs. + /// In other words, the first argument should end up in VRegs[0], + /// the second in VRegs[1], and so on. + /// \p MIRBuilder is set to the proper insertion for the argument + /// lowering. + /// + /// \return True if the lowering succeeded, false otherwise. + virtual bool + LowerFormalArguments(MachineIRBuilder &MIRBuilder, + const Function::ArgumentListType &Args, + const SmallVectorImpl &VRegs) const { + return false; + } #endif /// Return true if result of the specified node is used by a return node diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 4368f92..8b93f45 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -12,6 +12,7 @@ #include "llvm/CodeGen/GlobalISel/IRTranslator.h" +#include "llvm/ADT/SmallVector.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/IR/Constant.h" @@ -103,9 +104,22 @@ void IRTranslator::finalize() { bool IRTranslator::runOnMachineFunction(MachineFunction &MF) { const Function &F = *MF.getFunction(); + if (F.empty()) + return false; TLI = MF.getSubtarget().getTargetLowering(); MIRBuilder.setFunction(MF); MRI = &MF.getRegInfo(); + // Setup the arguments. + MachineBasicBlock &MBB = getOrCreateBB(&F.front()); + MIRBuilder.setBasicBlock(MBB); + SmallVector VRegArgs; + for (const Argument &Arg: F.args()) + VRegArgs.push_back(*getOrCreateVRegs(&Arg).begin()); + bool Succeeded = TLI->LowerFormalArguments(MIRBuilder, F.getArgumentList(), + VRegArgs); + if (!Succeeded) + report_fatal_error("Unable to lower arguments"); + for (const BasicBlock &BB: F) { MachineBasicBlock &MBB = getOrCreateBB(&BB); MIRBuilder.setBasicBlock(MBB);