Index: llvm/trunk/lib/Passes/PassBuilder.cpp =================================================================== --- llvm/trunk/lib/Passes/PassBuilder.cpp +++ llvm/trunk/lib/Passes/PassBuilder.cpp @@ -1422,6 +1422,40 @@ return Result; } +/// Parser of parameters for SimplifyCFG pass. +Expected parseSimplifyCFGOptions(StringRef Params) { + SimplifyCFGOptions Result; + while (!Params.empty()) { + StringRef ParamName; + std::tie(ParamName, Params) = Params.split(';'); + + bool Enable = !ParamName.consume_front("no-"); + if (ParamName == "forward-switch-cond") { + Result.forwardSwitchCondToPhi(Enable); + } else if (ParamName == "switch-to-lookup") { + Result.convertSwitchToLookupTable(Enable); + } else if (ParamName == "keep-loops") { + Result.needCanonicalLoops(Enable); + } else if (ParamName == "sink-common-insts") { + Result.sinkCommonInsts(Enable); + } else if (Enable && ParamName.consume_front("bonus-inst-threshold=")) { + APInt BonusInstThreshold; + if (ParamName.getAsInteger(0, BonusInstThreshold)) + return make_error( + formatv("invalid argument to SimplifyCFG pass bonus-threshold " + "parameter: '{0}' ", + ParamName).str(), + inconvertibleErrorCode()); + Result.bonusInstThreshold(BonusInstThreshold.getSExtValue()); + } else { + return make_error( + formatv("invalid SimplifyCFG pass parameter '{0}' ", ParamName).str(), + inconvertibleErrorCode()); + } + } + return Result; +} + } // namespace /// Tests whether a pass name starts with a valid prefix for a default pipeline Index: llvm/trunk/lib/Passes/PassRegistry.def =================================================================== --- llvm/trunk/lib/Passes/PassRegistry.def +++ llvm/trunk/lib/Passes/PassRegistry.def @@ -218,7 +218,6 @@ FUNCTION_PASS("reassociate", ReassociatePass()) FUNCTION_PASS("scalarizer", ScalarizerPass()) FUNCTION_PASS("sccp", SCCPPass()) -FUNCTION_PASS("simplify-cfg", SimplifyCFGPass()) FUNCTION_PASS("sink", SinkingPass()) FUNCTION_PASS("slp-vectorizer", SLPVectorizerPass()) FUNCTION_PASS("speculative-execution", SpeculativeExecutionPass()) @@ -253,6 +252,11 @@ return MemorySanitizerPass(Opts); }, parseMSanPassOptions) +FUNCTION_PASS_WITH_PARAMS("simplify-cfg", + [](SimplifyCFGOptions Opts) { + return SimplifyCFGPass(Opts); + }, + parseSimplifyCFGOptions) #undef FUNCTION_PASS_WITH_PARAMS #ifndef LOOP_ANALYSIS Index: llvm/trunk/test/Transforms/SimplifyCFG/ARM/switch-to-lookup-table.ll =================================================================== --- llvm/trunk/test/Transforms/SimplifyCFG/ARM/switch-to-lookup-table.ll +++ llvm/trunk/test/Transforms/SimplifyCFG/ARM/switch-to-lookup-table.ll @@ -4,6 +4,12 @@ ; RUN: opt -S -simplifycfg -switch-to-lookup -mtriple=arm -relocation-model=rwpi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE ; RUN: opt -S -simplifycfg -switch-to-lookup -mtriple=arm -relocation-model=ropi-rwpi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE +; RUN: opt -S -passes='simplify-cfg' -mtriple=arm -relocation-model=static < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ENABLE +; RUN: opt -S -passes='simplify-cfg' -mtriple=arm -relocation-model=pic < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ENABLE +; RUN: opt -S -passes='simplify-cfg' -mtriple=arm -relocation-model=ropi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE +; RUN: opt -S -passes='simplify-cfg' -mtriple=arm -relocation-model=rwpi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE +; RUN: opt -S -passes='simplify-cfg' -mtriple=arm -relocation-model=ropi-rwpi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=DISABLE + ; CHECK: @{{.*}} = private unnamed_addr constant [3 x i32] [i32 1234, i32 5678, i32 15532] ; ENABLE: @{{.*}} = private unnamed_addr constant [3 x i32*] [i32* @c1, i32* @c2, i32* @c3] ; DISABLE-NOT: @{{.*}} = private unnamed_addr constant [3 x i32*] [i32* @c1, i32* @c2, i32* @c3] Index: llvm/trunk/test/Transforms/SimplifyCFG/CoveredLookupTable.ll =================================================================== --- llvm/trunk/test/Transforms/SimplifyCFG/CoveredLookupTable.ll +++ llvm/trunk/test/Transforms/SimplifyCFG/CoveredLookupTable.ll @@ -1,4 +1,5 @@ ; RUN: opt -simplifycfg -switch-to-lookup -S %s | FileCheck %s +; RUN: opt -passes='simplify-cfg' -S %s | FileCheck %s ; rdar://15268442 target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" Index: llvm/trunk/test/Transforms/SimplifyCFG/ForwardSwitchConditionToPHI.ll =================================================================== --- llvm/trunk/test/Transforms/SimplifyCFG/ForwardSwitchConditionToPHI.ll +++ llvm/trunk/test/Transforms/SimplifyCFG/ForwardSwitchConditionToPHI.ll @@ -2,6 +2,9 @@ ; RUN: opt < %s -simplifycfg -forward-switch-cond=false -S | FileCheck %s --check-prefix=NO_FWD ; RUN: opt < %s -simplifycfg -forward-switch-cond=true -S | FileCheck %s --check-prefix=FWD +; RUN: opt < %s -passes='simplify-cfg' -S | FileCheck %s --check-prefix=NO_FWD +; RUN: opt < %s -passes='simplify-cfg' -S | FileCheck %s --check-prefix=FWD + ; PR10131 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32" Index: llvm/trunk/test/Transforms/SimplifyCFG/X86/disable-lookup-table.ll =================================================================== --- llvm/trunk/test/Transforms/SimplifyCFG/X86/disable-lookup-table.ll +++ llvm/trunk/test/Transforms/SimplifyCFG/X86/disable-lookup-table.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -simplifycfg -switch-to-lookup -S -mtriple=x86_64-unknown-linux-gnu | FileCheck %s +; RUN: opt < %s -passes='simplify-cfg' -S -mtriple=x86_64-unknown-linux-gnu | FileCheck %s ; In the presence of "-no-jump-tables"="true", simplifycfg should not convert switches to lookup tables. Index: llvm/trunk/test/Transforms/SimplifyCFG/X86/switch-covered-bug.ll =================================================================== --- llvm/trunk/test/Transforms/SimplifyCFG/X86/switch-covered-bug.ll +++ llvm/trunk/test/Transforms/SimplifyCFG/X86/switch-covered-bug.ll @@ -1,4 +1,6 @@ ; RUN: opt -S -simplifycfg -switch-to-lookup < %s -mtriple=x86_64-apple-darwin12.0.0 | FileCheck %s +; RUN: opt -S -passes='simplify-cfg' < %s -mtriple=x86_64-apple-darwin12.0.0 | FileCheck %s + ; rdar://17887153 target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin12.0.0" Index: llvm/trunk/test/Transforms/SimplifyCFG/X86/switch-table-bug.ll =================================================================== --- llvm/trunk/test/Transforms/SimplifyCFG/X86/switch-table-bug.ll +++ llvm/trunk/test/Transforms/SimplifyCFG/X86/switch-table-bug.ll @@ -1,4 +1,6 @@ ; RUN: opt -S -simplifycfg -switch-to-lookup < %s -mtriple=x86_64-apple-darwin12.0.0 | FileCheck %s +; RUN: opt -S -passes='simplify-cfg' < %s -mtriple=x86_64-apple-darwin12.0.0 | FileCheck %s + ; rdar://17735071 target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-apple-darwin12.0.0" Index: llvm/trunk/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll =================================================================== --- llvm/trunk/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll +++ llvm/trunk/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll @@ -1,5 +1,5 @@ ; RUN: opt < %s -simplifycfg -switch-to-lookup=true -keep-loops=false -S -mtriple=x86_64-unknown-linux-gnu | FileCheck %s - +; RUN: opt < %s -passes='simplify-cfg' -S -mtriple=x86_64-unknown-linux-gnu | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" Index: llvm/trunk/test/Transforms/SimplifyCFG/branch-fold-threshold.ll =================================================================== --- llvm/trunk/test/Transforms/SimplifyCFG/branch-fold-threshold.ll +++ llvm/trunk/test/Transforms/SimplifyCFG/branch-fold-threshold.ll @@ -1,6 +1,9 @@ ; RUN: opt %s -simplifycfg -S | FileCheck %s --check-prefix=NORMAL ; RUN: opt %s -simplifycfg -S -bonus-inst-threshold=2 | FileCheck %s --check-prefix=AGGRESSIVE ; RUN: opt %s -simplifycfg -S -bonus-inst-threshold=4 | FileCheck %s --check-prefix=WAYAGGRESSIVE +; RUN: opt %s -passes=simplify-cfg -S | FileCheck %s --check-prefix=NORMAL +; RUN: opt %s -passes='simplify-cfg' -S | FileCheck %s --check-prefix=AGGRESSIVE +; RUN: opt %s -passes='simplify-cfg' -S | FileCheck %s --check-prefix=WAYAGGRESSIVE define i32 @foo(i32 %a, i32 %b, i32 %c, i32 %d, i32* %input) { ; NORMAL-LABEL: @foo( Index: llvm/trunk/test/Transforms/SimplifyCFG/multiple-phis.ll =================================================================== --- llvm/trunk/test/Transforms/SimplifyCFG/multiple-phis.ll +++ llvm/trunk/test/Transforms/SimplifyCFG/multiple-phis.ll @@ -1,5 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -simplifycfg -keep-loops=false -S < %s | FileCheck %s +; RUN: opt -passes='simplify-cfg' -S < %s | FileCheck %s ; It's not worthwhile to if-convert one of the phi nodes and leave ; the other behind, because that still requires a branch. If Index: llvm/trunk/test/Transforms/SimplifyCFG/no-md-sink.ll =================================================================== --- llvm/trunk/test/Transforms/SimplifyCFG/no-md-sink.ll +++ llvm/trunk/test/Transforms/SimplifyCFG/no-md-sink.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -simplifycfg -sink-common-insts -S | FileCheck %s +; RUN: opt < %s -passes='simplify-cfg' -S | FileCheck %s define i1 @test1(i1 zeroext %flag, i8* %y) #0 { entry: Index: llvm/trunk/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata.ll =================================================================== --- llvm/trunk/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata.ll +++ llvm/trunk/test/Transforms/SimplifyCFG/preserve-llvm-loop-metadata.ll @@ -1,4 +1,5 @@ ; RUN: opt -simplifycfg -keep-loops=false -S < %s | FileCheck %s +; RUN: opt -passes='simplify-cfg' -S < %s | FileCheck %s define void @test1(i32 %n) #0 { entry: Index: llvm/trunk/test/Transforms/SimplifyCFG/rangereduce.ll =================================================================== --- llvm/trunk/test/Transforms/SimplifyCFG/rangereduce.ll +++ llvm/trunk/test/Transforms/SimplifyCFG/rangereduce.ll @@ -1,5 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -simplifycfg -switch-to-lookup -S | FileCheck %s +; RUN: opt < %s -passes='simplify-cfg' -S | FileCheck %s target datalayout = "e-n32" Index: llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll =================================================================== --- llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll +++ llvm/trunk/test/Transforms/SimplifyCFG/sink-common-code.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -simplifycfg -sink-common-insts -S | FileCheck -enable-var-scope %s +; RUN: opt < %s -passes='simplify-cfg' -S | FileCheck -enable-var-scope %s define zeroext i1 @test1(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks) { entry: Index: llvm/trunk/test/Transforms/SimplifyCFG/switch_undef.ll =================================================================== --- llvm/trunk/test/Transforms/SimplifyCFG/switch_undef.ll +++ llvm/trunk/test/Transforms/SimplifyCFG/switch_undef.ll @@ -1,4 +1,5 @@ ; RUN: opt %s -keep-loops=false -switch-to-lookup=true -simplifycfg -S | FileCheck %s +; RUN: opt %s -passes='simplify-cfg' -S | FileCheck %s define void @f6() #0 { ; CHECK-LABEL: entry: