[PATCH] D82487: [InstCombine] Drop debug loc in TryToSinkInstruction

Vedant Kumar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 24 11:55:51 PDT 2020


vsk created this revision.
vsk added reviewers: aprantl, davide.
Herald added a subscriber: hiraditya.
Herald added a project: LLVM.

The advice in HowToUpdateDebugInfo.rst is to "... preserve the debug
location of an instruction if the instruction either remains in its
basic block, or if its basic block is folded into a predecessor that
branches unconditionally".

TryToSinkInstruction doesn't seem to satisfy the criteria as it's
sinking an instruction to some successor block. Preserving the debug loc
can make single-stepping appear to go backwards, or make a breakpoint
hit on that location happen "too late" (since single-stepping from that
breakpoint can cause the function to return unexpectedly).

So, drop the debug location.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D82487

Files:
  llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
  llvm/test/Transforms/InstCombine/sink_to_unreachable_dbg.ll


Index: llvm/test/Transforms/InstCombine/sink_to_unreachable_dbg.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/InstCombine/sink_to_unreachable_dbg.ll
@@ -0,0 +1,42 @@
+; RUN: opt -instcombine -S < %s | FileCheck %s
+
+; CHECK-LABEL: @test(
+; CHECK: [[phi:%.*]] = phi i32
+; CHECK-NEXT: [[add:%.*]] = add i32 %x, 1{{$}}
+; CHECK-NEXT: add i32 [[phi]], [[add]], !dbg
+define i32 @test(i32 %x, i1 %c) !dbg !6 {
+bb0:
+  %a = add i32 %x, 1, !dbg !8
+  br i1 %c, label %bb1, label %bb2, !dbg !9
+
+bb1:                                              ; preds = %bb0
+  br label %bb3, !dbg !10
+
+bb2:                                              ; preds = %bb0
+  br label %bb3, !dbg !11
+
+bb3:                                              ; preds = %bb2, %bb1
+  %p = phi i32 [ 0, %bb1 ], [ 1, %bb2 ], !dbg !12
+  %r = add i32 %p, %a, !dbg !13
+  ret i32 %r, !dbg !14
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.debugify = !{!3, !4}
+!llvm.module.flags = !{!5}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "sink_to_unreachable_dbg.ll", directory: "/")
+!2 = !{}
+!3 = !{i32 7}
+!4 = !{i32 0}
+!5 = !{i32 2, !"Debug Info Version", i32 3}
+!6 = distinct !DISubprogram(name: "test", linkageName: "test", scope: null, file: !1, line: 1, type: !7, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
+!7 = !DISubroutineType(types: !2)
+!8 = !DILocation(line: 1, column: 1, scope: !6)
+!9 = !DILocation(line: 2, column: 1, scope: !6)
+!10 = !DILocation(line: 3, column: 2, scope: !6)
+!11 = !DILocation(line: 4, column: 3, scope: !6)
+!12 = !DILocation(line: 5, column: 4, scope: !6)
+!13 = !DILocation(line: 6, column: 4, scope: !6)
+!14 = !DILocation(line: 7, column: 4, scope: !6)
Index: llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+++ llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -3355,6 +3355,9 @@
   I->moveBefore(&*InsertPos);
   ++NumSunkInst;
 
+  // Drop the debug loc. This prevents single-stepping from going backwards.
+  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


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D82487.273115.patch
Type: text/x-patch
Size: 2580 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200624/e487d19a/attachment.bin>


More information about the llvm-commits mailing list