Index: lib/Transforms/InstCombine/InstCombineCasts.cpp =================================================================== --- lib/Transforms/InstCombine/InstCombineCasts.cpp +++ lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -1873,6 +1873,10 @@ } else if (auto *LI = dyn_cast(V)) { Builder->SetInsertPoint(OldPN->getIncomingBlock(j)->getTerminator()); NewV = Builder->CreateBitCast(LI, DestTy); + // Builder->CreateBitCast implicitly add NewV to Instruction Combiner + // Worklist. This potentially leads to internal loop. Therefore + // do not continue analysis of newly added BitCast Instruction. + Worklist.Remove(cast(NewV)); Worklist.Add(LI); } else if (auto *BCI = dyn_cast(V)) { NewV = BCI->getOperand(0); @@ -1889,7 +1893,12 @@ auto *SI = dyn_cast(U); if (SI && SI->isSimple() && SI->getOperand(0) == PN) { Builder->SetInsertPoint(SI); - SI->setOperand(0, Builder->CreateBitCast(NewPNodes[PN], SrcTy)); + Value *BC = Builder->CreateBitCast(NewPNodes[PN], SrcTy); + SI->setOperand(0, BC); + // Builder->CreateBitCast implicitly add BC to Instruction Combiner + // Worklist. This potentially leads to internal loop. Therefore + // do not continue analysis of newly added BitCast Instruction. + Worklist.Remove(cast(BC)); Worklist.Add(SI); } }