diff --git a/llvm/include/llvm/IR/PassManager.h b/llvm/include/llvm/IR/PassManager.h index d269221fac070..dd4bbb7da165c 100644 --- a/llvm/include/llvm/IR/PassManager.h +++ b/llvm/include/llvm/IR/PassManager.h @@ -112,6 +112,17 @@ struct AnalysisInfoMixin : PassInfoMixin { } }; +/// A mix-in indicates that the pass cannot be skipped +/// in pass instrumentation. +struct RequiredPassMixin {}; + +/// A convenient mix-in to indicate the pass cannot be skipped +/// in pass instrumentation. +/// +/// It automatically mixes in \c PassInfoMixin and \c RequiredPassMixin. +template +struct RequiredPassInfoMixin : PassInfoMixin, RequiredPassMixin {}; + namespace detail { /// Actual unpacker of extra arguments in getAnalysisResult, diff --git a/llvm/include/llvm/IR/PassManagerInternal.h b/llvm/include/llvm/IR/PassManagerInternal.h index 4ada6ee5dd683..3fdc584c091af 100644 --- a/llvm/include/llvm/IR/PassManagerInternal.h +++ b/llvm/include/llvm/IR/PassManagerInternal.h @@ -29,6 +29,7 @@ namespace llvm { template class AllAnalysesOn; template class AnalysisManager; class PreservedAnalyses; +struct RequiredPassMixin; // Implementation details of the pass manager interfaces. namespace detail { @@ -112,7 +113,10 @@ struct PassModel : PassConcept { return false; } - bool isRequired() const override { return passIsRequiredImpl(); } + bool isRequired() const override { + return passIsRequiredImpl() || + std::is_base_of_v; + } PassT Pass; };