Index: lib/Transforms/Instrumentation/GCOVProfiling.cpp =================================================================== --- lib/Transforms/Instrumentation/GCOVProfiling.cpp +++ lib/Transforms/Instrumentation/GCOVProfiling.cpp @@ -646,7 +646,7 @@ TerminatorInst *TI = BB.getTerminator(); int Successors = isa(TI) ? 1 : TI->getNumSuccessors(); if (Successors) { - if (Successors == 1) { + if (Successors == 1 && !isa(TI)) { IRBuilder<> Builder(&*BB.getFirstInsertionPt()); Value *Counter = Builder.CreateConstInBoundsGEP2_64(Counters, 0, Edge); @@ -680,13 +680,21 @@ GlobalVariable *EdgeState = getEdgeStateValue(); for (int i = 0, e = ComplexEdgePreds.size(); i != e; ++i) { - IRBuilder<> Builder(&*ComplexEdgePreds[i + 1]->getFirstInsertionPt()); + auto *BB = ComplexEdgePreds[i + 1]; + BasicBlock::iterator insertPtr = BB->getFirstInsertionPt(); + if (insertPtr == BB->end()) continue; + + IRBuilder<> Builder(&*insertPtr); Builder.CreateStore(Builder.getInt32(i), EdgeState); } for (int i = 0, e = ComplexEdgeSuccs.size(); i != e; ++i) { + auto *BB = ComplexEdgeSuccs[i + 1]; + BasicBlock::iterator insertPtr = BB->getFirstInsertionPt(); + if (insertPtr == BB->end()) continue; + // Call runtime to perform increment. - IRBuilder<> Builder(&*ComplexEdgeSuccs[i + 1]->getFirstInsertionPt()); + IRBuilder<> Builder(&*insertPtr); Value *CounterPtrArray = Builder.CreateConstInBoundsGEP2_64(EdgeTable, 0, i * ComplexEdgePreds.size()); @@ -764,7 +772,7 @@ for (BasicBlock &BB : *F) { TerminatorInst *TI = BB.getTerminator(); int Successors = isa(TI) ? 1 : TI->getNumSuccessors(); - if (Successors > 1 && !isa(TI) && !isa(TI)) { + if ((Successors > 1 && !isa(TI)) || isa(TI)) { for (int i = 0; i != Successors; ++i) { BasicBlock *Succ = TI->getSuccessor(i); IRBuilder<> Builder(Succ);