diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/Combiner.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/Combiner.cpp | 63 |
1 files changed, 39 insertions, 24 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/Combiner.cpp b/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/Combiner.cpp index 748fa273d499..d18e65a83484 100644 --- a/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/Combiner.cpp +++ b/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/Combiner.cpp @@ -39,7 +39,6 @@ cl::OptionCategory GICombinerOptionCategory( ); } // end namespace llvm -namespace { /// This class acts as the glue the joins the CombinerHelper to the overall /// Combine algorithm. The CombinerHelper is intended to report the /// modifications it makes to the MIR to the GISelChangeObserver and the @@ -48,7 +47,7 @@ namespace { /// instruction creation will schedule that instruction for a future visit. /// Other Combiner implementations may require more complex behaviour from /// their GISelChangeObserver subclass. -class WorkListMaintainer : public GISelChangeObserver { +class Combiner::WorkListMaintainer : public GISelChangeObserver { using WorkListTy = GISelWorkList<512>; WorkListTy &WorkList; /// The instructions that have been created but we want to report once they @@ -88,27 +87,46 @@ public: LLVM_DEBUG(CreatedInstrs.clear()); } }; -} -Combiner::Combiner(CombinerInfo &Info, const TargetPassConfig *TPC) - : CInfo(Info), TPC(TPC) { +Combiner::Combiner(MachineFunction &MF, CombinerInfo &CInfo, + const TargetPassConfig *TPC, GISelKnownBits *KB, + GISelCSEInfo *CSEInfo) + : Builder(CSEInfo ? std::make_unique<CSEMIRBuilder>() + : std::make_unique<MachineIRBuilder>()), + WLObserver(std::make_unique<WorkListMaintainer>(WorkList)), + ObserverWrapper(std::make_unique<GISelObserverWrapper>()), CInfo(CInfo), + Observer(*ObserverWrapper), B(*Builder), MF(MF), MRI(MF.getRegInfo()), + KB(KB), TPC(TPC), CSEInfo(CSEInfo) { (void)this->TPC; // FIXME: Remove when used. + + // Setup builder. + B.setMF(MF); + if (CSEInfo) + B.setCSEInfo(CSEInfo); + + // Setup observer. + ObserverWrapper->addObserver(WLObserver.get()); + if (CSEInfo) + ObserverWrapper->addObserver(CSEInfo); + + B.setChangeObserver(*ObserverWrapper); } -bool Combiner::combineMachineInstrs(MachineFunction &MF, - GISelCSEInfo *CSEInfo) { +Combiner::~Combiner() = default; + +bool Combiner::combineMachineInstrs() { // If the ISel pipeline failed, do not bother running this pass. // FIXME: Should this be here or in individual combiner passes. if (MF.getProperties().hasProperty( MachineFunctionProperties::Property::FailedISel)) return false; - Builder = - CSEInfo ? std::make_unique<CSEMIRBuilder>() : std::make_unique<MachineIRBuilder>(); - MRI = &MF.getRegInfo(); - Builder->setMF(MF); - if (CSEInfo) - Builder->setCSEInfo(CSEInfo); + // We can't call this in the constructor because the derived class is + // uninitialized at that time. + if (!HasSetupMF) { + HasSetupMF = true; + setupMF(MF, KB); + } LLVM_DEBUG(dbgs() << "Generic MI Combiner for: " << MF.getName() << '\n'); @@ -116,26 +134,23 @@ bool Combiner::combineMachineInstrs(MachineFunction &MF, bool MFChanged = false; bool Changed; - MachineIRBuilder &B = *Builder; do { + WorkList.clear(); + // Collect all instructions. Do a post order traversal for basic blocks and // insert with list bottom up, so while we pop_back_val, we'll traverse top // down RPOT. Changed = false; - GISelWorkList<512> WorkList; - WorkListMaintainer Observer(WorkList); - GISelObserverWrapper WrapperObserver(&Observer); - if (CSEInfo) - WrapperObserver.addObserver(CSEInfo); - RAIIDelegateInstaller DelInstall(MF, &WrapperObserver); + + RAIIDelegateInstaller DelInstall(MF, ObserverWrapper.get()); for (MachineBasicBlock *MBB : post_order(&MF)) { for (MachineInstr &CurMI : llvm::make_early_inc_range(llvm::reverse(*MBB))) { // Erase dead insts before even adding to the list. - if (isTriviallyDead(CurMI, *MRI)) { + if (isTriviallyDead(CurMI, MRI)) { LLVM_DEBUG(dbgs() << CurMI << "Is dead; erasing.\n"); - llvm::salvageDebugInfo(*MRI, CurMI); + llvm::salvageDebugInfo(MRI, CurMI); CurMI.eraseFromParent(); continue; } @@ -147,8 +162,8 @@ bool Combiner::combineMachineInstrs(MachineFunction &MF, while (!WorkList.empty()) { MachineInstr *CurrInst = WorkList.pop_back_val(); LLVM_DEBUG(dbgs() << "\nTry combining " << *CurrInst;); - Changed |= CInfo.combine(WrapperObserver, *CurrInst, B); - Observer.reportFullyCreatedInstrs(); + Changed |= tryCombineAll(*CurrInst); + WLObserver->reportFullyCreatedInstrs(); } MFChanged |= Changed; } while (Changed); |