From 592288a50bb4218179cbdd135c00714f8db8e403 Mon Sep 17 00:00:00 2001 From: Tobias Stadler Date: Tue, 6 Aug 2024 17:34:47 +0200 Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20change?= =?UTF-8?q?s=20to=20main=20this=20commit=20is=20based=20on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.6-bogner-wip [skip ci] --- .../llvm/CodeGen/GlobalISel/GISelChangeObserver.h | 3 +++ .../include/llvm/CodeGen/GlobalISel/GISelWorkList.h | 2 +- llvm/lib/CodeGen/GlobalISel/Combiner.cpp | 13 +++++++------ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/llvm/include/llvm/CodeGen/GlobalISel/GISelChangeObserver.h b/llvm/include/llvm/CodeGen/GlobalISel/GISelChangeObserver.h index cad2216db34fe..7ec5dac9a6eba 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/GISelChangeObserver.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/GISelChangeObserver.h @@ -79,6 +79,9 @@ class GISelObserverWrapper : public MachineFunction::Delegate, if (It != Observers.end()) Observers.erase(It); } + // Removes all observers + void clearObservers() { Observers.clear(); } + // API for Observer. void erasingInstr(MachineInstr &MI) override { for (auto &O : Observers) diff --git a/llvm/include/llvm/CodeGen/GlobalISel/GISelWorkList.h b/llvm/include/llvm/CodeGen/GlobalISel/GISelWorkList.h index 3ec6a1da201e2..dba3a8a14480c 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/GISelWorkList.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/GISelWorkList.h @@ -82,7 +82,7 @@ class GISelWorkList { /// Remove I from the worklist if it exists. void remove(const MachineInstr *I) { #if LLVM_ENABLE_ABI_BREAKING_CHECKS - assert((Finalized || WorklistMap.empty()) && "Neither finalized nor empty"); + assert(Finalized && "GISelWorkList used without finalizing"); #endif auto It = WorklistMap.find(I); if (It == WorklistMap.end()) diff --git a/llvm/lib/CodeGen/GlobalISel/Combiner.cpp b/llvm/lib/CodeGen/GlobalISel/Combiner.cpp index 3310ce5455c97..49842e5fd65da 100644 --- a/llvm/lib/CodeGen/GlobalISel/Combiner.cpp +++ b/llvm/lib/CodeGen/GlobalISel/Combiner.cpp @@ -110,11 +110,6 @@ Combiner::Combiner(MachineFunction &MF, CombinerInfo &CInfo, if (CSEInfo) B.setCSEInfo(CSEInfo); - // Setup observer. - ObserverWrapper->addObserver(WLObserver.get()); - if (CSEInfo) - ObserverWrapper->addObserver(CSEInfo); - B.setChangeObserver(*ObserverWrapper); } @@ -147,13 +142,16 @@ bool Combiner::combineMachineInstrs() { LLVM_DEBUG(dbgs() << "\n\nCombiner iteration #" << Iteration << '\n'); WorkList.clear(); + ObserverWrapper->clearObservers(); + if (CSEInfo) + ObserverWrapper->addObserver(CSEInfo); // 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; - RAIIDelegateInstaller DelInstall(MF, ObserverWrapper.get()); + RAIIMFObsDelInstaller DelInstall(MF, *ObserverWrapper); for (MachineBasicBlock *MBB : post_order(&MF)) { for (MachineInstr &CurMI : llvm::make_early_inc_range(llvm::reverse(*MBB))) { @@ -168,6 +166,9 @@ bool Combiner::combineMachineInstrs() { } } WorkList.finalize(); + + // Only notify WLObserver during actual combines + ObserverWrapper->addObserver(WLObserver.get()); // Main Loop. Process the instructions here. while (!WorkList.empty()) { MachineInstr *CurrInst = WorkList.pop_back_val();