Skip to content

Commit ba9ff03

Browse files
LebedevRItstellar
authored andcommitted
[SimplifyCFG][PhaseOrdering] Defer lowering switch into an integer range comparison and branch until after at least the IPSCCP
That transformation is lossy, as discussed in llvm#53853 and rust-lang/rust#85133 (comment) This is an alternative to D119839, which would add a limited IPSCCP into SimplifyCFG. Unlike lowering switch to lookup, we still want this transformation to happen relatively early, but after giving a chance for the things like CVP to do their thing. It seems like deferring it just until the IPSCCP is enough for the tests at hand, but perhaps we need to be more aggressive and disable it until CVP. Fixes llvm#53853 Refs. rust-lang/rust#85133 Reviewed By: nikic Differential Revision: https://reviews.llvm.org/D119854
1 parent da3953f commit ba9ff03

23 files changed

+104
-60
lines changed

llvm/include/llvm/Transforms/Utils/SimplifyCFGOptions.h

+5
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class AssumptionCache;
2323
struct SimplifyCFGOptions {
2424
int BonusInstThreshold = 1;
2525
bool ForwardSwitchCondToPhi = false;
26+
bool ConvertSwitchRangeToICmp = false;
2627
bool ConvertSwitchToLookupTable = false;
2728
bool NeedCanonicalLoop = true;
2829
bool HoistCommonInsts = false;
@@ -41,6 +42,10 @@ struct SimplifyCFGOptions {
4142
ForwardSwitchCondToPhi = B;
4243
return *this;
4344
}
45+
SimplifyCFGOptions &convertSwitchRangeToICmp(bool B) {
46+
ConvertSwitchRangeToICmp = B;
47+
return *this;
48+
}
4449
SimplifyCFGOptions &convertSwitchToLookupTable(bool B) {
4550
ConvertSwitchToLookupTable = B;
4651
return *this;

llvm/lib/Passes/PassBuilder.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,8 @@ Expected<SimplifyCFGOptions> parseSimplifyCFGOptions(StringRef Params) {
679679
bool Enable = !ParamName.consume_front("no-");
680680
if (ParamName == "forward-switch-cond") {
681681
Result.forwardSwitchCondToPhi(Enable);
682+
} else if (ParamName == "switch-range-to-icmp") {
683+
Result.convertSwitchRangeToICmp(Enable);
682684
} else if (ParamName == "switch-to-lookup") {
683685
Result.convertSwitchToLookupTable(Enable);
684686
} else if (ParamName == "keep-loops") {

llvm/lib/Passes/PassBuilderPipelines.cpp

+32-16
Original file line numberDiff line numberDiff line change
@@ -259,14 +259,16 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
259259
FPM.addPass(EarlyCSEPass(true /* Enable mem-ssa. */));
260260

261261
// Hoisting of scalars and load expressions.
262-
FPM.addPass(SimplifyCFGPass());
262+
FPM.addPass(
263+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
263264
FPM.addPass(InstCombinePass());
264265

265266
FPM.addPass(LibCallsShrinkWrapPass());
266267

267268
invokePeepholeEPCallbacks(FPM, Level);
268269

269-
FPM.addPass(SimplifyCFGPass());
270+
FPM.addPass(
271+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
270272

271273
// Form canonically associated expression trees, and simplify the trees using
272274
// basic mathematical properties. For example, this will form (nearly)
@@ -340,7 +342,8 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
340342
FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM1),
341343
/*UseMemorySSA=*/true,
342344
/*UseBlockFrequencyInfo=*/true));
343-
FPM.addPass(SimplifyCFGPass());
345+
FPM.addPass(
346+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
344347
FPM.addPass(InstCombinePass());
345348
// The loop passes in LPM2 (LoopFullUnrollPass) do not preserve MemorySSA.
346349
// *All* loop passes must preserve it, in order to be able to use it.
@@ -378,7 +381,8 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
378381
// the simplifications and basic cleanup after all the simplifications.
379382
// TODO: Investigate if this is too expensive.
380383
FPM.addPass(ADCEPass());
381-
FPM.addPass(SimplifyCFGPass());
384+
FPM.addPass(
385+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
382386
FPM.addPass(InstCombinePass());
383387
invokePeepholeEPCallbacks(FPM, Level);
384388

@@ -413,7 +417,8 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
413417
// Global value numbering based sinking.
414418
if (EnableGVNSink) {
415419
FPM.addPass(GVNSinkPass());
416-
FPM.addPass(SimplifyCFGPass());
420+
FPM.addPass(
421+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
417422
}
418423

419424
if (EnableConstraintElimination)
@@ -426,7 +431,8 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
426431
FPM.addPass(JumpThreadingPass());
427432
FPM.addPass(CorrelatedValuePropagationPass());
428433

429-
FPM.addPass(SimplifyCFGPass());
434+
FPM.addPass(
435+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
430436
FPM.addPass(InstCombinePass());
431437
if (Level == OptimizationLevel::O3)
432438
FPM.addPass(AggressiveInstCombinePass());
@@ -443,7 +449,8 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
443449
FPM.addPass(PGOMemOPSizeOpt());
444450

445451
FPM.addPass(TailCallElimPass());
446-
FPM.addPass(SimplifyCFGPass());
452+
FPM.addPass(
453+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
447454

448455
// Form canonically associated expression trees, and simplify the trees using
449456
// basic mathematical properties. For example, this will form (nearly)
@@ -520,7 +527,8 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
520527
FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM1),
521528
/*UseMemorySSA=*/true,
522529
/*UseBlockFrequencyInfo=*/true));
523-
FPM.addPass(SimplifyCFGPass());
530+
FPM.addPass(
531+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
524532
FPM.addPass(InstCombinePass());
525533
// The loop passes in LPM2 (LoopIdiomRecognizePass, IndVarSimplifyPass,
526534
// LoopDeletionPass and LoopFullUnrollPass) do not preserve MemorySSA.
@@ -586,8 +594,10 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
586594
for (auto &C : ScalarOptimizerLateEPCallbacks)
587595
C(FPM, Level);
588596

589-
FPM.addPass(SimplifyCFGPass(
590-
SimplifyCFGOptions().hoistCommonInsts(true).sinkCommonInsts(true)));
597+
FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions()
598+
.convertSwitchRangeToICmp(true)
599+
.hoistCommonInsts(true)
600+
.sinkCommonInsts(true)));
591601
FPM.addPass(InstCombinePass());
592602
invokePeepholeEPCallbacks(FPM, Level);
593603

@@ -625,7 +635,8 @@ void PassBuilder::addPGOInstrPasses(ModulePassManager &MPM,
625635
FunctionPassManager FPM;
626636
FPM.addPass(SROAPass());
627637
FPM.addPass(EarlyCSEPass()); // Catch trivial redundancies.
628-
FPM.addPass(SimplifyCFGPass()); // Merge & remove basic blocks.
638+
FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(
639+
true))); // Merge & remove basic blocks.
629640
FPM.addPass(InstCombinePass()); // Combine silly sequences.
630641
invokePeepholeEPCallbacks(FPM, Level);
631642

@@ -939,7 +950,8 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
939950
GlobalCleanupPM.addPass(InstCombinePass());
940951
invokePeepholeEPCallbacks(GlobalCleanupPM, Level);
941952

942-
GlobalCleanupPM.addPass(SimplifyCFGPass());
953+
GlobalCleanupPM.addPass(
954+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
943955
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(GlobalCleanupPM),
944956
PTO.EagerlyInvalidateAnalyses));
945957

@@ -1027,7 +1039,8 @@ void PassBuilder::addVectorPasses(OptimizationLevel Level,
10271039
ExtraPasses.addPass(
10281040
createFunctionToLoopPassAdaptor(std::move(LPM), /*UseMemorySSA=*/true,
10291041
/*UseBlockFrequencyInfo=*/true));
1030-
ExtraPasses.addPass(SimplifyCFGPass());
1042+
ExtraPasses.addPass(
1043+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
10311044
ExtraPasses.addPass(InstCombinePass());
10321045
FPM.addPass(std::move(ExtraPasses));
10331046
}
@@ -1043,6 +1056,7 @@ void PassBuilder::addVectorPasses(OptimizationLevel Level,
10431056
// before SLP vectorization.
10441057
FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions()
10451058
.forwardSwitchCondToPhi(true)
1059+
.convertSwitchRangeToICmp(true)
10461060
.convertSwitchToLookupTable(true)
10471061
.needCanonicalLoops(false)
10481062
.hoistCommonInsts(true)
@@ -1215,7 +1229,8 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
12151229

12161230
// LoopSink (and other loop passes since the last simplifyCFG) might have
12171231
// resulted in single-entry-single-exit or empty blocks. Clean up the CFG.
1218-
OptimizePM.addPass(SimplifyCFGPass());
1232+
OptimizePM.addPass(
1233+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
12191234

12201235
OptimizePM.addPass(CoroCleanupPass());
12211236

@@ -1690,8 +1705,9 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
16901705

16911706
// Add late LTO optimization passes.
16921707
// Delete basic blocks, which optimization passes may have killed.
1693-
MPM.addPass(createModuleToFunctionPassAdaptor(
1694-
SimplifyCFGPass(SimplifyCFGOptions().hoistCommonInsts(true))));
1708+
MPM.addPass(createModuleToFunctionPassAdaptor(SimplifyCFGPass(
1709+
SimplifyCFGOptions().convertSwitchRangeToICmp(true).hoistCommonInsts(
1710+
true))));
16951711

16961712
// Drop bodies of available eternally objects to improve GlobalDCE.
16971713
MPM.addPass(EliminateAvailableExternallyPass());

llvm/lib/Passes/PassRegistry.def

+1
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,7 @@ FUNCTION_PASS_WITH_PARAMS("simplifycfg",
423423
},
424424
parseSimplifyCFGOptions,
425425
"no-forward-switch-cond;forward-switch-cond;"
426+
"no-switch-range-to-icmp;switch-range-to-icmp;"
426427
"no-switch-to-lookup;switch-to-lookup;"
427428
"no-keep-loops;keep-loops;"
428429
"no-hoist-common-insts;hoist-common-insts;"

llvm/lib/Target/AArch64/AArch64TargetMachine.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,7 @@ void AArch64PassConfig::addIRPasses() {
531531
if (TM->getOptLevel() != CodeGenOpt::None && EnableAtomicTidy)
532532
addPass(createCFGSimplificationPass(SimplifyCFGOptions()
533533
.forwardSwitchCondToPhi(true)
534+
.convertSwitchRangeToICmp(true)
534535
.convertSwitchToLookupTable(true)
535536
.needCanonicalLoops(false)
536537
.hoistCommonInsts(true)

llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@ void HexagonPassConfig::addIRPasses() {
345345
if (EnableInitialCFGCleanup)
346346
addPass(createCFGSimplificationPass(SimplifyCFGOptions()
347347
.forwardSwitchCondToPhi(true)
348+
.convertSwitchRangeToICmp(true)
348349
.convertSwitchToLookupTable(true)
349350
.needCanonicalLoops(false)
350351
.hoistCommonInsts(true)

llvm/lib/Transforms/IPO/PassManagerBuilder.cpp

+21-8
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,9 @@ void PassManagerBuilder::addPGOInstrPasses(legacy::PassManagerBase &MPM,
365365
MPM.add(createFunctionInliningPass(IP));
366366
MPM.add(createSROAPass());
367367
MPM.add(createEarlyCSEPass()); // Catch trivial redundancies
368-
MPM.add(createCFGSimplificationPass()); // Merge & remove BBs
368+
MPM.add(createCFGSimplificationPass(
369+
SimplifyCFGOptions().convertSwitchRangeToICmp(
370+
true))); // Merge & remove BBs
369371
MPM.add(createInstructionCombiningPass()); // Combine silly seq's
370372
addExtensionsToPM(EP_Peephole, MPM);
371373
}
@@ -404,7 +406,8 @@ void PassManagerBuilder::addFunctionSimplificationPasses(
404406
MPM.add(createGVNHoistPass());
405407
if (EnableGVNSink) {
406408
MPM.add(createGVNSinkPass());
407-
MPM.add(createCFGSimplificationPass());
409+
MPM.add(createCFGSimplificationPass(
410+
SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
408411
}
409412
}
410413

@@ -418,7 +421,9 @@ void PassManagerBuilder::addFunctionSimplificationPasses(
418421
MPM.add(createJumpThreadingPass()); // Thread jumps.
419422
MPM.add(createCorrelatedValuePropagationPass()); // Propagate conditionals
420423
}
421-
MPM.add(createCFGSimplificationPass()); // Merge & remove BBs
424+
MPM.add(
425+
createCFGSimplificationPass(SimplifyCFGOptions().convertSwitchRangeToICmp(
426+
true))); // Merge & remove BBs
422427
// Combine silly seq's
423428
if (OptLevel > 2)
424429
MPM.add(createAggressiveInstCombinerPass());
@@ -434,7 +439,9 @@ void PassManagerBuilder::addFunctionSimplificationPasses(
434439
// TODO: Investigate the cost/benefit of tail call elimination on debugging.
435440
if (OptLevel > 1)
436441
MPM.add(createTailCallEliminationPass()); // Eliminate tail calls
437-
MPM.add(createCFGSimplificationPass()); // Merge & remove BBs
442+
MPM.add(
443+
createCFGSimplificationPass(SimplifyCFGOptions().convertSwitchRangeToICmp(
444+
true))); // Merge & remove BBs
438445
MPM.add(createReassociatePass()); // Reassociate expressions
439446

440447
// The matrix extension can introduce large vector operations early, which can
@@ -470,7 +477,8 @@ void PassManagerBuilder::addFunctionSimplificationPasses(
470477
// FIXME: We break the loop pass pipeline here in order to do full
471478
// simplifycfg. Eventually loop-simplifycfg should be enhanced to replace the
472479
// need for this.
473-
MPM.add(createCFGSimplificationPass());
480+
MPM.add(createCFGSimplificationPass(
481+
SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
474482
MPM.add(createInstructionCombiningPass());
475483
// We resume loop passes creating a second loop pipeline here.
476484
if (EnableLoopFlatten) {
@@ -589,7 +597,8 @@ void PassManagerBuilder::addVectorPasses(legacy::PassManagerBase &PM,
589597
PM.add(createLICMPass(LicmMssaOptCap, LicmMssaNoAccForPromotionCap,
590598
/*AllowSpeculation=*/true));
591599
PM.add(createLoopUnswitchPass(SizeLevel || OptLevel < 3, DivergentTarget));
592-
PM.add(createCFGSimplificationPass());
600+
PM.add(createCFGSimplificationPass(
601+
SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
593602
PM.add(createInstructionCombiningPass());
594603
}
595604

@@ -604,6 +613,7 @@ void PassManagerBuilder::addVectorPasses(legacy::PassManagerBase &PM,
604613
// before SLP vectorization.
605614
PM.add(createCFGSimplificationPass(SimplifyCFGOptions()
606615
.forwardSwitchCondToPhi(true)
616+
.convertSwitchRangeToICmp(true)
607617
.convertSwitchToLookupTable(true)
608618
.needCanonicalLoops(false)
609619
.hoistCommonInsts(true)
@@ -780,7 +790,9 @@ void PassManagerBuilder::populateModulePassManager(
780790

781791
MPM.add(createInstructionCombiningPass()); // Clean up after IPCP & DAE
782792
addExtensionsToPM(EP_Peephole, MPM);
783-
MPM.add(createCFGSimplificationPass()); // Clean up after IPCP & DAE
793+
MPM.add(
794+
createCFGSimplificationPass(SimplifyCFGOptions().convertSwitchRangeToICmp(
795+
true))); // Clean up after IPCP & DAE
784796

785797
// For SamplePGO in ThinLTO compile phase, we do not want to do indirect
786798
// call promotion as it will change the CFG too much to make the 2nd
@@ -981,7 +993,8 @@ void PassManagerBuilder::populateModulePassManager(
981993

982994
// LoopSink (and other loop passes since the last simplifyCFG) might have
983995
// resulted in single-entry-single-exit or empty blocks. Clean up the CFG.
984-
MPM.add(createCFGSimplificationPass());
996+
MPM.add(createCFGSimplificationPass(
997+
SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
985998

986999
addExtensionsToPM(EP_OptimizerLast, MPM);
9871000

llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ static cl::opt<bool> UserKeepLoops(
5959
"keep-loops", cl::Hidden, cl::init(true),
6060
cl::desc("Preserve canonical loop structure (default = true)"));
6161

62+
static cl::opt<bool> UserSwitchRangeToICmp(
63+
"switch-range-to-icmp", cl::Hidden, cl::init(false),
64+
cl::desc(
65+
"Convert switches into an integer range comparison (default = false)"));
66+
6267
static cl::opt<bool> UserSwitchToLookup(
6368
"switch-to-lookup", cl::Hidden, cl::init(false),
6469
cl::desc("Convert switches to lookup tables (default = false)"));
@@ -311,6 +316,8 @@ static void applyCommandLineOverridesToOptions(SimplifyCFGOptions &Options) {
311316
Options.BonusInstThreshold = UserBonusInstThreshold;
312317
if (UserForwardSwitchCond.getNumOccurrences())
313318
Options.ForwardSwitchCondToPhi = UserForwardSwitchCond;
319+
if (UserSwitchRangeToICmp.getNumOccurrences())
320+
Options.ConvertSwitchRangeToICmp = UserSwitchRangeToICmp;
314321
if (UserSwitchToLookup.getNumOccurrences())
315322
Options.ConvertSwitchToLookupTable = UserSwitchToLookup;
316323
if (UserKeepLoops.getNumOccurrences())
@@ -337,6 +344,8 @@ void SimplifyCFGPass::printPipeline(
337344
OS << "<";
338345
OS << "bonus-inst-threshold=" << Options.BonusInstThreshold << ";";
339346
OS << (Options.ForwardSwitchCondToPhi ? "" : "no-") << "forward-switch-cond;";
347+
OS << (Options.ConvertSwitchRangeToICmp ? "" : "no-")
348+
<< "switch-range-to-icmp;";
340349
OS << (Options.ConvertSwitchToLookupTable ? "" : "no-")
341350
<< "switch-to-lookup;";
342351
OS << (Options.NeedCanonicalLoop ? "" : "no-") << "keep-loops;";

llvm/lib/Transforms/Utils/SimplifyCFG.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -6211,7 +6211,9 @@ bool SimplifyCFGOpt::simplifySwitch(SwitchInst *SI, IRBuilder<> &Builder) {
62116211
}
62126212

62136213
// Try to transform the switch into an icmp and a branch.
6214-
if (TurnSwitchRangeIntoICmp(SI, Builder))
6214+
// The conversion from switch to comparison may lose information on
6215+
// impossible switch values, so disable it early in the pipeline.
6216+
if (Options.ConvertSwitchRangeToICmp && TurnSwitchRangeIntoICmp(SI, Builder))
62156217
return requestResimplify();
62166218

62176219
// Remove unreachable cases.

llvm/test/Other/new-pm-print-pipeline.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
;; Test that the -print-pipeline-passes option correctly prints some explicitly specified pipelines.
22

33
; RUN: opt -disable-output -disable-verify -print-pipeline-passes -passes='function(adce),function(simplifycfg<bonus-inst-threshold=123;no-forward-switch-cond;switch-to-lookup;keep-loops;no-hoist-common-insts;sink-common-insts>)' < %s | FileCheck %s --match-full-lines --check-prefixes=CHECK-0
4-
; CHECK-0: function(adce),function(simplifycfg<bonus-inst-threshold=123;no-forward-switch-cond;switch-to-lookup;keep-loops;no-hoist-common-insts;sink-common-insts>)
4+
; CHECK-0: function(adce),function(simplifycfg<bonus-inst-threshold=123;no-forward-switch-cond;no-switch-range-to-icmp;switch-to-lookup;keep-loops;no-hoist-common-insts;sink-common-insts>)
55

66
; RUN: opt -disable-output -disable-verify -print-pipeline-passes -passes='module(rpo-function-attrs,require<globals-aa>,function(float2int,lower-constant-intrinsics,loop(loop-rotate)),invalidate<globals-aa>)' < %s | FileCheck %s --match-full-lines --check-prefixes=CHECK-1
77
; CHECK-1: rpo-function-attrs,require<globals-aa>,function(float2int,lower-constant-intrinsics,loop(loop-rotate)),invalidate<globals-aa>
@@ -56,7 +56,7 @@
5656
; CHECK-17: function(print<stack-lifetime><may>,print<stack-lifetime><must>)
5757

5858
; RUN: opt -disable-output -disable-verify -print-pipeline-passes -passes='function(simplifycfg<bonus-inst-threshold=5;forward-switch-cond;switch-to-lookup;keep-loops;hoist-common-insts;sink-common-insts>,simplifycfg<bonus-inst-threshold=7;no-forward-switch-cond;no-switch-to-lookup;no-keep-loops;no-hoist-common-insts;no-sink-common-insts>)' < %s | FileCheck %s --match-full-lines --check-prefixes=CHECK-18
59-
; CHECK-18: function(simplifycfg<bonus-inst-threshold=5;forward-switch-cond;switch-to-lookup;keep-loops;hoist-common-insts;sink-common-insts>,simplifycfg<bonus-inst-threshold=7;no-forward-switch-cond;no-switch-to-lookup;no-keep-loops;no-hoist-common-insts;no-sink-common-insts>)
59+
; CHECK-18: function(simplifycfg<bonus-inst-threshold=5;forward-switch-cond;no-switch-range-to-icmp;switch-to-lookup;keep-loops;hoist-common-insts;sink-common-insts>,simplifycfg<bonus-inst-threshold=7;no-forward-switch-cond;no-switch-range-to-icmp;no-switch-to-lookup;no-keep-loops;no-hoist-common-insts;no-sink-common-insts>)
6060

6161
; RUN: opt -disable-output -disable-verify -print-pipeline-passes -passes='function(loop-vectorize<no-interleave-forced-only;no-vectorize-forced-only>,loop-vectorize<interleave-forced-only;vectorize-forced-only>)' < %s | FileCheck %s --match-full-lines --check-prefixes=CHECK-19
6262
; CHECK-19: function(loop-vectorize<no-interleave-forced-only;no-vectorize-forced-only;>,loop-vectorize<interleave-forced-only;vectorize-forced-only;>)

llvm/test/Transforms/Coroutines/coro-catchswitch-cleanuppad.ll

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; Tests the PHI nodes in cleanuppads for catchswitch instructions are correctly
22
; split up.
3-
; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg,early-cse' -S | FileCheck %s
3+
; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg<switch-range-to-icmp>,early-cse' -S | FileCheck %s
44

55
declare i32 @__CxxFrameHandler3(...)
66
define i8* @f2(i1 %val) "coroutine.presplit"="1" personality i32 (...)* @__CxxFrameHandler3 {

llvm/test/Transforms/LoopUnroll/ARM/upperbound.ll

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2-
; RUN: opt -loop-unroll -simplifycfg -instcombine -simplifycfg -S -mtriple arm-none-eabi -mcpu=cortex-m7 %s | FileCheck %s
2+
; RUN: opt -loop-unroll -simplifycfg -switch-range-to-icmp -instcombine -simplifycfg -S -mtriple arm-none-eabi -mcpu=cortex-m7 %s | FileCheck %s
33

44
; This test is meant to check that this loop is unrolled into three iterations.
55
define void @test(i32* %x, i32 %n) {

0 commit comments

Comments
 (0)