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
This commit is contained in:
Vedant Kumar 2019-11-21 13:53:10 -08:00
parent bb2e010798
commit b7840ddf08
2 changed files with 127 additions and 1 deletions

View File

@ -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;

View File

@ -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();
; }
; }
@b = common dso_local local_unnamed_addr global i8 0, align 1, !dbg !0
@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)