[llvm] [DebugInfo][ConstraintElimination] Fix debug value loss in replacing comparisons with the speculated constants (PR #136839)

Orlando Cazalet-Hyams via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 23 07:34:00 PDT 2025


================
@@ -1454,8 +1455,20 @@ static bool checkAndReplaceCondition(
       return ShouldReplace;
     });
     NumCondsRemoved++;
-    if (Cmp->use_empty())
+    if (Cmp->use_empty()) {
+      SmallVector<DbgVariableIntrinsic *> DbgUsers;
+      SmallVector<DbgVariableRecord *> DVRUsers;
+      findDbgUsers(DbgUsers, Cmp, &DVRUsers);
+
+      for (auto *DVR : DVRUsers) {
+        auto *DTN = DT.getNode(DVR->getParent());
+        if (!DTN || DTN->getDFSNumIn() < NumIn || DTN->getDFSNumOut() > NumOut)
+          continue;
+        DVR->replaceVariableLocationOp(Cmp, ConstantC);
----------------
OCHyams wrote:

The non-debug code also has a check that if the user comes before the ContextInst it's skipped. I think we probably need to copy that too?
```
; ModuleID = '/app/example.ll'
source_filename = "/app/example.ll"

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write)
declare void @llvm.assume(i1 noundef) #0

declare void @may_unwind()

declare void @use(i1)

define i1 @assume_single_bb_conditions_after_assume(i8 %a, i8 %b, i1 %c) !dbg !5 {
  %add.1 = add nuw nsw i8 %a, 1, !dbg !11
  %cmp.1 = icmp ule i8 %add.1, %b, !dbg !12
  %c.1 = icmp ule i8 %add.1, %b, !dbg !13
    #dbg_value(i1 %c.1, !9, !DIExpression(), !14)
  call void @use(i1 %c.1), !dbg !15
    #dbg_value(i1 %c.1, !9, !DIExpression(), !14)
  call void @may_unwind(), !dbg !16
    #dbg_value(i1 %c.1, !9, !DIExpression(), !14)
  call void @llvm.assume(i1 %cmp.1), !dbg !17
    #dbg_value(i1 %c.1, !9, !DIExpression(), !14)
  %t.2 = icmp ule i8 %a, %b, !dbg !14
    #dbg_value(i1 %c.1, !9, !DIExpression(), !14)
  %res.1 = xor i1 %c.1, %t.2, !dbg !18
  %add.2 = add nuw nsw i8 %a, 2, !dbg !19
  %c.2 = icmp ule i8 %add.2, %b, !dbg !20
  %res.2 = xor i1 %res.1, %c.2, !dbg !21
  ret i1 %res.2, !dbg !22
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) }

!llvm.dbg.cu = !{!0}
!llvm.debugify = !{!2, !3}
!llvm.module.flags = !{!4}

!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
!1 = !DIFile(filename: "/app/example.ll", directory: "/")
!2 = !{i32 12}
!3 = !{i32 8}
!4 = !{i32 2, !"Debug Info Version", i32 3}
!5 = distinct !DISubprogram(name: "assume_single_bb_conditions_after_assume", linkageName: "assume_single_bb_conditions_after_assume", scope: null, file: !1, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !8)
!6 = !DISubroutineType(types: !7)
!7 = !{}
!8 = !{!9}
!9 = !DILocalVariable(name: "4", scope: !5, file: !1, line: 7, type: !10)
!10 = !DIBasicType(name: "ty8", size: 8, encoding: DW_ATE_unsigned)
!11 = !DILocation(line: 1, column: 1, scope: !5)
!12 = !DILocation(line: 2, column: 1, scope: !5)
!13 = !DILocation(line: 3, column: 1, scope: !5)
!14 = !DILocation(line: 7, column: 1, scope: !5)
!15 = !DILocation(line: 4, column: 1, scope: !5)
!16 = !DILocation(line: 5, column: 1, scope: !5)
!17 = !DILocation(line: 6, column: 1, scope: !5)
!18 = !DILocation(line: 8, column: 1, scope: !5)
!19 = !DILocation(line: 9, column: 1, scope: !5)
!20 = !DILocation(line: 10, column: 1, scope: !5)
!21 = !DILocation(line: 11, column: 1, scope: !5)
!22 = !DILocation(line: 12, column: 1, scope: !5)
```

I think it's probably incorrect for the dbg_values to have their use replaced with `true` before the `assume`. Annoyingly, it looks like we won't be able to catch all dbg_values though (the 3rd one doesn't get updated because it comes before the ContextInst in that case... not sure there's much we can do about that?). IMO adding a comment with a FIXME noting the shortcoming is good enough here, if we can't think of something better.

(Can you add this as another regression test please?)

https://github.com/llvm/llvm-project/pull/136839


More information about the llvm-commits mailing list