Index: llvm/trunk/lib/Transforms/Scalar/GVN.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/GVN.cpp +++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp @@ -46,6 +46,7 @@ #include "llvm/IR/Constant.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DataLayout.h" +#include "llvm/IR/DebugInfoMetadata.h" #include "llvm/IR/DebugLoc.h" #include "llvm/IR/Dominators.h" #include "llvm/IR/Function.h" @@ -1206,9 +1207,8 @@ // Instructions that have been inserted in predecessor(s) to materialize // the load address do not retain their original debug locations. Doing // so could lead to confusing (but correct) source attributions. - // FIXME: How do we retain source locations without causing poor debugging - // behavior? - I->setDebugLoc(DebugLoc()); + if (const DebugLoc &DL = I->getDebugLoc()) + I->setDebugLoc(DebugLoc::get(0, 0, DL.getScope(), DL.getInlinedAt())); // FIXME: We really _ought_ to insert these value numbers into their // parent's availability map. However, in doing so, we risk getting into Index: llvm/trunk/lib/Transforms/Scalar/LICM.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/LICM.cpp +++ llvm/trunk/lib/Transforms/Scalar/LICM.cpp @@ -54,6 +54,7 @@ #include "llvm/IR/CFG.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DataLayout.h" +#include "llvm/IR/DebugInfoMetadata.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Dominators.h" #include "llvm/IR/Instructions.h" @@ -1652,13 +1653,10 @@ // Move the new node to the destination block, before its terminator. moveInstructionBefore(I, *Dest->getTerminator(), *SafetyInfo, MSSAU); - // Do not retain debug locations when we are moving instructions to different - // basic blocks, because we want to avoid jumpy line tables. Calls, however, - // need to retain their debug locs because they may be inlined. - // FIXME: How do we retain source locations without causing poor debugging - // behavior? - if (!isa(I)) - I.setDebugLoc(DebugLoc()); + // Apply line 0 debug locations when we are moving instructions to different + // basic blocks because we want to avoid jumpy line tables. + if (const DebugLoc &DL = I.getDebugLoc()) + I.setDebugLoc(DebugLoc::get(0, 0, DL.getScope(), DL.getInlinedAt())); if (isa(I)) ++NumMovedLoads; Index: llvm/trunk/test/DebugInfo/Generic/licm-hoist-debug-loc.ll =================================================================== --- llvm/trunk/test/DebugInfo/Generic/licm-hoist-debug-loc.ll +++ llvm/trunk/test/DebugInfo/Generic/licm-hoist-debug-loc.ll @@ -18,8 +18,9 @@ ; We make sure that the instruction that is hoisted into the preheader ; does not have a debug location. ; CHECK: for.body.lr.ph: -; CHECK: getelementptr{{.*}}%p.addr, i64 4{{$}} +; CHECK: getelementptr{{.*}}%p.addr, i64 4{{.*}} !dbg [[zero:![0-9]+]] ; CHECK: for.body: +; CHECK: [[zero]] = !DILocation(line: 0 ; ; ModuleID = 't.ll' source_filename = "test.c" Index: llvm/trunk/test/Transforms/GVN/PRE/phi-translate.ll =================================================================== --- llvm/trunk/test/Transforms/GVN/PRE/phi-translate.ll +++ llvm/trunk/test/Transforms/GVN/PRE/phi-translate.ll @@ -4,8 +4,8 @@ ; CHECK-LABEL: @foo( ; CHECK: entry.end_crit_edge: -; CHECK: %[[INDEX:[a-z0-9.]+]] = sext i32 %x to i64{{$}} -; CHECK: %[[ADDRESS:[a-z0-9.]+]] = getelementptr [100 x i32], [100 x i32]* @G, i64 0, i64 %[[INDEX]]{{$}} +; CHECK: %[[INDEX:[a-z0-9.]+]] = sext i32 %x to i64{{.*}} !dbg [[ZERO_LOC:![0-9]+]] +; CHECK: %[[ADDRESS:[a-z0-9.]+]] = getelementptr [100 x i32], [100 x i32]* @G, i64 0, i64 %[[INDEX]]{{.*}} !dbg [[ZERO_LOC]] ; CHECK: %n.pre = load i32, i32* %[[ADDRESS]], !dbg [[N_LOC:![0-9]+]] ; CHECK: br label %end ; CHECK: then: @@ -14,7 +14,8 @@ ; CHECK: %n = phi i32 [ %n.pre, %entry.end_crit_edge ], [ %z, %then ], !dbg [[N_LOC]] ; CHECK: ret i32 %n -; CHECK: [[N_LOC]] = !DILocation(line: 47, column: 1, scope: !{{.*}}) +; CHECK-DAG: [[N_LOC]] = !DILocation(line: 47, column: 1, scope: !{{.*}}) +; CHECK-DAG: [[ZERO_LOC]] = !DILocation(line: 0 @G = external global [100 x i32] define i32 @foo(i32 %x, i32 %z) !dbg !6 {