@@ -5838,10 +5838,24 @@ bool SimplifyCFGOpt::turnSwitchRangeIntoICmp(SwitchInst *SI,
5838
5838
bool IsWrapping = false ;
5839
5839
SmallVectorImpl<ConstantInt *> *ContiguousCases = &CasesA;
5840
5840
SmallVectorImpl<ConstantInt *> *OtherCases = &CasesB;
5841
+
5842
+ // Only one icmp is needed when there is only one case.
5843
+ if (!HasDefault && CasesA.size () == 1 ) {
5844
+ ContiguousCasesMax = CasesA[0 ];
5845
+ ContiguousCasesMin = CasesA[0 ];
5846
+ ContiguousDest = DestA;
5847
+ OtherDest = DestB;
5848
+ } else if (CasesB.size () == 1 ) {
5849
+ ContiguousCasesMax = CasesB[0 ];
5850
+ ContiguousCasesMin = CasesB[0 ];
5851
+ ContiguousDest = DestB;
5852
+ OtherDest = DestA;
5853
+ std::swap (ContiguousCases, OtherCases);
5854
+ }
5841
5855
// Correctness: Cases to the default destination cannot be contiguous cases.
5842
- if (!HasDefault && !CasesA.empty () &&
5843
- casesAreContiguous (SI->getCondition (), CasesA, ContiguousCasesMin,
5844
- ContiguousCasesMax, IsWrapping)) {
5856
+ else if (!HasDefault && !CasesA.empty () &&
5857
+ casesAreContiguous (SI->getCondition (), CasesA, ContiguousCasesMin,
5858
+ ContiguousCasesMax, IsWrapping)) {
5845
5859
ContiguousDest = DestA;
5846
5860
OtherDest = DestB;
5847
5861
} else if (casesAreContiguous (SI->getCondition (), CasesB, ContiguousCasesMin,
0 commit comments