diff options
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Utils/BasicBlockUtils.cpp | 8 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Vectorize/LoopVectorize.cpp | 20 | 
2 files changed, 21 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp index aa69a8d0088..5fa371377c8 100644 --- a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp +++ b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp @@ -579,7 +579,13 @@ BasicBlock *llvm::SplitBlockPredecessors(BasicBlock *BB,    // The new block unconditionally branches to the old block.    BranchInst *BI = BranchInst::Create(BB, NewBB); -  BI->setDebugLoc(BB->getFirstNonPHIOrDbg()->getDebugLoc()); +  // Splitting the predecessors of a loop header creates a preheader block. +  if (LI && LI->isLoopHeader(BB)) +    // Using the loop start line number prevents debuggers stepping into the +    // loop body for this instruction. +    BI->setDebugLoc(LI->getLoopFor(BB)->getStartLoc()); +  else +    BI->setDebugLoc(BB->getFirstNonPHIOrDbg()->getDebugLoc());    // Move the edges from Preds to point to NewBB instead of BB.    for (unsigned i = 0, e = Preds.size(); i != e; ++i) { diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp index 79528e5927e..b7ffe817c33 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -2911,11 +2911,11 @@ BasicBlock *InnerLoopVectorizer::createVectorizedLoopSkeleton() {          CmpInst::Create(Instruction::ICmp, CmpInst::ICMP_EQ, Count,                          CountRoundDown, "cmp.n", MiddleBlock->getTerminator()); -    // Provide correct stepping behaviour by using the same DebugLoc as the -    // scalar loop latch branch cmp if it exists. -    if (CmpInst *ScalarLatchCmp = -            dyn_cast_or_null<CmpInst>(ScalarLatchBr->getCondition())) -      cast<Instruction>(CmpN)->setDebugLoc(ScalarLatchCmp->getDebugLoc()); +    // Here we use the same DebugLoc as the scalar loop latch branch instead +    // of the corresponding compare because they may have ended up with +    // different line numbers and we want to avoid awkward line stepping while +    // debugging. Eg. if the compare has got a line number inside the loop. +    cast<Instruction>(CmpN)->setDebugLoc(ScalarLatchBr->getDebugLoc());    }    BranchInst *BrInst = BranchInst::Create(ExitBlock, ScalarPH, CmpN); @@ -3608,7 +3608,15 @@ void InnerLoopVectorizer::fixReduction(PHINode *Phi) {    // Reduce all of the unrolled parts into a single vector.    Value *ReducedPartRdx = VectorLoopValueMap.getVectorValue(LoopExitInst, 0);    unsigned Op = RecurrenceDescriptor::getRecurrenceBinOp(RK); -  setDebugLocFromInst(Builder, ReducedPartRdx); + +  // The middle block terminator has already been assigned a DebugLoc here (the +  // OrigLoop's single latch terminator). We want the whole middle block to +  // appear to execute on this line because: (a) it is all compiler generated, +  // (b) these instructions are always executed after evaluating the latch +  // conditional branch, and (c) other passes may add new predecessors which +  // terminate on this line. This is the easiest way to ensure we don't +  // accidentally cause an extra step back into the loop while debugging. +  setDebugLocFromInst(Builder, LoopMiddleBlock->getTerminator());    for (unsigned Part = 1; Part < UF; ++Part) {      Value *RdxPart = VectorLoopValueMap.getVectorValue(LoopExitInst, Part);      if (Op != Instruction::ICmp && Op != Instruction::FCmp)  | 

