[llvm-bugs] [Bug 39940] New: [DebugInfo at O2] CodeGenPrepare address-mode sinking limits dbg.value validity

via llvm-bugs llvm-bugs at lists.llvm.org
Mon Dec 10 12:40:31 PST 2018


            Bug ID: 39940
           Summary: [DebugInfo at O2] CodeGenPrepare address-mode sinking
                    limits dbg.value validity
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Keywords: wrong-debug
          Severity: normal
          Priority: P
         Component: Scalar Optimizations
          Assignee: jeremy.morse.llvm at gmail.com
          Reporter: jeremy.morse.llvm at gmail.com
                CC: chackz0x12 at gmail.com, dblaikie at gmail.com,
                    greg.bedwell at sony.com,
                    international.phantom at gmail.com,
                    llvm-bugs at lists.llvm.org, paul.robinson at am.sony.com
            Blocks: 38754, 38768

In the code below, CodeGenPrepare duplicates the GEP calculating the %bees
pointer and sinks the copy into the "next:" block. This is fine, and is
designed to allow the address calculations to be folded into a machine
addressing mode. The dbg.value for %bees is left in a BB where there are no
other uses of %bees, and normally CodeGenPrepare's placeDbgValues would move
the dbg.value into the earlier BB to avoid limitations in SelectionDAG.

However, as explored in bug 38754, this isn't a good solution, and causes the
appearance of variables to the developer to be re-ordered in the debugger. When
placeDbgValues is turned off, the dbg.value stays in the later BB. Then in
SelectionDAG, because %bees isn't used outside of the first BB, no VReg is
allocated to it, and there's no way to turn the dbg.value into a legal
DBG_VALUE. The dbg.value is subsequently dropped.

I've been using the latest trunk (r348754) and have been running "llc
-stop-after=codegenprepare". The fix seems obvious (update debug users in
CodeGenPrepare::optimizeMemoryInst) however it's not clear whether a fix can be
tested if it depends on placeDbgValues being disabled.

declare void @llvm.dbg.value(metadata, metadata, metadata)

define i32 @lala(i32 *%ptr, i1 %arg) {
  %bees = getelementptr i32, i32* %ptr, i32 4
  %loaded = load i32, i32 *%bees
  br i1 %arg, label %next, label %face

  call void @llvm.dbg.value(metadata i32 *%bees, metadata !1, metadata
!DIExpression()), !dbg !6
  store i32 1, i32 *%bees
  ret i32 1

  ret i32 0

!llvm.module.flags = !{!4}
!llvm.dbg.cu = !{!2}
!1 = !DILocalVariable(name: "bees", scope: !5, type: null)
!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer:
"beards", isOptimized: true, runtimeVersion: 4, emissionKind: FullDebug)
!3 = !DIFile(filename: "bees.cpp", directory: "")
!4 = !{i32 2, !"Debug Info Version", i32 3}
!5 = distinct !DISubprogram(name: "nope", scope: !2, file: !3, line: 1, unit:
!6 = !DILocation(line: 0, scope: !5)

Referenced Bugs:

[Bug 38754] [DebugInfo at O2][Dexter] Illegal value appears in variable when
conditional blocks folded
[Bug 38768] [meta][DebugInfo] Umbrella bug for poor debug experiences
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20181210/7d42a179/attachment.html>

More information about the llvm-bugs mailing list