Index: lib/Transforms/Utils/AddDiscriminators.cpp =================================================================== --- lib/Transforms/Utils/AddDiscriminators.cpp +++ lib/Transforms/Utils/AddDiscriminators.cpp @@ -70,14 +70,14 @@ #define DEBUG_TYPE "add-discriminators" namespace { - struct AddDiscriminators : public FunctionPass { - static char ID; // Pass identification, replacement for typeid - AddDiscriminators() : FunctionPass(ID) { - initializeAddDiscriminatorsPass(*PassRegistry::getPassRegistry()); - } +struct AddDiscriminators : public FunctionPass { + static char ID; // Pass identification, replacement for typeid + AddDiscriminators() : FunctionPass(ID) { + initializeAddDiscriminatorsPass(*PassRegistry::getPassRegistry()); + } - bool runOnFunction(Function &F) override; - }; + bool runOnFunction(Function &F) override; +}; } char AddDiscriminators::ID = 0; @@ -89,9 +89,9 @@ // Command line option to disable discriminator generation even in the // presence of debug information. This is only needed when debugging // debug info generation issues. -static cl::opt -NoDiscriminators("no-discriminators", cl::init(false), - cl::desc("Disable generation of discriminator information.")); +static cl::opt NoDiscriminators( + "no-discriminators", cl::init(false), + cl::desc("Disable generation of discriminator information.")); FunctionPass *llvm::createAddDiscriminatorsPass() { return new AddDiscriminators(); @@ -159,8 +159,7 @@ // Simlarly, if the function has no debug info, do nothing. // Finally, if this module is built with dwarf versions earlier than 4, // do nothing (discriminator support is a DWARF 4 feature). - if (NoDiscriminators || - !hasDebugInfo(F) || + if (NoDiscriminators || !hasDebugInfo(F) || F.getParent()->getDwarfVersion() < 4) return false; @@ -181,7 +180,7 @@ BasicBlock *Succ = Last->getSuccessor(I); Instruction *First = Succ->getFirstNonPHIOrDbgOrLifetime(); const DILocation *FirstDIL = First->getDebugLoc(); - if (!FirstDIL) + if (!FirstDIL || FirstDIL->getDiscriminator()) continue; // If the first instruction (First) of Succ is at the same file @@ -212,12 +211,17 @@ // instruction following First that shares the same location. for (BasicBlock::iterator I1(*First), E1 = Succ->end(); I1 != E1; ++I1) { - if (I1->getDebugLoc().get() != FirstDIL) - break; - I1->setDebugLoc(newDebugLoc); - DEBUG(dbgs() << NewDIL->getFilename() << ":" << NewDIL->getLine() - << ":" << NewDIL->getColumn() << ":" - << NewDIL->getDiscriminator() << *I1 << "\n"); + const DILocation *CurrentDIL = I1->getDebugLoc(); + if (CurrentDIL && CurrentDIL->getLine() == FirstDIL->getLine() && + CurrentDIL->getFilename() == FirstDIL->getFilename()) { + I1->setDebugLoc(DILocation::get(Ctx, CurrentDIL->getLine(), + CurrentDIL->getColumn(), NewScope, + CurrentDIL->getInlinedAt())); + DEBUG(dbgs() << CurrentDIL->getFilename() << ":" + << CurrentDIL->getLine() << ":" + << CurrentDIL->getColumn() << ":" + << NewDIL->getDiscriminator() << *I1 << "\n"); + } } DEBUG(dbgs() << "\n"); Changed = true; Index: test/Transforms/AddDiscriminators/oneline.ll =================================================================== --- /dev/null +++ test/Transforms/AddDiscriminators/oneline.ll @@ -0,0 +1,88 @@ +; RUN: opt < %s -add-discriminators -S | FileCheck %s + +define i32 @_Z3fooi(i32 %i) #0 { + %1 = alloca i32, align 4 + %2 = alloca i32, align 4 + store i32 %i, i32* %2, align 4, !tbaa !13 + call void @llvm.dbg.declare(metadata i32* %2, metadata !9, metadata !17), !dbg !18 + %3 = load i32, i32* %2, align 4, !dbg !19, !tbaa !13 + %4 = icmp eq i32 %3, 3, !dbg !21 + br i1 %4, label %8, label %5, !dbg !22 + +;