diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -6527,19 +6527,21 @@ if (C->isNullValue() || isa(C)) { // Only look at the first use, avoid hurting compile time with long uselists - User *Use = *I->user_begin(); + auto *Use = cast(*I->user_begin()); + // Bail out if Use is not in the same BB as I or Use == I or Use comes + // before I in the block. The latter two can be the case if Use is a PHI + // node. + if (Use->getParent() != I->getParent() || Use == I || Use->comesBefore(I)) + return false; // Now make sure that there are no instructions in between that can alter // control flow (eg. calls) - for (BasicBlock::iterator - i = ++BasicBlock::iterator(I), - UI = BasicBlock::iterator(dyn_cast(Use)); - i != UI; ++i) { - if (i == I->getParent()->end()) - return false; - if (!isGuaranteedToTransferExecutionToSuccessor(&*i)) - return false; - } + auto InstrRange = + make_range(std::next(I->getIterator()), Use->getIterator()); + if (any_of(InstrRange, [](Instruction &I) { + return !isGuaranteedToTransferExecutionToSuccessor(&I); + })) + return false; // Look through GEPs. A load from a GEP derived from NULL is still undefined if (GetElementPtrInst *GEP = dyn_cast(Use))