@@ -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 ());
0 commit comments