From a52391f2dbff6f93bc29158d9d085ad15cc796ec Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Thu, 3 Aug 2017 21:54:00 +0000 Subject: [PATCH] DAG: Provide access to Pass instance from SelectionDAG This allows accessing an analysis pass during lowering. llvm-svn: 309991 --- llvm/include/llvm/CodeGen/SelectionDAG.h | 6 +++++- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 4 +++- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/llvm/include/llvm/CodeGen/SelectionDAG.h b/llvm/include/llvm/CodeGen/SelectionDAG.h index 56b4e4b7ee61..bdcc17b2e37e 100644 --- a/llvm/include/llvm/CodeGen/SelectionDAG.h +++ b/llvm/include/llvm/CodeGen/SelectionDAG.h @@ -211,6 +211,7 @@ class SelectionDAG { const SelectionDAGTargetInfo *TSI = nullptr; const TargetLowering *TLI = nullptr; MachineFunction *MF; + Pass *SDAGISelPass = nullptr; LLVMContext *Context; CodeGenOpt::Level OptLevel; @@ -366,13 +367,16 @@ public: ~SelectionDAG(); /// Prepare this SelectionDAG to process code in the given MachineFunction. - void init(MachineFunction &NewMF, OptimizationRemarkEmitter &NewORE); + void init(MachineFunction &NewMF, OptimizationRemarkEmitter &NewORE, + Pass *PassPtr); /// Clear state and free memory necessary to make this /// SelectionDAG ready to process a new block. void clear(); MachineFunction &getMachineFunction() const { return *MF; } + const Pass *getPass() const { return SDAGISelPass; } + const DataLayout &getDataLayout() const { return MF->getDataLayout(); } const TargetMachine &getTarget() const { return TM; } const TargetSubtargetInfo &getSubtarget() const { return MF->getSubtarget(); } diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index a396f3368cf8..c052bc64d7d8 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -892,8 +892,10 @@ SelectionDAG::SelectionDAG(const TargetMachine &tm, CodeGenOpt::Level OL) } void SelectionDAG::init(MachineFunction &NewMF, - OptimizationRemarkEmitter &NewORE) { + OptimizationRemarkEmitter &NewORE, + Pass *PassPtr) { MF = &NewMF; + SDAGISelPass = PassPtr; ORE = &NewORE; TLI = getSubtarget().getTargetLowering(); TSI = getSubtarget().getSelectionDAGInfo(); diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index ed9cb09dccb3..ceab4d739767 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -414,7 +414,7 @@ bool SelectionDAGISel::runOnMachineFunction(MachineFunction &mf) { SplitCriticalSideEffectEdges(const_cast(Fn), DT, LI); - CurDAG->init(*MF, *ORE); + CurDAG->init(*MF, *ORE, this); FuncInfo->set(Fn, *MF, CurDAG); // Now get the optional analyzes if we want to.