[llvm] 844d97f - Clang-trunk Generates Wrong Debug values with -O1

Vedant Kumar via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 21 14:04:52 PST 2019


Author: Vedant Kumar
Date: 2019-11-21T13:53:10-08:00
New Revision: 844d97f650a2d716e63e3be903c32a82f2f817b1

URL: https://github.com/llvm/llvm-project/commit/844d97f650a2d716e63e3be903c32a82f2f817b1
DIFF: https://github.com/llvm/llvm-project/commit/844d97f650a2d716e63e3be903c32a82f2f817b1.diff

LOG: Clang-trunk Generates Wrong Debug values with -O1

Bit-Tracking Dead Code Elimination (bdce) do not mark dbg.value as undef after
deleting instruction.  which shows invalid state of variable in debugger.  This
patches fixes this by marking the dbg.value as undef which depends on dead
instruction.

This fixes https://bugs.llvm.org/show_bug.cgi?id=41925

Patch by kamlesh kumar!

Differential Revision: https://reviews.llvm.org/D70040

Added: 
    llvm/test/Transforms/BDCE/pr41925.ll

Modified: 
    llvm/lib/Transforms/Scalar/BDCE.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Scalar/BDCE.cpp b/llvm/lib/Transforms/Scalar/BDCE.cpp
index c22ea0b8271e..0fa38fa80b17 100644
--- a/llvm/lib/Transforms/Scalar/BDCE.cpp
+++ b/llvm/lib/Transforms/Scalar/BDCE.cpp
@@ -102,7 +102,7 @@ static bool bitTrackingDCE(Function &F, DemandedBits &DB) {
         (I.getType()->isIntOrIntVectorTy() &&
          DB.getDemandedBits(&I).isNullValue() &&
          wouldInstructionBeTriviallyDead(&I))) {
-      salvageDebugInfo(I);
+      salvageDebugInfoOrMarkUndef(I);
       Worklist.push_back(&I);
       I.dropAllReferences();
       Changed = true;

diff  --git a/llvm/test/Transforms/BDCE/pr41925.ll b/llvm/test/Transforms/BDCE/pr41925.ll
new file mode 100644
index 000000000000..0b7d03df62b1
--- /dev/null
+++ b/llvm/test/Transforms/BDCE/pr41925.ll
@@ -0,0 +1,126 @@
+; Check for setting dbg.value undef which depends on instruction which is going to be dead
+; RUN: opt -bdce %s -S | FileCheck %s
+
+; Generated from this
+; char a, b;
+; void optimize_me_not();
+; int main() {
+;  char l_177 = 2;
+;  for (; b <= 0; b++)
+;    for (; a >= 0; a--) {
+;      ++l_177;
+;      optimize_me_not();
+;    }
+; }
+
+ at b = common dso_local local_unnamed_addr global i8 0, align 1, !dbg !0
+ at a = common dso_local local_unnamed_addr global i8 0, align 1, !dbg !6
+
+define dso_local i32 @main() local_unnamed_addr !dbg !13 {
+entry:
+;CHECK: call void @llvm.dbg.value(metadata i8 2
+;CHECK: call void @llvm.dbg.value(metadata i8 2
+  call void @llvm.dbg.value(metadata i8 2, metadata !17, metadata !DIExpression()), !dbg !18
+  %.pr = load i8, i8* @b, align 1, !dbg !19
+  call void @llvm.dbg.value(metadata i8 2, metadata !17, metadata !DIExpression()), !dbg !18
+  %cmp5 = icmp slt i8 %.pr, 1, !dbg !22
+  br i1 %cmp5, label %for.cond2thread-pre-split.preheader, label %for.end9, !dbg !23
+
+for.cond2thread-pre-split.preheader:              ; preds = %entry
+  br label %for.cond2thread-pre-split, !dbg !23
+for.cond2thread-pre-split:                        ; preds = %for.cond2thread-pre-split.preheader, %for.inc7
+;CHECK: call void @llvm.dbg.value(metadata i8 undef
+  %l_177.06 = phi i8 [ %l_177.1.lcssa, %for.inc7 ], [ 2, %for.cond2thread-pre-split.preheader ]
+  call void @llvm.dbg.value(metadata i8 %l_177.06, metadata !17, metadata !DIExpression()), !dbg !18
+;CHECK: call void @llvm.dbg.value(metadata i8 undef
+  %.pr1 = load i8, i8* @a, align 1, !dbg !24
+  call void @llvm.dbg.value(metadata i8 %l_177.06, metadata !17, metadata !DIExpression()), !dbg !18
+  %cmp42 = icmp sgt i8 %.pr1, -1, !dbg !27
+  br i1 %cmp42, label %for.body6.preheader, label %for.inc7, !dbg !28
+
+for.body6.preheader:                              ; preds = %for.cond2thread-pre-split
+  br label %for.body6, !dbg !28
+
+for.body6:                                        ; preds = %for.body6.preheader, %for.body6
+;CHECK: call void @llvm.dbg.value(metadata i8 undef
+;CHECK: call void @llvm.dbg.value(metadata i8 undef
+  %l_177.13 = phi i8 [ %inc, %for.body6 ], [ %l_177.06, %for.body6.preheader ]
+  call void @llvm.dbg.value(metadata i8 %l_177.13, metadata !17, metadata !DIExpression()), !dbg !18
+  call void @llvm.dbg.value(metadata i8 %l_177.13, metadata !17, metadata !DIExpression(DW_OP_plus_uconst, 1, DW_OP_stack_value)), !dbg !18
+  tail call void (...) @optimize_me_not(),  !dbg !29
+  %inc = add i8 %l_177.13, 1, !dbg !31
+  %0 = load i8, i8* @a, align 1, !dbg !32
+  %dec = add i8 %0, -1, !dbg !32
+  store i8 %dec, i8* @a, align 1, !dbg !32
+  call void @llvm.dbg.value(metadata i8 %inc, metadata !17, metadata !DIExpression()), !dbg !18
+  %cmp4 = icmp sgt i8 %dec, -1, !dbg !27
+  br i1 %cmp4, label %for.body6, label %for.inc7.loopexit, !dbg !28, !llvm.loop !33
+
+for.inc7.loopexit:                                ; preds = %for.body6
+  %inc.lcssa = phi i8 [ %inc, %for.body6 ], !dbg !31
+  br label %for.inc7, !dbg !35
+
+for.inc7:                                         ; preds = %for.inc7.loopexit, %for.cond2thread-pre-split
+;CHECK: call void @llvm.dbg.value(metadata i8 undef
+  %l_177.1.lcssa = phi i8 [ %l_177.06, %for.cond2thread-pre-split ], [ %inc.lcssa, %for.inc7.loopexit ], !dbg !18
+  %1 = load i8, i8* @b, align 1, !dbg !35
+  %inc8 = add i8 %1, 1, !dbg !35
+  store i8 %inc8, i8* @b, align 1, !dbg !35
+  call void @llvm.dbg.value(metadata i8 %l_177.1.lcssa, metadata !17, metadata !DIExpression()), !dbg !18
+  %cmp = icmp slt i8 %inc8, 1, !dbg !22
+  br i1 %cmp, label %for.cond2thread-pre-split, label %for.end9.loopexit, !dbg !23, !llvm.loop !36
+
+for.end9.loopexit:                                ; preds = %for.inc7
+  br label %for.end9, !dbg !38
+
+for.end9:                                         ; preds = %for.end9.loopexit, %entry
+  ret i32 0, !dbg !38
+}
+
+declare dso_local void @optimize_me_not(...) local_unnamed_addr 
+
+declare void @llvm.dbg.value(metadata, metadata, metadata)
+
+!llvm.dbg.cu = !{!2}
+!llvm.module.flags = !{!9, !10, !11}
+!llvm.ident = !{!12}
+
+!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
+!1 = distinct !DIGlobalVariable(name: "b", scope: !2, file: !3, line: 3, type: !8, isLocal: false, isDefinition: true)
+!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, producer: "clang version 10.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5, nameTableKind: None)
+!3 = !DIFile(filename: "test", directory: "test")
+!4 = !{}
+!5 = !{!6, !0}
+!6 = !DIGlobalVariableExpression(var: !7, expr: !DIExpression())
+!7 = distinct !DIGlobalVariable(name: "a", scope: !2, file: !3, line: 3, type: !8, isLocal: false, isDefinition: true)
+!8 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)
+!9 = !{i32 2, !"Dwarf Version", i32 4}
+!10 = !{i32 2, !"Debug Info Version", i32 3}
+!11 = !{i32 1, !"wchar_size", i32 4}
+!12 = !{!"clang version 10.0.0"}
+!13 = distinct !DISubprogram(name: "main", scope: !3, file: !3, line: 4, type: !14, scopeLine: 4, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !4)
+!14 = !DISubroutineType(types: !15)
+!15 = !{!16}
+!16 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
+!17 = !DILocalVariable(name: "l_177", scope: !13, file: !3, line: 5, type: !8)
+!18 = !DILocation(line: 0, scope: !13)
+!19 = !DILocation(line: 6, column: 10, scope: !20)
+!20 = distinct !DILexicalBlock(scope: !21, file: !3, line: 6, column: 3)
+!21 = distinct !DILexicalBlock(scope: !13, file: !3, line: 6, column: 3)
+!22 = !DILocation(line: 6, column: 12, scope: !20)
+!23 = !DILocation(line: 6, column: 3, scope: !21)
+!24 = !DILocation(line: 7, column: 12, scope: !25)
+!25 = distinct !DILexicalBlock(scope: !26, file: !3, line: 7, column: 5)
+!26 = distinct !DILexicalBlock(scope: !20, file: !3, line: 7, column: 5)
+!27 = !DILocation(line: 7, column: 14, scope: !25)
+!28 = !DILocation(line: 7, column: 5, scope: !26)
+!29 = !DILocation(line: 9, column: 7, scope: !30)
+!30 = distinct !DILexicalBlock(scope: !25, file: !3, line: 7, column: 25)
+!31 = !DILocation(line: 8, column: 7, scope: !30)
+!32 = !DILocation(line: 7, column: 21, scope: !25)
+!33 = distinct !{!33, !28, !34}
+!34 = !DILocation(line: 10, column: 5, scope: !26)
+!35 = !DILocation(line: 6, column: 19, scope: !20)
+!36 = distinct !{!36, !23, !37}
+!37 = !DILocation(line: 10, column: 5, scope: !21)
+!38 = !DILocation(line: 11, column: 1, scope: !13)


        


More information about the llvm-commits mailing list