[llvm] [PassManager] Make passes inherit from MandatoryPassInfoMixin/OptionalPassInfoMixin (PR #192120)

via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 14 12:59:52 PDT 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-debuginfo

Author: Arthur Eubanks (aeubanks)

<details>
<summary>Changes</summary>

It's very easy to forget to add `isRequired() { return true; }` for passes that must be run on all IR, rather than e.g. being skipped on optnone functions.

This PR adds MandatoryPassInfoMixin/OptionalPassInfoMixin which have `isRequired()`, and the long term vision is there to be no default `isRequired()` on PassInfoMixin.

However, for out-of-tree migration purposes, we leave a `isRequired() { return false; }` for now in PassInfoMixin.

---

Patch is 367.06 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/192120.diff


439 Files Affected:

- (modified) llvm/docs/WritingAnLLVMNewPMPass.rst (+11-8) 
- (modified) llvm/examples/Bye/Bye.cpp (+1-1) 
- (modified) llvm/examples/IRTransforms/SimplifyCFG.cpp (+1-1) 
- (modified) llvm/include/llvm/Analysis/AliasAnalysisEvaluator.h (+1-1) 
- (modified) llvm/include/llvm/Analysis/AliasSetTracker.h (+2-2) 
- (modified) llvm/include/llvm/Analysis/AssumptionCache.h (+2-3) 
- (modified) llvm/include/llvm/Analysis/BlockFrequencyInfo.h (+1-3) 
- (modified) llvm/include/llvm/Analysis/BranchProbabilityInfo.h (+1-3) 
- (modified) llvm/include/llvm/Analysis/CFGPrinter.h (+4-8) 
- (modified) llvm/include/llvm/Analysis/CFGSCCPrinter.h (+1-2) 
- (modified) llvm/include/llvm/Analysis/CGSCCPassManager.h (+7-10) 
- (modified) llvm/include/llvm/Analysis/CallGraph.h (+3-6) 
- (modified) llvm/include/llvm/Analysis/CallPrinter.h (+3-4) 
- (modified) llvm/include/llvm/Analysis/CostModel.h (+2-3) 
- (modified) llvm/include/llvm/Analysis/CtxProfAnalysis.h (+2-3) 
- (modified) llvm/include/llvm/Analysis/CycleAnalysis.h (+4-4) 
- (modified) llvm/include/llvm/Analysis/DDG.h (+2-2) 
- (modified) llvm/include/llvm/Analysis/DDGPrinter.h (+1-2) 
- (modified) llvm/include/llvm/Analysis/DOTGraphTraitsPass.h (+4-4) 
- (modified) llvm/include/llvm/Analysis/DXILMetadataAnalysis.h (+1-3) 
- (modified) llvm/include/llvm/Analysis/DXILResource.h (+2-3) 
- (modified) llvm/include/llvm/Analysis/Delinearization.h (+1-2) 
- (modified) llvm/include/llvm/Analysis/DemandedBits.h (+2-3) 
- (modified) llvm/include/llvm/Analysis/DependenceAnalysis.h (+1-3) 
- (modified) llvm/include/llvm/Analysis/DominanceFrontier.h (+1-3) 
- (modified) llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h (+2-4) 
- (modified) llvm/include/llvm/Analysis/GlobalsModRef.h (+1-1) 
- (modified) llvm/include/llvm/Analysis/HashRecognize.h (+1-1) 
- (modified) llvm/include/llvm/Analysis/IR2Vec.h (+3-4) 
- (modified) llvm/include/llvm/Analysis/IRSimilarityIdentifier.h (+1-2) 
- (modified) llvm/include/llvm/Analysis/InlineAdvisor.h (+1-2) 
- (modified) llvm/include/llvm/Analysis/InlineCost.h (+1-2) 
- (modified) llvm/include/llvm/Analysis/InstCount.h (+1-1) 
- (modified) llvm/include/llvm/Analysis/KernelInfo.h (+1-3) 
- (modified) llvm/include/llvm/Analysis/LazyCallGraph.h (+2-6) 
- (modified) llvm/include/llvm/Analysis/LazyValueInfo.h (+1-3) 
- (modified) llvm/include/llvm/Analysis/Lint.h (+1-1) 
- (modified) llvm/include/llvm/Analysis/LoopCacheAnalysis.h (+2-3) 
- (modified) llvm/include/llvm/Analysis/LoopInfo.h (+2-4) 
- (modified) llvm/include/llvm/Analysis/LoopNestAnalysis.h (+1-3) 
- (modified) llvm/include/llvm/Analysis/MemDerefPrinter.h (+1-2) 
- (modified) llvm/include/llvm/Analysis/MemorySSA.h (+4-8) 
- (modified) llvm/include/llvm/Analysis/ModuleDebugInfoPrinter.h (+1-2) 
- (modified) llvm/include/llvm/Analysis/MustExecute.h (+3-4) 
- (modified) llvm/include/llvm/Analysis/PhiValues.h (+2-2) 
- (modified) llvm/include/llvm/Analysis/PostDominators.h (+1-3) 
- (modified) llvm/include/llvm/Analysis/ProfileSummaryInfo.h (+1-2) 
- (modified) llvm/include/llvm/Analysis/RegionInfo.h (+3-5) 
- (modified) llvm/include/llvm/Analysis/ScalarEvolution.h (+2-5) 
- (modified) llvm/include/llvm/Analysis/ScalarEvolutionDivision.h (+2-1) 
- (modified) llvm/include/llvm/Analysis/StackLifetime.h (+2-2) 
- (modified) llvm/include/llvm/Analysis/StackSafetyAnalysis.h (+3-4) 
- (modified) llvm/include/llvm/Analysis/StructuralHash.h (+1-3) 
- (modified) llvm/include/llvm/Analysis/UniformityAnalysis.h (+1-3) 
- (modified) llvm/include/llvm/Bitcode/BitcodeWriterPass.h (+1-4) 
- (modified) llvm/include/llvm/CodeGen/AssignmentTrackingAnalysis.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/AtomicExpand.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/BranchFoldingPass.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/BranchRelaxation.h (+2-2) 
- (modified) llvm/include/llvm/CodeGen/CodeGenPrepare.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/ComplexDeinterleavingPass.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/DeadMachineInstructionElim.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/DetectDeadLanes.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/DwarfEHPrepare.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/EarlyIfConversion.h (+2-1) 
- (modified) llvm/include/llvm/CodeGen/ExpandIRInsts.h (+2-2) 
- (modified) llvm/include/llvm/CodeGen/ExpandPostRAPseudos.h (+2-2) 
- (modified) llvm/include/llvm/CodeGen/ExpandReductions.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/FEntryInserter.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/FinalizeISel.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/FixupStatepointCallerSaved.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/GCEmptyBasicBlocks.h (+2-1) 
- (modified) llvm/include/llvm/CodeGen/GCMetadata.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/GlobalISel/GISelValueTracking.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/GlobalMerge.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/GlobalMergeFunctions.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/HardwareLoops.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/IndirectBrExpand.h (+2-1) 
- (modified) llvm/include/llvm/CodeGen/InitUndef.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/InlineAsmPrepare.h (+2-1) 
- (modified) llvm/include/llvm/CodeGen/InterleavedAccess.h (+2-1) 
- (modified) llvm/include/llvm/CodeGen/InterleavedLoadCombine.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/JMCInstrumenter.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/LiveDebugValuesPass.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/LiveDebugVariables.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/LiveIntervals.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/LiveStacks.h (+2-1) 
- (modified) llvm/include/llvm/CodeGen/LiveVariables.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/LocalStackSlotAllocation.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/LowerEmuTLS.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/MIRPrinter.h (+2-4) 
- (modified) llvm/include/llvm/CodeGen/MachineBlockFrequencyInfo.h (+1-3) 
- (modified) llvm/include/llvm/CodeGen/MachineBlockPlacement.h (+2-4) 
- (modified) llvm/include/llvm/CodeGen/MachineBranchProbabilityInfo.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/MachineCSE.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/MachineCopyPropagation.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/MachineCycleAnalysis.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/MachineDominators.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/MachineFunctionAnalysis.h (+2-1) 
- (modified) llvm/include/llvm/CodeGen/MachineInstrBundle.h (+3-2) 
- (modified) llvm/include/llvm/CodeGen/MachineLICM.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/MachineLateInstrsCleanup.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/MachineLoopInfo.h (+2-2) 
- (modified) llvm/include/llvm/CodeGen/MachinePassManager.h (+1-3) 
- (modified) llvm/include/llvm/CodeGen/MachinePostDominators.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/MachineScheduler.h (+3-2) 
- (modified) llvm/include/llvm/CodeGen/MachineSink.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/MachineTraceMetrics.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/MachineUniformityAnalysis.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/MachineVerifier.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/OptimizePHIs.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/PEI.h (+1-3) 
- (modified) llvm/include/llvm/CodeGen/PHIElimination.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/PatchableFunction.h (+2-2) 
- (modified) llvm/include/llvm/CodeGen/PeepholeOptimizer.h (+2-1) 
- (modified) llvm/include/llvm/CodeGen/PostRAHazardRecognizer.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/PostRAMachineSink.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/PostRASchedulerList.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/PreISelIntrinsicLowering.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/ProcessImplicitDefs.h (+2-1) 
- (modified) llvm/include/llvm/CodeGen/ReachingDefAnalysis.h (+2-3) 
- (modified) llvm/include/llvm/CodeGen/RegAllocFast.h (+1-3) 
- (modified) llvm/include/llvm/CodeGen/RegAllocGreedyPass.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/RegUsageInfoPropagate.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/RegisterCoalescerPass.h (+2-1) 
- (modified) llvm/include/llvm/CodeGen/RegisterUsageInfo.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/RemoveLoadsIntoFakeUses.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/RemoveRedundantDebugValues.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/RenameIndependentSubregs.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/ReplaceWithVeclib.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/SafeStack.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/SanitizerBinaryMetadata.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/SelectOptimize.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/SelectionDAGISel.h (+2-2) 
- (modified) llvm/include/llvm/CodeGen/ShadowStackGCLowering.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/ShrinkWrap.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/SjLjEHPrepare.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/SlotIndexes.h (+2-2) 
- (modified) llvm/include/llvm/CodeGen/StackColoring.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/StackFrameLayoutAnalysisPass.h (+1-2) 
- (modified) llvm/include/llvm/CodeGen/StackProtector.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/StackSlotColoring.h (+2-1) 
- (modified) llvm/include/llvm/CodeGen/TailDuplication.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/TwoAddressInstructionPass.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/TypePromotion.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/UnreachableBlockElim.h (+2-2) 
- (modified) llvm/include/llvm/CodeGen/VirtRegMap.h (+3-5) 
- (modified) llvm/include/llvm/CodeGen/WasmEHPrepare.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/WinEHPrepare.h (+1-1) 
- (modified) llvm/include/llvm/CodeGen/XRayInstrumentation.h (+2-2) 
- (modified) llvm/include/llvm/IR/DebugInfo.h (+2-1) 
- (modified) llvm/include/llvm/IR/Dominators.h (+3-5) 
- (modified) llvm/include/llvm/IR/PassInstrumentation.h (+1-6) 
- (modified) llvm/include/llvm/IR/PassManager.h (+26-12) 
- (modified) llvm/include/llvm/IR/PassManagerInternal.h (+5-12) 
- (modified) llvm/include/llvm/IR/SafepointIRVerifier.h (+2-3) 
- (modified) llvm/include/llvm/IR/Verifier.h (+1-2) 
- (modified) llvm/include/llvm/IRPrinter/IRPrintingPasses.h (+2-4) 
- (modified) llvm/include/llvm/Passes/CodeGenPassBuilder.h (+3-3) 
- (modified) llvm/include/llvm/Passes/PassBuilder.h (+7-6) 
- (modified) llvm/include/llvm/Transforms/AggressiveInstCombine/AggressiveInstCombine.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/CFGuard.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Coroutines/CoroAnnotationElide.h (+2-3) 
- (modified) llvm/include/llvm/Transforms/Coroutines/CoroCleanup.h (+1-2) 
- (modified) llvm/include/llvm/Transforms/Coroutines/CoroConditionalWrapper.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/Coroutines/CoroEarly.h (+1-2) 
- (modified) llvm/include/llvm/Transforms/Coroutines/CoroElide.h (+1-2) 
- (modified) llvm/include/llvm/Transforms/Coroutines/CoroSplit.h (+1-3) 
- (modified) llvm/include/llvm/Transforms/HipStdPar/HipStdPar.h (+4-9) 
- (modified) llvm/include/llvm/Transforms/IPO/AlwaysInliner.h (+1-2) 
- (modified) llvm/include/llvm/Transforms/IPO/Annotation2Metadata.h (+2-1) 
- (modified) llvm/include/llvm/Transforms/IPO/ArgumentPromotion.h (+2-1) 
- (modified) llvm/include/llvm/Transforms/IPO/Attributor.h (+4-4) 
- (modified) llvm/include/llvm/Transforms/IPO/BlockExtractor.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/CalledValuePropagation.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/ConstantMerge.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/CrossDSOCFI.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/DeadArgumentElimination.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/ElimAvailExtern.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/EmbedBitcodePass.h (+1-3) 
- (modified) llvm/include/llvm/Transforms/IPO/ExpandVariadics.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/ExtractGV.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/FatLTOCleanup.h (+1-2) 
- (modified) llvm/include/llvm/Transforms/IPO/ForceFunctionAttrs.h (+1-2) 
- (modified) llvm/include/llvm/Transforms/IPO/FunctionAttrs.h (+4-3) 
- (modified) llvm/include/llvm/Transforms/IPO/FunctionImport.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/GlobalDCE.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/GlobalOpt.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/GlobalSplit.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/HotColdSplitting.h (+2-1) 
- (modified) llvm/include/llvm/Transforms/IPO/IROutliner.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/InferFunctionAttrs.h (+1-2) 
- (modified) llvm/include/llvm/Transforms/IPO/Inliner.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/IPO/Internalize.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/LoopExtractor.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/LowerTypeTests.h (+4-3) 
- (modified) llvm/include/llvm/Transforms/IPO/MemProfContextDisambiguation.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/IPO/MergeFunctions.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/ModuleInliner.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/OpenMPOpt.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/IPO/PartialInlining.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/SCCP.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/IPO/SampleProfile.h (+2-1) 
- (modified) llvm/include/llvm/Transforms/IPO/SampleProfileProbe.h (+4-2) 
- (modified) llvm/include/llvm/Transforms/IPO/StripDeadPrototypes.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/IPO/StripSymbols.h (+6-5) 
- (modified) llvm/include/llvm/Transforms/IPO/ThinLTOBitcodeWriter.h (+1-3) 
- (modified) llvm/include/llvm/Transforms/IPO/WholeProgramDevirt.h (+2-1) 
- (modified) llvm/include/llvm/Transforms/InstCombine/InstCombine.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/AddressSanitizer.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/AllocToken.h (+1-2) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/BoundsChecking.h (+1-2) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/CGProfile.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/ControlHeightReduction.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/DataFlowSanitizer.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/GCOVProfiler.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/HWAddressSanitizer.h (+3-2) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/InstrProfiling.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/KCFI.h (+1-2) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/LowerAllowCheckPass.h (+1-3) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/MemProfInstrumentation.h (+3-4) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/MemProfUse.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/MemorySanitizer.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/NumericalStabilitySanitizer.h (+1-2) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/PGOCtxProfFlattening.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/PGOCtxProfLowering.h (+4-2) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/PGOForceFunctionAttrs.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/PGOInstrumentation.h (+8-5) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/RealtimeSanitizer.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/SanitizerBinaryMetadata.h (+1-2) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/SanitizerCoverage.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/ThreadSanitizer.h (+3-4) 
- (modified) llvm/include/llvm/Transforms/Instrumentation/TypeSanitizer.h (+1-2) 
- (modified) llvm/include/llvm/Transforms/ObjCARC.h (+4-4) 
- (modified) llvm/include/llvm/Transforms/Scalar/ADCE.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/AlignmentFromAssumptions.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/AnnotationRemarks.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/Scalar/BDCE.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/CallSiteSplitting.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/ConstantHoisting.h (+2-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/ConstraintElimination.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/CorrelatedValuePropagation.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/DCE.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/Scalar/DFAJumpThreading.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/DeadStoreElimination.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/DivRemPairs.h (+1-2) 
- (modified) llvm/include/llvm/Transforms/Scalar/DropUnnecessaryAssumes.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/EarlyCSE.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/ExpandMemCmp.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/FlattenCFG.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/Float2Int.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/GVN.h (+3-3) 
- (modified) llvm/include/llvm/Transforms/Scalar/GuardWidening.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/IVUsersPrinter.h (+1-2) 
- (modified) llvm/include/llvm/Transforms/Scalar/IndVarSimplify.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/InductiveRangeCheckElimination.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/InferAddressSpaces.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/InferAlignment.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/InstSimplifyPass.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/JumpTableToSwitch.h (+2-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/JumpThreading.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LICM.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopAccessAnalysisPrinter.h (+1-2) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopBoundSplit.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopDataPrefetch.h (+2-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopDeletion.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopDistribute.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopFlatten.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopFuse.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopIdiomRecognize.h (+2-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopInstSimplify.h (+2-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopInterchange.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopLoadElimination.h (+2-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopPassManager.h (+4-8) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopPredication.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopRotation.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopSimplifyCFG.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopSink.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopStrengthReduce.h (+2-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopTermFold.h (+1-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopUnrollAndJamPass.h (+2-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopUnrollPass.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/Scalar/LoopVersioningLICM.h (+2-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/LowerAtomicPass.h (+1-3) 
- (modified) llvm/include/llvm/Transforms/Scalar/LowerConstantIntrinsics.h (+2-3) 
- (modified) llvm/include/llvm/Transforms/Scalar/LowerExpectIntrinsic.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/Scalar/LowerGuardIntrinsic.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/Scalar/LowerMatrixIntrinsics.h (+1-2) 
- (modified) llvm/include/llvm/Transforms/Scalar/LowerWidenableCondition.h (+2-2) 
- (modified) llvm/include/llvm/Transforms/Scalar/MakeGuardsExplicit.h (+2-1) 
- (modified) llvm/include/llvm/Transforms/Scalar/MemCpyOptimizer.h (+1-1) 


``````````diff
diff --git a/llvm/docs/WritingAnLLVMNewPMPass.rst b/llvm/docs/WritingAnLLVMNewPMPass.rst
index ea30d637347f1..b3f5c2ecf98cc 100644
--- a/llvm/docs/WritingAnLLVMNewPMPass.rst
+++ b/llvm/docs/WritingAnLLVMNewPMPass.rst
@@ -25,7 +25,8 @@ Unlike passes under the legacy pass manager where the pass interface is
 defined via inheritance, passes under the new pass manager rely on
 concept-based polymorphism, meaning there is no explicit interface (see
 comments in ``PassManager.h`` for more details). All LLVM passes inherit from
-the CRTP mix-in ``PassInfoMixin<PassT>``. The pass should have a ``run()``
+the CRTP mix-in ``OptionalPassInfoMixin<PassT>`` or
+``MandatoryPassInfoMixin<PassT>``. The pass should have a ``run()``
 method which returns a ``PreservedAnalyses`` and takes in some unit of IR
 along with an analysis manager. For example, a function pass would have a
 ``PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);`` method.
@@ -82,7 +83,7 @@ contain the following boilerplate:
 
   namespace llvm {
 
-  class HelloWorldPass : public PassInfoMixin<HelloWorldPass> {
+  class HelloWorldPass : public OptionalPassInfoMixin<HelloWorldPass> {
   public:
     PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
   };
@@ -92,8 +93,12 @@ contain the following boilerplate:
   #endif // LLVM_TRANSFORMS_HELLONEW_HELLOWORLD_H
 
 This creates the class for the pass with a declaration of the ``run()``
-method which actually runs the pass. Inheriting from ``PassInfoMixin<PassT>``
-sets up some more boilerplate so that we don't have to write it ourselves.
+method which actually runs the pass. Inheriting from
+``OptionalPassInfoMixin<PassT>`` or ``MandatoryPassInfoMixin<PassT>`` sets up
+some more boilerplate so that we don't have to write it ourselves.
+``MandatoryPassInfoMixin`` should be used for passes that cannot be skipped
+(e.g. ``AlwaysInlinerPass``), while ``OptionalPassInfoMixin`` should be used
+for passes that can be skipped (e.g. optimization passes).
 
 Our class is in the ``llvm`` namespace so that we don't pollute the global
 namespace.
@@ -210,15 +215,13 @@ FAQs
 Required passes
 ---------------
 
-A pass that defines a static ``isRequired()`` method that returns true is a required pass. For example:
+A pass that inherits from ``MandatoryPassInfoMixin<PassT>`` is a required pass. For example:
 
 .. code-block:: c++
 
-  class HelloWorldPass : public PassInfoMixin<HelloWorldPass> {
+  class HelloWorldPass : public MandatoryPassInfoMixin<HelloWorldPass> {
   public:
     PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
-
-    static bool isRequired() { return true; }
   };
 
 A required pass is a pass that may not be skipped. An example of a required
diff --git a/llvm/examples/Bye/Bye.cpp b/llvm/examples/Bye/Bye.cpp
index b476ab72a65f2..fbe3b75920679 100644
--- a/llvm/examples/Bye/Bye.cpp
+++ b/llvm/examples/Bye/Bye.cpp
@@ -30,7 +30,7 @@ struct LegacyBye : public FunctionPass {
   bool runOnFunction(Function &F) override { return runBye(F); }
 };
 
-struct Bye : PassInfoMixin<Bye> {
+struct Bye : OptionalPassInfoMixin<Bye> {
   PreservedAnalyses run(Function &F, FunctionAnalysisManager &) {
     if (!runBye(F))
       return PreservedAnalyses::all();
diff --git a/llvm/examples/IRTransforms/SimplifyCFG.cpp b/llvm/examples/IRTransforms/SimplifyCFG.cpp
index bcdb1c64a9870..eb82ae9ad00d8 100644
--- a/llvm/examples/IRTransforms/SimplifyCFG.cpp
+++ b/llvm/examples/IRTransforms/SimplifyCFG.cpp
@@ -368,7 +368,7 @@ static bool doSimplify_v3(Function &F, DominatorTree &DT) {
 }
 
 namespace {
-struct SimplifyCFGPass : public PassInfoMixin<SimplifyCFGPass> {
+struct SimplifyCFGPass : public OptionalPassInfoMixin<SimplifyCFGPass> {
   PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM) {
     switch (Version) {
     case V1:
diff --git a/llvm/include/llvm/Analysis/AliasAnalysisEvaluator.h b/llvm/include/llvm/Analysis/AliasAnalysisEvaluator.h
index d8b02bd42e7d8..07e8d03c6c7b2 100644
--- a/llvm/include/llvm/Analysis/AliasAnalysisEvaluator.h
+++ b/llvm/include/llvm/Analysis/AliasAnalysisEvaluator.h
@@ -31,7 +31,7 @@ namespace llvm {
 class AAResults;
 class Function;
 
-class AAEvaluator : public PassInfoMixin<AAEvaluator> {
+class AAEvaluator : public OptionalPassInfoMixin<AAEvaluator> {
   int64_t FunctionCount = 0;
   int64_t NoAliasCount = 0, MayAliasCount = 0, PartialAliasCount = 0;
   int64_t MustAliasCount = 0;
diff --git a/llvm/include/llvm/Analysis/AliasSetTracker.h b/llvm/include/llvm/Analysis/AliasSetTracker.h
index 7d461b230478b..1e3b5006c2088 100644
--- a/llvm/include/llvm/Analysis/AliasSetTracker.h
+++ b/llvm/include/llvm/Analysis/AliasSetTracker.h
@@ -270,13 +270,13 @@ inline raw_ostream& operator<<(raw_ostream &OS, const AliasSetTracker &AST) {
   return OS;
 }
 
-class AliasSetsPrinterPass : public PassInfoMixin<AliasSetsPrinterPass> {
+class AliasSetsPrinterPass
+    : public MandatoryPassInfoMixin<AliasSetsPrinterPass> {
   raw_ostream &OS;
 
 public:
   LLVM_ABI explicit AliasSetsPrinterPass(raw_ostream &OS);
   LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
-  static bool isRequired() { return true; }
 };
 
 } // end namespace llvm
diff --git a/llvm/include/llvm/Analysis/AssumptionCache.h b/llvm/include/llvm/Analysis/AssumptionCache.h
index 5656729d20366..404ed715522eb 100644
--- a/llvm/include/llvm/Analysis/AssumptionCache.h
+++ b/llvm/include/llvm/Analysis/AssumptionCache.h
@@ -189,15 +189,14 @@ class AssumptionAnalysis : public AnalysisInfoMixin<AssumptionAnalysis> {
 };
 
 /// Printer pass for the \c AssumptionAnalysis results.
-class AssumptionPrinterPass : public PassInfoMixin<AssumptionPrinterPass> {
+class AssumptionPrinterPass
+    : public MandatoryPassInfoMixin<AssumptionPrinterPass> {
   raw_ostream &OS;
 
 public:
   explicit AssumptionPrinterPass(raw_ostream &OS) : OS(OS) {}
 
   LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
-
-  static bool isRequired() { return true; }
 };
 
 /// An immutable pass that tracks lazily created \c AssumptionCache
diff --git a/llvm/include/llvm/Analysis/BlockFrequencyInfo.h b/llvm/include/llvm/Analysis/BlockFrequencyInfo.h
index 860ceb4e6cce6..a8a54bd0f9c5c 100644
--- a/llvm/include/llvm/Analysis/BlockFrequencyInfo.h
+++ b/llvm/include/llvm/Analysis/BlockFrequencyInfo.h
@@ -132,15 +132,13 @@ class BlockFrequencyAnalysis
 
 /// Printer pass for the \c BlockFrequencyInfo results.
 class BlockFrequencyPrinterPass
-    : public PassInfoMixin<BlockFrequencyPrinterPass> {
+    : public MandatoryPassInfoMixin<BlockFrequencyPrinterPass> {
   raw_ostream &OS;
 
 public:
   explicit BlockFrequencyPrinterPass(raw_ostream &OS) : OS(OS) {}
 
   LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
-
-  static bool isRequired() { return true; }
 };
 
 /// Legacy analysis pass which computes \c BlockFrequencyInfo.
diff --git a/llvm/include/llvm/Analysis/BranchProbabilityInfo.h b/llvm/include/llvm/Analysis/BranchProbabilityInfo.h
index 7a8b8a3aa658a..81bcecbc4e46f 100644
--- a/llvm/include/llvm/Analysis/BranchProbabilityInfo.h
+++ b/llvm/include/llvm/Analysis/BranchProbabilityInfo.h
@@ -213,15 +213,13 @@ class BranchProbabilityAnalysis
 
 /// Printer pass for the \c BranchProbabilityAnalysis results.
 class BranchProbabilityPrinterPass
-    : public PassInfoMixin<BranchProbabilityPrinterPass> {
+    : public MandatoryPassInfoMixin<BranchProbabilityPrinterPass> {
   raw_ostream &OS;
 
 public:
   explicit BranchProbabilityPrinterPass(raw_ostream &OS) : OS(OS) {}
 
   LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
-
-  static bool isRequired() { return true; }
 };
 
 /// Legacy analysis pass which computes \c BranchProbabilityInfo.
diff --git a/llvm/include/llvm/Analysis/CFGPrinter.h b/llvm/include/llvm/Analysis/CFGPrinter.h
index c48d2e5887919..f31754e7764ab 100644
--- a/llvm/include/llvm/Analysis/CFGPrinter.h
+++ b/llvm/include/llvm/Analysis/CFGPrinter.h
@@ -38,28 +38,24 @@ namespace llvm {
 class ModuleSlotTracker;
 
 template <class GraphType> struct GraphTraits;
-class CFGViewerPass : public PassInfoMixin<CFGViewerPass> {
+class CFGViewerPass : public MandatoryPassInfoMixin<CFGViewerPass> {
 public:
   LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
-  static bool isRequired() { return true; }
 };
 
-class CFGOnlyViewerPass : public PassInfoMixin<CFGOnlyViewerPass> {
+class CFGOnlyViewerPass : public MandatoryPassInfoMixin<CFGOnlyViewerPass> {
 public:
   LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
-  static bool isRequired() { return true; }
 };
 
-class CFGPrinterPass : public PassInfoMixin<CFGPrinterPass> {
+class CFGPrinterPass : public MandatoryPassInfoMixin<CFGPrinterPass> {
 public:
   LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
-  static bool isRequired() { return true; }
 };
 
-class CFGOnlyPrinterPass : public PassInfoMixin<CFGOnlyPrinterPass> {
+class CFGOnlyPrinterPass : public MandatoryPassInfoMixin<CFGOnlyPrinterPass> {
 public:
   LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
-  static bool isRequired() { return true; }
 };
 
 class DOTFuncInfo {
diff --git a/llvm/include/llvm/Analysis/CFGSCCPrinter.h b/llvm/include/llvm/Analysis/CFGSCCPrinter.h
index 0ea0b46c46269..09232af70c372 100644
--- a/llvm/include/llvm/Analysis/CFGSCCPrinter.h
+++ b/llvm/include/llvm/Analysis/CFGSCCPrinter.h
@@ -13,13 +13,12 @@
 
 namespace llvm {
 
-class CFGSCCPrinterPass : public PassInfoMixin<CFGSCCPrinterPass> {
+class CFGSCCPrinterPass : public MandatoryPassInfoMixin<CFGSCCPrinterPass> {
   raw_ostream &OS;
 
 public:
   explicit CFGSCCPrinterPass(raw_ostream &OS) : OS(OS) {}
   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
-  static bool isRequired() { return true; }
 };
 } // namespace llvm
 
diff --git a/llvm/include/llvm/Analysis/CGSCCPassManager.h b/llvm/include/llvm/Analysis/CGSCCPassManager.h
index 87cfd9e6064e9..8965e992047f5 100644
--- a/llvm/include/llvm/Analysis/CGSCCPassManager.h
+++ b/llvm/include/llvm/Analysis/CGSCCPassManager.h
@@ -148,9 +148,9 @@ using CGSCCPassManager =
 template <typename AnalysisT>
 struct RequireAnalysisPass<AnalysisT, LazyCallGraph::SCC, CGSCCAnalysisManager,
                            LazyCallGraph &, CGSCCUpdateResult &>
-    : PassInfoMixin<RequireAnalysisPass<AnalysisT, LazyCallGraph::SCC,
-                                        CGSCCAnalysisManager, LazyCallGraph &,
-                                        CGSCCUpdateResult &>> {
+    : MandatoryPassInfoMixin<RequireAnalysisPass<
+          AnalysisT, LazyCallGraph::SCC, CGSCCAnalysisManager, LazyCallGraph &,
+          CGSCCUpdateResult &>> {
   PreservedAnalyses run(LazyCallGraph::SCC &C, CGSCCAnalysisManager &AM,
                         LazyCallGraph &CG, CGSCCUpdateResult &) {
     (void)AM.template getResult<AnalysisT>(C, CG);
@@ -313,7 +313,7 @@ struct CGSCCUpdateResult {
 /// pass over the module to enable a \c FunctionAnalysisManager to be used
 /// within this run safely.
 class ModuleToPostOrderCGSCCPassAdaptor
-    : public PassInfoMixin<ModuleToPostOrderCGSCCPassAdaptor> {
+    : public MandatoryPassInfoMixin<ModuleToPostOrderCGSCCPassAdaptor> {
 public:
   using PassConceptT =
       detail::PassConcept<LazyCallGraph::SCC, CGSCCAnalysisManager,
@@ -346,8 +346,6 @@ class ModuleToPostOrderCGSCCPassAdaptor
     OS << ')';
   }
 
-  static bool isRequired() { return true; }
-
 private:
   std::unique_ptr<PassConceptT> Pass;
 };
@@ -445,7 +443,7 @@ LLVM_ABI LazyCallGraph::SCC &updateCGAndAnalysisManagerForCGSCCPass(
 /// pass over the SCC to enable a \c FunctionAnalysisManager to be used
 /// within this run safely.
 class CGSCCToFunctionPassAdaptor
-    : public PassInfoMixin<CGSCCToFunctionPassAdaptor> {
+    : public MandatoryPassInfoMixin<CGSCCToFunctionPassAdaptor> {
 public:
   using PassConceptT = detail::PassConcept<Function, FunctionAnalysisManager>;
 
@@ -491,8 +489,6 @@ class CGSCCToFunctionPassAdaptor
     OS << ')';
   }
 
-  static bool isRequired() { return true; }
-
 private:
   std::unique_ptr<PassConceptT> Pass;
   bool EagerlyInvalidate;
@@ -544,7 +540,8 @@ class ShouldNotRunFunctionPassesAnalysis
 /// This repetition has the potential to be very large however, as each one
 /// might refine a single call site. As a consequence, in practice we use an
 /// upper bound on the number of repetitions to limit things.
-class DevirtSCCRepeatedPass : public PassInfoMixin<DevirtSCCRepeatedPass> {
+class DevirtSCCRepeatedPass
+    : public OptionalPassInfoMixin<DevirtSCCRepeatedPass> {
 public:
   using PassConceptT =
       detail::PassConcept<LazyCallGraph::SCC, CGSCCAnalysisManager,
diff --git a/llvm/include/llvm/Analysis/CallGraph.h b/llvm/include/llvm/Analysis/CallGraph.h
index 1dd37d47eea71..627765368b3b2 100644
--- a/llvm/include/llvm/Analysis/CallGraph.h
+++ b/llvm/include/llvm/Analysis/CallGraph.h
@@ -299,28 +299,25 @@ class CallGraphAnalysis : public AnalysisInfoMixin<CallGraphAnalysis> {
 };
 
 /// Printer pass for the \c CallGraphAnalysis results.
-class CallGraphPrinterPass : public PassInfoMixin<CallGraphPrinterPass> {
+class CallGraphPrinterPass
+    : public MandatoryPassInfoMixin<CallGraphPrinterPass> {
   raw_ostream &OS;
 
 public:
   explicit CallGraphPrinterPass(raw_ostream &OS) : OS(OS) {}
 
   LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
-
-  static bool isRequired() { return true; }
 };
 
 /// Printer pass for the summarized \c CallGraphAnalysis results.
 class CallGraphSCCsPrinterPass
-    : public PassInfoMixin<CallGraphSCCsPrinterPass> {
+    : public MandatoryPassInfoMixin<CallGraphSCCsPrinterPass> {
   raw_ostream &OS;
 
 public:
   explicit CallGraphSCCsPrinterPass(raw_ostream &OS) : OS(OS) {}
 
   LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
-
-  static bool isRequired() { return true; }
 };
 
 /// The \c ModulePass which wraps up a \c CallGraph and the logic to
diff --git a/llvm/include/llvm/Analysis/CallPrinter.h b/llvm/include/llvm/Analysis/CallPrinter.h
index 8f28d8af4671f..d374995e886e0 100644
--- a/llvm/include/llvm/Analysis/CallPrinter.h
+++ b/llvm/include/llvm/Analysis/CallPrinter.h
@@ -22,17 +22,16 @@ namespace llvm {
 class ModulePass;
 
 /// Pass for printing the call graph to a dot file
-class CallGraphDOTPrinterPass : public PassInfoMixin<CallGraphDOTPrinterPass> {
+class CallGraphDOTPrinterPass
+    : public MandatoryPassInfoMixin<CallGraphDOTPrinterPass> {
 public:
   LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
-  static bool isRequired() { return true; }
 };
 
 /// Pass for viewing the call graph
-class CallGraphViewerPass : public PassInfoMixin<CallGraphViewerPass> {
+class CallGraphViewerPass : public MandatoryPassInfoMixin<CallGraphViewerPass> {
 public:
   LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
-  static bool isRequired() { return true; }
 };
 
 LLVM_ABI ModulePass *createCallGraphViewerPass();
diff --git a/llvm/include/llvm/Analysis/CostModel.h b/llvm/include/llvm/Analysis/CostModel.h
index 9b127c27ba7ef..9a095bedb8d60 100644
--- a/llvm/include/llvm/Analysis/CostModel.h
+++ b/llvm/include/llvm/Analysis/CostModel.h
@@ -13,15 +13,14 @@
 
 namespace llvm {
 /// Printer pass for cost modeling results.
-class CostModelPrinterPass : public PassInfoMixin<CostModelPrinterPass> {
+class CostModelPrinterPass
+    : public MandatoryPassInfoMixin<CostModelPrinterPass> {
   raw_ostream &OS;
 
 public:
   explicit CostModelPrinterPass(raw_ostream &OS) : OS(OS) {}
 
   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
-
-  static bool isRequired() { return true; }
 };
 } // end namespace llvm
 
diff --git a/llvm/include/llvm/Analysis/CtxProfAnalysis.h b/llvm/include/llvm/Analysis/CtxProfAnalysis.h
index 5c9823b0f6cc1..d116cab6448cd 100644
--- a/llvm/include/llvm/Analysis/CtxProfAnalysis.h
+++ b/llvm/include/llvm/Analysis/CtxProfAnalysis.h
@@ -147,13 +147,12 @@ class CtxProfAnalysis : public AnalysisInfoMixin<CtxProfAnalysis> {
 };
 
 class CtxProfAnalysisPrinterPass
-    : public PassInfoMixin<CtxProfAnalysisPrinterPass> {
+    : public MandatoryPassInfoMixin<CtxProfAnalysisPrinterPass> {
 public:
   enum class PrintMode { Everything, YAML };
   LLVM_ABI explicit CtxProfAnalysisPrinterPass(raw_ostream &OS);
 
   LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
-  static bool isRequired() { return true; }
 
 private:
   raw_ostream &OS;
@@ -197,7 +196,7 @@ class ProfileAnnotator {
 // the pass pipeline, associate it with any Global Value, and then use it for
 // PGO and ThinLTO.
 // At that point, this should be moved elsewhere.
-class AssignGUIDPass : public PassInfoMixin<AssignGUIDPass> {
+class AssignGUIDPass : public OptionalPassInfoMixin<AssignGUIDPass> {
 public:
   explicit AssignGUIDPass() = default;
 
diff --git a/llvm/include/llvm/Analysis/CycleAnalysis.h b/llvm/include/llvm/Analysis/CycleAnalysis.h
index 1f2dd6d98dee0..2efc409c6360d 100644
--- a/llvm/include/llvm/Analysis/CycleAnalysis.h
+++ b/llvm/include/llvm/Analysis/CycleAnalysis.h
@@ -62,18 +62,18 @@ class CycleAnalysis : public AnalysisInfoMixin<CycleAnalysis> {
   // TODO: verify analysis?
 };
 
-class CycleInfoPrinterPass : public PassInfoMixin<CycleInfoPrinterPass> {
+class CycleInfoPrinterPass
+    : public MandatoryPassInfoMixin<CycleInfoPrinterPass> {
   raw_ostream &OS;
 
 public:
   explicit CycleInfoPrinterPass(raw_ostream &OS);
   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
-  static bool isRequired() { return true; }
 };
 
-struct CycleInfoVerifierPass : public PassInfoMixin<CycleInfoVerifierPass> {
+struct CycleInfoVerifierPass
+    : public MandatoryPassInfoMixin<CycleInfoVerifierPass> {
   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
-  static bool isRequired() { return true; }
 };
 
 } // end namespace llvm
diff --git a/llvm/include/llvm/Analysis/DDG.h b/llvm/include/llvm/Analysis/DDG.h
index 120bb46330a79..656e48e6dd9c7 100644
--- a/llvm/include/llvm/Analysis/DDG.h
+++ b/llvm/include/llvm/Analysis/DDG.h
@@ -421,13 +421,13 @@ class DDGAnalysis : public AnalysisInfoMixin<DDGAnalysis> {
 };
 
 /// Textual printer pass for the DDG of a loop.
-class DDGAnalysisPrinterPass : public PassInfoMixin<DDGAnalysisPrinterPass> {
+class DDGAnalysisPrinterPass
+    : public MandatoryPassInfoMixin<DDGAnalysisPrinterPass> {
 public:
   explicit DDGAnalysisPrinterPass(raw_ostream &OS) : OS(OS) {}
   LLVM_ABI PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,
                                  LoopStandardAnalysisResults &AR,
                                  LPMUpdater &U);
-  static bool isRequired() { return true; }
 
 private:
   raw_ostream &OS;
diff --git a/llvm/include/llvm/Analysis/DDGPrinter.h b/llvm/include/llvm/Analysis/DDGPrinter.h
index 2ed73ee2b59e7..23b2a6aaaa5c7 100644
--- a/llvm/include/llvm/Analysis/DDGPrinter.h
+++ b/llvm/include/llvm/Analysis/DDGPrinter.h
@@ -25,11 +25,10 @@ class Loop;
 //===--------------------------------------------------------------------===//
 // Implementation of DDG DOT Printer for a loop.
 //===--------------------------------------------------------------------===//
-class DDGDotPrinterPass : public PassInfoMixin<DDGDotPrinterPass> {
+class DDGDotPrinterPass : public MandatoryPassInfoMixin<DDGDotPrinterPass> {
 public:
   PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,
                         LoopStandardAnalysisResults &AR, LPMUpdater &U);
-  static bool isRequired() { return true; }
 };
 
 //===--------------------------------------------------------------------===//
diff --git a/llvm/include/llvm/Analysis/DOTGraphTraitsPass.h b/llvm/include/llvm/Analysis/DOTGraphTraitsPass.h
index 19a202f78c6ce..198c93ee07a45 100644
--- a/llvm/include/llvm/Analysis/DOTGraphTraitsPass.h
+++ b/llvm/include/llvm/Analysis/DOTGraphTraitsPass.h
@@ -44,8 +44,8 @@ template <typename AnalysisT, bool IsSimple,
           typename AnalysisGraphTraitsT =
               DefaultAnalysisGraphTraits<typename AnalysisT::Result &, GraphT>>
 struct DOTGraphTraitsViewer
-    : PassInfoMixin<DOTGraphTraitsViewer<AnalysisT, IsSimple, GraphT,
-                                         AnalysisGraphTraitsT>> {
+    : OptionalPassInfoMixin<DOTGraphTraitsViewer<AnalysisT, IsSimple, GraphT,
+                                                 AnalysisGraphTraitsT>>...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/192120


More information about the llvm-commits mailing list