mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 02:52:53 +02:00
b7840ddf08
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
127 lines
6.3 KiB
LLVM
127 lines
6.3 KiB
LLVM
; 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)
|