From e6ea8779c2e0c60007d1015cc98fe3d2642a1652 Mon Sep 17 00:00:00 2001 From: Arthur Eubanks Date: Thu, 6 Aug 2020 11:10:14 -0700 Subject: [PATCH] [NewPM][optnone] Mark various passes as required This was done by turning on -enable-npm-optnone and fixing failures. That will be enabled in a follow-up change for ease of reverting. Reviewed By: asbirlea Differential Revision: https://reviews.llvm.org/D85457 --- clang/test/CodeGen/O0-no-skipped-passes.c | 14 ++++++++++++++ llvm/include/llvm/IR/IRPrintingPasses.h | 2 ++ llvm/include/llvm/IR/PassManager.h | 1 + llvm/include/llvm/IR/Verifier.h | 2 ++ .../llvm/Transforms/Coroutines/CoroCleanup.h | 1 + .../include/llvm/Transforms/Coroutines/CoroEarly.h | 1 + .../include/llvm/Transforms/Coroutines/CoroElide.h | 1 + .../include/llvm/Transforms/Coroutines/CoroSplit.h | 1 + llvm/include/llvm/Transforms/IPO/AlwaysInliner.h | 1 + .../Transforms/Instrumentation/AddressSanitizer.h | 2 ++ .../Transforms/Instrumentation/BoundsChecking.h | 1 + .../Instrumentation/HWAddressSanitizer.h | 1 + .../Transforms/Instrumentation/MemorySanitizer.h | 1 + .../Transforms/Instrumentation/SanitizerCoverage.h | 1 + .../Transforms/Instrumentation/ThreadSanitizer.h | 1 + llvm/include/llvm/Transforms/Scalar/LowerAtomic.h | 1 + .../llvm/Transforms/Scalar/LowerMatrixIntrinsics.h | 1 + llvm/test/Feature/optnone-opt.ll | 2 +- 18 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 clang/test/CodeGen/O0-no-skipped-passes.c diff --git a/clang/test/CodeGen/O0-no-skipped-passes.c b/clang/test/CodeGen/O0-no-skipped-passes.c new file mode 100644 index 000000000000..01b579c87c80 --- /dev/null +++ b/clang/test/CodeGen/O0-no-skipped-passes.c @@ -0,0 +1,14 @@ +// Test that no passes are skipped under -O0/NPM +// +// RUN: %clang_cc1 -triple x86_64-linux-gnu -mllvm -enable-npm-optnone -O0 -fexperimental-new-pass-manager %s -fdebug-pass-manager -emit-llvm -o /dev/null 2>&1 | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-linux-gnu -mllvm -enable-npm-optnone -O0 -fexperimental-new-pass-manager %s -fdebug-pass-manager -emit-llvm -o /dev/null -fcoroutines-ts 2>&1 | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-linux-gnu -mllvm -enable-npm-optnone -O0 -fexperimental-new-pass-manager %s -fdebug-pass-manager -emit-llvm -o /dev/null -fsanitize=address 2>&1 | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-linux-gnu -mllvm -enable-npm-optnone -O0 -fexperimental-new-pass-manager %s -fdebug-pass-manager -emit-llvm -o /dev/null -fsanitize=hwaddress 2>&1 | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-linux-gnu -mllvm -enable-npm-optnone -O0 -fexperimental-new-pass-manager %s -fdebug-pass-manager -emit-llvm -o /dev/null -fsanitize=memory 2>&1 | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-linux-gnu -mllvm -enable-npm-optnone -O0 -fexperimental-new-pass-manager %s -fdebug-pass-manager -emit-llvm -o /dev/null -fsanitize=thread 2>&1 | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-linux-gnu -mllvm -enable-npm-optnone -O0 -fexperimental-new-pass-manager %s -fdebug-pass-manager -emit-llvm -o /dev/null -fsanitize=local-bounds 2>&1 | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-linux-gnu -mllvm -enable-npm-optnone -O0 -fexperimental-new-pass-manager %s -fdebug-pass-manager -emit-llvm -o /dev/null -fsanitize-coverage-trace-pc-guard 2>&1 | FileCheck %s + +// CHECK-NOT: Skipping pass + +int func(int a) { return a; } diff --git a/llvm/include/llvm/IR/IRPrintingPasses.h b/llvm/include/llvm/IR/IRPrintingPasses.h index ed7082a31a42..1cfd27af59be 100644 --- a/llvm/include/llvm/IR/IRPrintingPasses.h +++ b/llvm/include/llvm/IR/IRPrintingPasses.h @@ -76,6 +76,7 @@ public: bool ShouldPreserveUseListOrder = false); PreservedAnalyses run(Module &M, AnalysisManager &); + static bool isRequired() { return true; } }; /// Pass for printing a Function as LLVM's text IR assembly. @@ -91,6 +92,7 @@ public: PrintFunctionPass(raw_ostream &OS, const std::string &Banner = ""); PreservedAnalyses run(Function &F, AnalysisManager &); + static bool isRequired() { return true; } }; } // End llvm namespace diff --git a/llvm/include/llvm/IR/PassManager.h b/llvm/include/llvm/IR/PassManager.h index b2592669f947..ff6a47b5061e 100644 --- a/llvm/include/llvm/IR/PassManager.h +++ b/llvm/include/llvm/IR/PassManager.h @@ -1308,6 +1308,7 @@ struct RequireAnalysisPass return PreservedAnalyses::all(); } + static bool isRequired() { return true; } }; /// A no-op pass template which simply forces a specific analysis result diff --git a/llvm/include/llvm/IR/Verifier.h b/llvm/include/llvm/IR/Verifier.h index 62c33c8325eb..f4381d2ae4a9 100644 --- a/llvm/include/llvm/IR/Verifier.h +++ b/llvm/include/llvm/IR/Verifier.h @@ -116,6 +116,7 @@ public: Result run(Module &M, ModuleAnalysisManager &); Result run(Function &F, FunctionAnalysisManager &); + static bool isRequired() { return true; } }; /// Check a module for errors, but report debug info errors separately. @@ -141,6 +142,7 @@ public: PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); + static bool isRequired() { return true; } }; } // end namespace llvm diff --git a/llvm/include/llvm/Transforms/Coroutines/CoroCleanup.h b/llvm/include/llvm/Transforms/Coroutines/CoroCleanup.h index c3caa55c25ce..7ecdc050335d 100644 --- a/llvm/include/llvm/Transforms/Coroutines/CoroCleanup.h +++ b/llvm/include/llvm/Transforms/Coroutines/CoroCleanup.h @@ -22,6 +22,7 @@ class Function; struct CoroCleanupPass : PassInfoMixin { PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); + static bool isRequired() { return true; } }; } // end namespace llvm diff --git a/llvm/include/llvm/Transforms/Coroutines/CoroEarly.h b/llvm/include/llvm/Transforms/Coroutines/CoroEarly.h index 0f5d1e40eb17..3f5ec2abd172 100644 --- a/llvm/include/llvm/Transforms/Coroutines/CoroEarly.h +++ b/llvm/include/llvm/Transforms/Coroutines/CoroEarly.h @@ -25,6 +25,7 @@ class Function; struct CoroEarlyPass : PassInfoMixin { PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); + static bool isRequired() { return true; } }; } // end namespace llvm diff --git a/llvm/include/llvm/Transforms/Coroutines/CoroElide.h b/llvm/include/llvm/Transforms/Coroutines/CoroElide.h index 348e8e355ea0..ff73cf20c5bf 100644 --- a/llvm/include/llvm/Transforms/Coroutines/CoroElide.h +++ b/llvm/include/llvm/Transforms/Coroutines/CoroElide.h @@ -24,6 +24,7 @@ class Function; struct CoroElidePass : PassInfoMixin { PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); + static bool isRequired() { return true; } }; } // end namespace llvm diff --git a/llvm/include/llvm/Transforms/Coroutines/CoroSplit.h b/llvm/include/llvm/Transforms/Coroutines/CoroSplit.h index 40424e5a7e6a..e93ad653108c 100644 --- a/llvm/include/llvm/Transforms/Coroutines/CoroSplit.h +++ b/llvm/include/llvm/Transforms/Coroutines/CoroSplit.h @@ -24,6 +24,7 @@ namespace llvm { struct CoroSplitPass : PassInfoMixin { PreservedAnalyses run(LazyCallGraph::SCC &C, CGSCCAnalysisManager &AM, LazyCallGraph &CG, CGSCCUpdateResult &UR); + static bool isRequired() { return true; } }; } // end namespace llvm diff --git a/llvm/include/llvm/Transforms/IPO/AlwaysInliner.h b/llvm/include/llvm/Transforms/IPO/AlwaysInliner.h index 64e25230f6da..6a208dfa6a25 100644 --- a/llvm/include/llvm/Transforms/IPO/AlwaysInliner.h +++ b/llvm/include/llvm/Transforms/IPO/AlwaysInliner.h @@ -34,6 +34,7 @@ public: : InsertLifetime(InsertLifetime) {} PreservedAnalyses run(Module &M, ModuleAnalysisManager &); + static bool isRequired() { return true; } }; /// Create a legacy pass manager instance of a pass to inline and remove diff --git a/llvm/include/llvm/Transforms/Instrumentation/AddressSanitizer.h b/llvm/include/llvm/Transforms/Instrumentation/AddressSanitizer.h index fea6064042ae..53ad0cbf9968 100644 --- a/llvm/include/llvm/Transforms/Instrumentation/AddressSanitizer.h +++ b/llvm/include/llvm/Transforms/Instrumentation/AddressSanitizer.h @@ -102,6 +102,7 @@ public: bool Recover = false, bool UseAfterScope = false); PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); + static bool isRequired() { return true; } private: bool CompileKernel; @@ -122,6 +123,7 @@ public: bool UseGlobalGC = true, bool UseOdrIndicator = false); PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); + static bool isRequired() { return true; } private: bool CompileKernel; diff --git a/llvm/include/llvm/Transforms/Instrumentation/BoundsChecking.h b/llvm/include/llvm/Transforms/Instrumentation/BoundsChecking.h index 120c6a8fb09f..8d70f1429b99 100644 --- a/llvm/include/llvm/Transforms/Instrumentation/BoundsChecking.h +++ b/llvm/include/llvm/Transforms/Instrumentation/BoundsChecking.h @@ -17,6 +17,7 @@ namespace llvm { /// stores, and other memory intrinsics. struct BoundsCheckingPass : PassInfoMixin { PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); + static bool isRequired() { return true; } }; diff --git a/llvm/include/llvm/Transforms/Instrumentation/HWAddressSanitizer.h b/llvm/include/llvm/Transforms/Instrumentation/HWAddressSanitizer.h index e3104eeb1d36..f0949cf9bfee 100644 --- a/llvm/include/llvm/Transforms/Instrumentation/HWAddressSanitizer.h +++ b/llvm/include/llvm/Transforms/Instrumentation/HWAddressSanitizer.h @@ -27,6 +27,7 @@ public: explicit HWAddressSanitizerPass(bool CompileKernel = false, bool Recover = false); PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM); + static bool isRequired() { return true; } private: bool CompileKernel; diff --git a/llvm/include/llvm/Transforms/Instrumentation/MemorySanitizer.h b/llvm/include/llvm/Transforms/Instrumentation/MemorySanitizer.h index 01a86ee3f1fd..f5f9ec7829bd 100644 --- a/llvm/include/llvm/Transforms/Instrumentation/MemorySanitizer.h +++ b/llvm/include/llvm/Transforms/Instrumentation/MemorySanitizer.h @@ -41,6 +41,7 @@ struct MemorySanitizerPass : public PassInfoMixin { PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM); PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); + static bool isRequired() { return true; } private: MemorySanitizerOptions Options; diff --git a/llvm/include/llvm/Transforms/Instrumentation/SanitizerCoverage.h b/llvm/include/llvm/Transforms/Instrumentation/SanitizerCoverage.h index 999086a29f87..e3d268cb0781 100644 --- a/llvm/include/llvm/Transforms/Instrumentation/SanitizerCoverage.h +++ b/llvm/include/llvm/Transforms/Instrumentation/SanitizerCoverage.h @@ -46,6 +46,7 @@ public: *vfs::getRealFileSystem()); } PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); + static bool isRequired() { return true; } private: SanitizerCoverageOptions Options; diff --git a/llvm/include/llvm/Transforms/Instrumentation/ThreadSanitizer.h b/llvm/include/llvm/Transforms/Instrumentation/ThreadSanitizer.h index ce0e46745abb..f9c507624e6d 100644 --- a/llvm/include/llvm/Transforms/Instrumentation/ThreadSanitizer.h +++ b/llvm/include/llvm/Transforms/Instrumentation/ThreadSanitizer.h @@ -28,6 +28,7 @@ FunctionPass *createThreadSanitizerLegacyPassPass(); struct ThreadSanitizerPass : public PassInfoMixin { PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM); PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); + static bool isRequired() { return true; } }; } // namespace llvm diff --git a/llvm/include/llvm/Transforms/Scalar/LowerAtomic.h b/llvm/include/llvm/Transforms/Scalar/LowerAtomic.h index 40f8ca571f19..1d5550829f93 100644 --- a/llvm/include/llvm/Transforms/Scalar/LowerAtomic.h +++ b/llvm/include/llvm/Transforms/Scalar/LowerAtomic.h @@ -22,6 +22,7 @@ namespace llvm { class LowerAtomicPass : public PassInfoMixin { public: PreservedAnalyses run(Function &F, FunctionAnalysisManager &); + static bool isRequired() { return true; } }; } diff --git a/llvm/include/llvm/Transforms/Scalar/LowerMatrixIntrinsics.h b/llvm/include/llvm/Transforms/Scalar/LowerMatrixIntrinsics.h index 2f75cd5017aa..4ac0fdc34189 100644 --- a/llvm/include/llvm/Transforms/Scalar/LowerMatrixIntrinsics.h +++ b/llvm/include/llvm/Transforms/Scalar/LowerMatrixIntrinsics.h @@ -18,6 +18,7 @@ namespace llvm { struct LowerMatrixIntrinsicsPass : PassInfoMixin { PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); + static bool isRequired() { return true; } }; } // namespace llvm diff --git a/llvm/test/Feature/optnone-opt.ll b/llvm/test/Feature/optnone-opt.ll index 1c8790f8bcb7..7025bfed32dc 100644 --- a/llvm/test/Feature/optnone-opt.ll +++ b/llvm/test/Feature/optnone-opt.ll @@ -66,8 +66,8 @@ attributes #0 = { optnone noinline } ; Additional IR passes that opt doesn't turn on by default. ; MORE-DAG: Skipping pass 'Dead Code Elimination' ; MORE-DAG: Skipping pass 'Dead Instruction Elimination' +; NPM-MORE-DAG: Skipping pass: DCEPass ; NPM-MORE-DAG: Skipping pass: GVNHoistPass -; NPM-MORE-DAG: Skipping pass: LowerAtomicPass ; Loop IR passes that opt doesn't turn on by default. ; LOOP-DAG: Skipping pass 'Delete dead loops'