diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index 1f97f0c1ac9975..6a406314f63c00 100644 --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -3355,6 +3355,12 @@ static bool TryToSinkInstruction(Instruction *I, BasicBlock *DestBlock) { I->moveBefore(&*InsertPos); ++NumSunkInst; + // Drop the debug loc of non-inlinable instructions. This prevents + // single-stepping from going backwards. See HowToUpdateDebugInfo.rst for + // the full rationale. + if (!isa(I)) + I->setDebugLoc(DebugLoc()); + // Also sink all related debug uses from the source basic block. Otherwise we // get debug use before the def. Attempt to salvage debug uses first, to // maximise the range variables have location for. If we cannot salvage, then diff --git a/llvm/test/Transforms/InstCombine/sink_to_unreachable_dbg.ll b/llvm/test/Transforms/InstCombine/sink_to_unreachable_dbg.ll new file mode 100644 index 00000000000000..e642276224b84c --- /dev/null +++ b/llvm/test/Transforms/InstCombine/sink_to_unreachable_dbg.ll @@ -0,0 +1,46 @@ +; RUN: opt -debugify -debugify-level=locations -instcombine -S < %s | FileCheck %s + +; CHECK-LABEL: @test1( +; CHECK: [[phi:%.*]] = phi i32 +; CHECK-NEXT: [[add:%.*]] = add i32 {{.*}}, 1{{$}} +; CHECK-NEXT: add i32 [[phi]], [[add]], !dbg +define i32 @test1(i32 %0, i1 %1) { + %3 = add i32 %0, 1 + br i1 %1, label %4, label %5 + +4: ; preds = %2 + br label %6 + +5: ; preds = %2 + br label %6 + +6: ; preds = %5, %4 + %7 = phi i32 [ 0, %4 ], [ 1, %5 ] + %8 = add i32 %7, %3 + ret i32 %8 +} + +; Function Attrs: nounwind readnone +declare i32 @external(i32) #0 + +; CHECK-LABEL: @test2( +; CHECK: [[phi:%.*]] = phi i32 +; CHECK-NEXT: [[add:%.*]] = call i32 @external(i32 {{.*}}), !dbg +; CHECK-NEXT: add i32 [[phi]], [[add]], !dbg +define i32 @test2(i32 %0, i1 %1) { + %3 = call i32 @external(i32 %0) + br i1 %1, label %4, label %5 + +4: ; preds = %2 + br label %6 + +5: ; preds = %2 + br label %6 + +6: ; preds = %5, %4 + %7 = phi i32 [ 0, %4 ], [ 1, %5 ] + %8 = add i32 %7, %3 + ret i32 %8 +} + +attributes #0 = { nounwind readnone }