@@ -5287,11 +5287,9 @@ InitializeUniqueCases(SwitchInst *SI, PHINode *&PHI, BasicBlock *&CommonDest,
5287
5287
static Value *ConvertTwoCaseSwitch (const SwitchCaseResultVectorTy &ResultVector,
5288
5288
Constant *DefaultResult, Value *Condition,
5289
5289
IRBuilder<> &Builder) {
5290
- assert (ResultVector.size () == 2 &&
5291
- " We should have exactly two unique results at this point" );
5292
5290
// If we are selecting between only two cases transform into a simple
5293
5291
// select or a two-way select if default is possible.
5294
- if (ResultVector[0 ].second .size () == 1 &&
5292
+ if (ResultVector. size () == 2 && ResultVector [0 ].second .size () == 1 &&
5295
5293
ResultVector[1 ].second .size () == 1 ) {
5296
5294
ConstantInt *const FirstCase = ResultVector[0 ].second [0 ];
5297
5295
ConstantInt *const SecondCase = ResultVector[1 ].second [0 ];
@@ -5310,6 +5308,17 @@ static Value *ConvertTwoCaseSwitch(const SwitchCaseResultVectorTy &ResultVector,
5310
5308
SelectValue, " switch.select" );
5311
5309
}
5312
5310
5311
+ // Handle the degenerate case where two cases have the same value.
5312
+ if (ResultVector.size () == 1 && ResultVector[0 ].second .size () == 2 &&
5313
+ DefaultResult) {
5314
+ Value *Cmp1 = Builder.CreateICmpEQ (
5315
+ Condition, ResultVector[0 ].second [0 ], " switch.selectcmp.case1" );
5316
+ Value *Cmp2 = Builder.CreateICmpEQ (
5317
+ Condition, ResultVector[0 ].second [1 ], " switch.selectcmp.case2" );
5318
+ Value *Cmp = Builder.CreateOr (Cmp1, Cmp2, " switch.selectcmp" );
5319
+ return Builder.CreateSelect (Cmp, ResultVector[0 ].first , DefaultResult);
5320
+ }
5321
+
5313
5322
return nullptr ;
5314
5323
}
5315
5324
@@ -5334,13 +5343,14 @@ static void RemoveSwitchAfterSelectConversion(SwitchInst *SI, PHINode *PHI,
5334
5343
PHI->removeIncomingValue (SelectBB);
5335
5344
PHI->addIncoming (SelectValue, SelectBB);
5336
5345
5346
+ SmallPtrSet<BasicBlock *, 4 > RemovedSuccessors;
5337
5347
for (unsigned i = 0 , e = SI->getNumSuccessors (); i < e; ++i) {
5338
5348
BasicBlock *Succ = SI->getSuccessor (i);
5339
5349
5340
5350
if (Succ == DestBB)
5341
5351
continue ;
5342
5352
Succ->removePredecessor (SelectBB);
5343
- if (DTU)
5353
+ if (DTU && RemovedSuccessors. insert (Succ). second )
5344
5354
Updates.push_back ({DominatorTree::Delete, SelectBB, Succ});
5345
5355
}
5346
5356
SI->eraseFromParent ();
@@ -5361,10 +5371,8 @@ static bool switchToSelect(SwitchInst *SI, IRBuilder<> &Builder,
5361
5371
SwitchCaseResultVectorTy UniqueResults;
5362
5372
// Collect all the cases that will deliver the same value from the switch.
5363
5373
if (!InitializeUniqueCases (SI, PHI, CommonDest, UniqueResults, DefaultResult,
5364
- DL, TTI, 2 , 1 ))
5365
- return false ;
5366
- // Selects choose between maximum two values.
5367
- if (UniqueResults.size () != 2 )
5374
+ DL, TTI, /* MaxUniqueResults*/ 2 ,
5375
+ /* MaxCasesPerResult*/ 2 ))
5368
5376
return false ;
5369
5377
assert (PHI != nullptr && " PHI for value select not found" );
5370
5378
0 commit comments