diff --git a/llvm/include/llvm/CodeGen/LiveIntervals.h b/llvm/include/llvm/CodeGen/LiveIntervals.h index 161bb247a0e96..540651ea11442 100644 --- a/llvm/include/llvm/CodeGen/LiveIntervals.h +++ b/llvm/include/llvm/CodeGen/LiveIntervals.h @@ -113,6 +113,9 @@ class LiveIntervals { LiveIntervals(LiveIntervals &&) = default; ~LiveIntervals(); + bool invalidate(MachineFunction &MF, const PreservedAnalyses &PA, + MachineFunctionAnalysisManager::Invalidator &Inv); + /// Calculate the spill weight to assign to a single instruction. /// If \p PSI is provided the calculation is altered for optsize functions. static float getSpillWeight(bool isDef, bool isUse, diff --git a/llvm/lib/CodeGen/LiveIntervals.cpp b/llvm/lib/CodeGen/LiveIntervals.cpp index f38527a3ce6a3..4fdfcf547542d 100644 --- a/llvm/lib/CodeGen/LiveIntervals.cpp +++ b/llvm/lib/CodeGen/LiveIntervals.cpp @@ -127,6 +127,20 @@ LiveIntervalsWrapperPass::LiveIntervalsWrapperPass() : MachineFunctionPass(ID) { LiveIntervals::~LiveIntervals() { clear(); } +bool LiveIntervals::invalidate( + MachineFunction &MF, const PreservedAnalyses &PA, + MachineFunctionAnalysisManager::Invalidator &Inv) { + auto PAC = PA.getChecker(); + + if (!PAC.preserved() && !PAC.preservedSet>()) + return true; + + // LiveIntervals holds pointers to these results, so check for their + // invalidation. + return Inv.invalidate(MF, PA) || + Inv.invalidate(MF, PA); +} + void LiveIntervals::clear() { // Free the live intervals themselves. for (unsigned i = 0, e = VirtRegIntervals.size(); i != e; ++i)