diff options
Diffstat (limited to 'llvm/test/DebugInfo/X86/live-debug-values-remove-range.ll')
-rw-r--r-- | llvm/test/DebugInfo/X86/live-debug-values-remove-range.ll | 69 |
1 files changed, 67 insertions, 2 deletions
diff --git a/llvm/test/DebugInfo/X86/live-debug-values-remove-range.ll b/llvm/test/DebugInfo/X86/live-debug-values-remove-range.ll index 3d5219e74c1..6fec3f8150e 100644 --- a/llvm/test/DebugInfo/X86/live-debug-values-remove-range.ll +++ b/llvm/test/DebugInfo/X86/live-debug-values-remove-range.ll @@ -5,12 +5,43 @@ ; know the location of "toast" at the start of the %loop block. Test that no ; location is given until after the call to @booler. ; -; CHECK: ![[VARNUM:[0-9]+]] = !DILocalVariable(name: "toast" +; Second function @baz added with an even tighter loop -- this tests different +; code-paths through LiveDebugValues. Any blocks with an incoming backedge need +; reconsideration after the parent of the backedge has had its OutLocs +; initialized, even if OutLocs hasn't changed. ; +; Third function @quux tests that we don't delete too many variable locations. +; A variable that is live across the body of the loop should maintain its +; location across that loop, and not be invalidated. +; +; CHECK: ![[FOOVARNUM:[0-9]+]] = !DILocalVariable(name: "toast" +; CHECK: ![[BAZVARNUM:[0-9]+]] = !DILocalVariable(name: "crumpets" +; CHECK: ![[QUUXVARNUM:[0-9]+]] = !DILocalVariable(name: "teacake" +; +; foo tests +; CHECK-LABEL: bb.1.loop +; CHECK-NOT: DBG_VALUE +; CHECK-LABEL: CALL64pcrel32 @booler +; CHECK: DBG_VALUE 0, $noreg, ![[FOOVARNUM]] +; +; baz tests +; CHECK-LABEL: name: baz ; CHECK-LABEL: bb.1.loop ; CHECK-NOT: DBG_VALUE ; CHECK-LABEL: CALL64pcrel32 @booler -; CHECK: DBG_VALUE 0, $noreg, ![[VARNUM]] +; CHECK: DBG_VALUE 0, $noreg, ![[BAZVARNUM]] +; +; quux tests -- the variable arrives in $edi, should get a non-undef location +; before the loop, and its position re-stated in each block. +; CHECK-LABEL: name: quux +; CHECK: DBG_VALUE $edi, $noreg, ![[QUUXVARNUM]] +; CHECK: DBG_VALUE [[QUUXLOC:[a-zA-Z0-9$_]+]], $noreg, ![[QUUXVARNUM]] +; CHECK-LABEL: bb.1.loop +; CHECK: DBG_VALUE [[QUUXLOC]], $noreg, ![[QUUXVARNUM]] +; CHECK-NOT: DBG_VALUE $noreg +; CHECK-LABEL: bb.2.exit +; CHECK: DBG_VALUE [[QUUXLOC]], $noreg, ![[QUUXVARNUM]] +; CHECK-NOT: DBG_VALUE $noreg declare i1 @booler() declare void @escape(i32) @@ -33,6 +64,32 @@ exit: ret i32 %bar } +define i32 @baz(i32 %bar) !dbg !104 { +entry: + call void @llvm.dbg.value(metadata i32 %bar, metadata !103, metadata !DIExpression()), !dbg !106 + br label %loop +loop: + call void @escape(i32 %bar) + %retval = call i1 @booler(), !dbg !106 + call void @llvm.dbg.value(metadata i32 0, metadata !103, metadata !DIExpression()), !dbg !106 + br i1 %retval, label %loop, label %exit +exit: + ret i32 %bar +} + +define i32 @quux(i32 %bar) !dbg !204 { +entry: + ; %bar will be placed in a nonvolatile or spill location for the loop, + ; before being returned later. + call void @llvm.dbg.value(metadata i32 %bar, metadata !203, metadata !DIExpression()), !dbg !206 + br label %loop +loop: + %retval = call i1 @booler(), !dbg !206 + br i1 %retval, label %loop, label %exit +exit: + ret i32 %bar +} + !llvm.module.flags = !{!0, !100} !llvm.dbg.cu = !{!1} @@ -47,3 +104,11 @@ exit: !14 = !DISubroutineType(types: !15) !15 = !{!16} !16 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed) +!103 = !DILocalVariable(name: "crumpets", scope: !104, file: !2, line: 1, type: !16) +!104 = distinct !DISubprogram(name: "ribbit", scope: !2, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !113, type: !14, isDefinition: true) +!106 = !DILocation(line: 1, scope: !104) +!113 = !{!103} +!203 = !DILocalVariable(name: "teacake", scope: !204, file: !2, line: 1, type: !16) +!204 = distinct !DISubprogram(name: "toad", scope: !2, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !113, type: !14, isDefinition: true) +!206 = !DILocation(line: 1, scope: !204) +!213 = !{!203} |