summaryrefslogtreecommitdiffstats
path: root/llvm/test/DebugInfo/X86/live-debug-values-remove-range.ll
diff options
context:
space:
mode:
authorJeremy Morse <jeremy.morse.llvm@gmail.com>2019-08-29 10:53:29 +0000
committerJeremy Morse <jeremy.morse.llvm@gmail.com>2019-08-29 10:53:29 +0000
commit313d2ce999321e69bc3679b04ebe27ebf4346ef8 (patch)
treef50ca6f14722bfd776c9a136d533834379b27b64 /llvm/test/DebugInfo/X86/live-debug-values-remove-range.ll
parentcc7495a3556c142bd7250ff184515319815d77ef (diff)
downloadbcm5719-llvm-313d2ce999321e69bc3679b04ebe27ebf4346ef8.tar.gz
bcm5719-llvm-313d2ce999321e69bc3679b04ebe27ebf4346ef8.zip
[DebugInfo] LiveDebugValues should always revisit backedges if it skips them
The "join" method in LiveDebugValues does not attempt to join unseen predecessor blocks if their out-locations aren't yet initialized, instead the block should be re-visited later to see if any locations have changed validity. However, because the set of blocks were all being "process"'d once before "join" saw them, that logic in "join" was actually ignoring legitimate out-locations on the first pass through. This meant that some invalidated locations were not removed from the head of loops, allowing illegal locations to persist. Fix this by removing the run of "process" before the main join/process loop in ExtendRanges. Now the unseen predecessors that "join" skips truly are uninitialized, and we come back to the block at a later time to re-run "join", see the @baz function added. This also fixes another fault where stack/register transfers in the entry block (or any other before-any-loop-block) had their tranfers initially ignored, and were then never revisited. The MIR test added tests for this behaviour. XFail a test that exposes another bug; a fix for this is coming in D66895. Differential Revision: https://reviews.llvm.org/D66663 llvm-svn: 370328
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.ll69
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}
OpenPOWER on IntegriCloud