diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -1025,6 +1025,25 @@ "SeparateConstOffsetFromGEP"); } +Expected +parseFunctionSimplificationPipelineOptions(StringRef Params) { + std::optional L = + StringSwitch>(Params) + .Case("O1", OptimizationLevel::O1) + .Case("O2", OptimizationLevel::O2) + .Case("O3", OptimizationLevel::O3) + .Case("Os", OptimizationLevel::Os) + .Case("Oz", OptimizationLevel::Oz) + .Default(std::nullopt); + if (!L) { + return make_error( + formatv("invalid function-simplification parameter '{0}' ", Params) + .str(), + inconvertibleErrorCode()); + }; + return *L; +} + } // namespace /// Tests whether a pass name starts with a valid prefix for a default pipeline diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -543,6 +543,13 @@ }, parseSeparateConstOffsetFromGEPPassOptions, "lower-gep") +FUNCTION_PASS_WITH_PARAMS("function-simplification", + "", + [this](OptimizationLevel OL) { + return buildFunctionSimplificationPipeline(OL, ThinOrFullLTOPhase::None); + }, + parseFunctionSimplificationPipelineOptions, + "O1;O2;O3;Os;Oz") #undef FUNCTION_PASS_WITH_PARAMS #ifndef LOOPNEST_PASS diff --git a/llvm/test/Other/function-simplification.ll b/llvm/test/Other/function-simplification.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Other/function-simplification.ll @@ -0,0 +1,18 @@ +; RUN: opt -passes='function-simplification' -debug-pass-manager -disable-output < %s 2>&1 | FileCheck %s --check-prefix=O1 +; RUN: opt -passes='function-simplification' -debug-pass-manager -disable-output < %s 2>&1 | FileCheck %s --check-prefix=O23SZ +; RUN: opt -passes='function-simplification' -debug-pass-manager -disable-output < %s 2>&1 | FileCheck %s --check-prefix=O23SZ +; RUN: opt -passes='function-simplification' -debug-pass-manager -disable-output < %s 2>&1 | FileCheck %s --check-prefix=O23SZ +; RUN: opt -passes='function-simplification' -debug-pass-manager -disable-output < %s 2>&1 | FileCheck %s --check-prefix=O23SZ +; RUN: not opt -passes='function-simplification' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=O0 + +; O1: Running pass: EarlyCSEPass +; O1-NOT: Running pass: GVNPass + +; O23SZ: Running pass: EarlyCSEPass +; O23SZ: Running pass: GVNPass + +; O0: invalid function-simplification parameter 'O0' + +define void @f() { + ret void +} \ No newline at end of file