Skip to content

Commit 371fcb7

Browse files
committed
[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 #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 #53853 Refs. rust-lang/rust#85133 Reviewed By: nikic Differential Revision: https://reviews.llvm.org/D119854
1 parent d4a53f3 commit 371fcb7

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)
@@ -335,7 +337,8 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
335337
FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM1),
336338
/*UseMemorySSA=*/true,
337339
/*UseBlockFrequencyInfo=*/true));
338-
FPM.addPass(SimplifyCFGPass());
340+
FPM.addPass(
341+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
339342
FPM.addPass(InstCombinePass());
340343
// The loop passes in LPM2 (LoopFullUnrollPass) do not preserve MemorySSA.
341344
// *All* loop passes must preserve it, in order to be able to use it.
@@ -373,7 +376,8 @@ PassBuilder::buildO1FunctionSimplificationPipeline(OptimizationLevel Level,
373376
// the simplifications and basic cleanup after all the simplifications.
374377
// TODO: Investigate if this is too expensive.
375378
FPM.addPass(ADCEPass());
376-
FPM.addPass(SimplifyCFGPass());
379+
FPM.addPass(
380+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
377381
FPM.addPass(InstCombinePass());
378382
invokePeepholeEPCallbacks(FPM, Level);
379383

@@ -408,7 +412,8 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
408412
// Global value numbering based sinking.
409413
if (EnableGVNSink) {
410414
FPM.addPass(GVNSinkPass());
411-
FPM.addPass(SimplifyCFGPass());
415+
FPM.addPass(
416+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
412417
}
413418

414419
if (EnableConstraintElimination)
@@ -421,7 +426,8 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
421426
FPM.addPass(JumpThreadingPass());
422427
FPM.addPass(CorrelatedValuePropagationPass());
423428

424-
FPM.addPass(SimplifyCFGPass());
429+
FPM.addPass(
430+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
425431
FPM.addPass(InstCombinePass());
426432
if (Level == OptimizationLevel::O3)
427433
FPM.addPass(AggressiveInstCombinePass());
@@ -438,7 +444,8 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
438444
FPM.addPass(PGOMemOPSizeOpt());
439445

440446
FPM.addPass(TailCallElimPass());
441-
FPM.addPass(SimplifyCFGPass());
447+
FPM.addPass(
448+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
442449

443450
// Form canonically associated expression trees, and simplify the trees using
444451
// basic mathematical properties. For example, this will form (nearly)
@@ -510,7 +517,8 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
510517
FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM1),
511518
/*UseMemorySSA=*/true,
512519
/*UseBlockFrequencyInfo=*/true));
513-
FPM.addPass(SimplifyCFGPass());
520+
FPM.addPass(
521+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
514522
FPM.addPass(InstCombinePass());
515523
// The loop passes in LPM2 (LoopIdiomRecognizePass, IndVarSimplifyPass,
516524
// LoopDeletionPass and LoopFullUnrollPass) do not preserve MemorySSA.
@@ -575,8 +583,10 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level,
575583
for (auto &C : ScalarOptimizerLateEPCallbacks)
576584
C(FPM, Level);
577585

578-
FPM.addPass(SimplifyCFGPass(
579-
SimplifyCFGOptions().hoistCommonInsts(true).sinkCommonInsts(true)));
586+
FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions()
587+
.convertSwitchRangeToICmp(true)
588+
.hoistCommonInsts(true)
589+
.sinkCommonInsts(true)));
580590
FPM.addPass(InstCombinePass());
581591
invokePeepholeEPCallbacks(FPM, Level);
582592

@@ -614,7 +624,8 @@ void PassBuilder::addPGOInstrPasses(ModulePassManager &MPM,
614624
FunctionPassManager FPM;
615625
FPM.addPass(SROAPass());
616626
FPM.addPass(EarlyCSEPass()); // Catch trivial redundancies.
617-
FPM.addPass(SimplifyCFGPass()); // Merge & remove basic blocks.
627+
FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(
628+
true))); // Merge & remove basic blocks.
618629
FPM.addPass(InstCombinePass()); // Combine silly sequences.
619630
invokePeepholeEPCallbacks(FPM, Level);
620631

@@ -928,7 +939,8 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
928939
GlobalCleanupPM.addPass(InstCombinePass());
929940
invokePeepholeEPCallbacks(GlobalCleanupPM, Level);
930941

931-
GlobalCleanupPM.addPass(SimplifyCFGPass());
942+
GlobalCleanupPM.addPass(
943+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
932944
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(GlobalCleanupPM),
933945
PTO.EagerlyInvalidateAnalyses));
934946

@@ -1015,7 +1027,8 @@ void PassBuilder::addVectorPasses(OptimizationLevel Level,
10151027
ExtraPasses.addPass(
10161028
createFunctionToLoopPassAdaptor(std::move(LPM), /*UseMemorySSA=*/true,
10171029
/*UseBlockFrequencyInfo=*/true));
1018-
ExtraPasses.addPass(SimplifyCFGPass());
1030+
ExtraPasses.addPass(
1031+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
10191032
ExtraPasses.addPass(InstCombinePass());
10201033
FPM.addPass(std::move(ExtraPasses));
10211034
}
@@ -1031,6 +1044,7 @@ void PassBuilder::addVectorPasses(OptimizationLevel Level,
10311044
// before SLP vectorization.
10321045
FPM.addPass(SimplifyCFGPass(SimplifyCFGOptions()
10331046
.forwardSwitchCondToPhi(true)
1047+
.convertSwitchRangeToICmp(true)
10341048
.convertSwitchToLookupTable(true)
10351049
.needCanonicalLoops(false)
10361050
.hoistCommonInsts(true)
@@ -1202,7 +1216,8 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
12021216

12031217
// LoopSink (and other loop passes since the last simplifyCFG) might have
12041218
// resulted in single-entry-single-exit or empty blocks. Clean up the CFG.
1205-
OptimizePM.addPass(SimplifyCFGPass());
1219+
OptimizePM.addPass(
1220+
SimplifyCFGPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
12061221

12071222
OptimizePM.addPass(CoroCleanupPass());
12081223

@@ -1676,8 +1691,9 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
16761691

16771692
// Add late LTO optimization passes.
16781693
// Delete basic blocks, which optimization passes may have killed.
1679-
MPM.addPass(createModuleToFunctionPassAdaptor(
1680-
SimplifyCFGPass(SimplifyCFGOptions().hoistCommonInsts(true))));
1694+
MPM.addPass(createModuleToFunctionPassAdaptor(SimplifyCFGPass(
1695+
SimplifyCFGOptions().convertSwitchRangeToICmp(true).hoistCommonInsts(
1696+
true))));
16811697

16821698
// Drop bodies of available eternally objects to improve GlobalDCE.
16831699
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
@@ -344,6 +344,7 @@ void HexagonPassConfig::addIRPasses() {
344344
if (EnableInitialCFGCleanup)
345345
addPass(createCFGSimplificationPass(SimplifyCFGOptions()
346346
.forwardSwitchCondToPhi(true)
347+
.convertSwitchRangeToICmp(true)
347348
.convertSwitchToLookupTable(true)
348349
.needCanonicalLoops(false)
349350
.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
@@ -465,7 +472,8 @@ void PassManagerBuilder::addFunctionSimplificationPasses(
465472
// FIXME: We break the loop pass pipeline here in order to do full
466473
// simplifycfg. Eventually loop-simplifycfg should be enhanced to replace the
467474
// need for this.
468-
MPM.add(createCFGSimplificationPass());
475+
MPM.add(createCFGSimplificationPass(
476+
SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
469477
MPM.add(createInstructionCombiningPass());
470478
// We resume loop passes creating a second loop pipeline here.
471479
if (EnableLoopFlatten) {
@@ -582,7 +590,8 @@ void PassManagerBuilder::addVectorPasses(legacy::PassManagerBase &PM,
582590
PM.add(createInstructionCombiningPass());
583591
PM.add(createLICMPass(LicmMssaOptCap, LicmMssaNoAccForPromotionCap));
584592
PM.add(createLoopUnswitchPass(SizeLevel || OptLevel < 3, DivergentTarget));
585-
PM.add(createCFGSimplificationPass());
593+
PM.add(createCFGSimplificationPass(
594+
SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
586595
PM.add(createInstructionCombiningPass());
587596
}
588597

@@ -597,6 +606,7 @@ void PassManagerBuilder::addVectorPasses(legacy::PassManagerBase &PM,
597606
// before SLP vectorization.
598607
PM.add(createCFGSimplificationPass(SimplifyCFGOptions()
599608
.forwardSwitchCondToPhi(true)
609+
.convertSwitchRangeToICmp(true)
600610
.convertSwitchToLookupTable(true)
601611
.needCanonicalLoops(false)
602612
.hoistCommonInsts(true)
@@ -772,7 +782,9 @@ void PassManagerBuilder::populateModulePassManager(
772782

773783
MPM.add(createInstructionCombiningPass()); // Clean up after IPCP & DAE
774784
addExtensionsToPM(EP_Peephole, MPM);
775-
MPM.add(createCFGSimplificationPass()); // Clean up after IPCP & DAE
785+
MPM.add(
786+
createCFGSimplificationPass(SimplifyCFGOptions().convertSwitchRangeToICmp(
787+
true))); // Clean up after IPCP & DAE
776788

777789
// For SamplePGO in ThinLTO compile phase, we do not want to do indirect
778790
// call promotion as it will change the CFG too much to make the 2nd
@@ -972,7 +984,8 @@ void PassManagerBuilder::populateModulePassManager(
972984

973985
// LoopSink (and other loop passes since the last simplifyCFG) might have
974986
// resulted in single-entry-single-exit or empty blocks. Clean up the CFG.
975-
MPM.add(createCFGSimplificationPass());
987+
MPM.add(createCFGSimplificationPass(
988+
SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
976989

977990
addExtensionsToPM(EP_OptimizerLast, MPM);
978991

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
@@ -6559,7 +6559,9 @@ bool SimplifyCFGOpt::simplifySwitch(SwitchInst *SI, IRBuilder<> &Builder) {
65596559
}
65606560

65616561
// Try to transform the switch into an icmp and a branch.
6562-
if (TurnSwitchRangeIntoICmp(SI, Builder))
6562+
// The conversion from switch to comparison may lose information on
6563+
// impossible switch values, so disable it early in the pipeline.
6564+
if (Options.ConvertSwitchRangeToICmp && TurnSwitchRangeIntoICmp(SI, Builder))
65636565
return requestResimplify();
65646566

65656567
// 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)