diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyCFG.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 19 | 
1 files changed, 15 insertions, 4 deletions
| diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 4fac5d3..b03fb62 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -1866,10 +1866,19 @@ bool SimplifyCFGOpt::hoistCommonCodeFromSuccessors(Instruction *TI,    // If either of the blocks has it's address taken, then we can't do this fold,    // because the code we'd hoist would no longer run when we jump into the block    // by it's address. -  for (auto *Succ : successors(BB)) -    if (Succ->hasAddressTaken() || !Succ->getSinglePredecessor()) +  for (auto *Succ : successors(BB)) { +    if (Succ->hasAddressTaken())        return false; - +    if (Succ->getSinglePredecessor()) +      continue; +    // If Succ has >1 predecessors, continue to check if the Succ contains only +    // one `unreachable` inst. Since executing `unreachable` inst is an UB, we +    // can relax the condition based on the assumptiom that the program would +    // never enter Succ and trigger such an UB. +    if (isa<UnreachableInst>(*Succ->begin())) +      continue; +    return false; +  }    // The second of pair is a SkipFlags bitmask.    using SuccIterPair = std::pair<BasicBlock::iterator, unsigned>;    SmallVector<SuccIterPair, 8> SuccIterPairs; @@ -7623,7 +7632,9 @@ static bool simplifySwitchOfPowersOfTwo(SwitchInst *SI, IRBuilder<> &Builder,      auto *DefaultCaseBB = SI->getDefaultDest();      BasicBlock *SplitBB = SplitBlock(OrigBB, SI, DTU);      auto It = OrigBB->getTerminator()->getIterator(); -    BranchInst::Create(SplitBB, DefaultCaseBB, IsPow2, It); +    auto *BI = BranchInst::Create(SplitBB, DefaultCaseBB, IsPow2, It); +    // BI is handling the default case for SI, and so should share its DebugLoc. +    BI->setDebugLoc(SI->getDebugLoc());      It->eraseFromParent();      addPredecessorToBlock(DefaultCaseBB, OrigBB, SplitBB); | 
