[llvm-bugs] [Bug 39866] New: [DebugInfo at O2] icmp-eq-chain to switch optimisation drops dbg.values

via llvm-bugs llvm-bugs at lists.llvm.org
Mon Dec 3 07:11:40 PST 2018


            Bug ID: 39866
           Summary: [DebugInfo at O2] icmp-eq-chain to switch optimisation
                    drops dbg.values
           Product: libraries
           Version: 6.0
          Hardware: PC
                OS: Linux
            Status: CONFIRMED
          Keywords: wrong-debug
          Severity: normal
          Priority: P
         Component: Scalar Optimizations
          Assignee: unassignedbugs at nondot.org
          Reporter: jeremy.morse.llvm at gmail.com
                CC: chackz0x12 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

The dbg.value in the code below is dropped when run through simplifycfg:

    opt-6.0 < test.ll -simplifycfg -S

in any recent version of LLVM. It's relatively easy to understand: chains of
equality comparisons are converted into being a switch statement. However, any
debug metadata on the path from the first comparison to any of the leafs gets
dropped, because the switch statement point at the leafs and nothing is
salvaged from the intermediate blocks. Thus, if you put that dbg.value in any
block other than 'cont1' below, it survives to output.

The example is contrived (and the DebugInfo cooked), but IMHO we can easily do
better by replicating intervening dbg.value's into the leaf blocks.

Context: this is another bug seen when investigating bug 38754. Conditional
code like this [0] (and line 9688) gets converted to being a switch, and the
dbg.value's of the casted expression usually get shifted to an earlier block by
placeDbgValues. When left in the correct place (in the 'if' condition) a
condition similar to the example below occur.

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

define i32 @lala(i32 *%ptr, i32 *%otherptr) {
  %val = load i32, i32 *%ptr
  %isone = icmp eq i32 %val, 1
  br i1 %isone, label %isoneb, label %cont1

  store i32 1, i32 *%otherptr
  ret i32 1

  call void @llvm.dbg.value(metadata i32 %val, metadata !1, metadata
!DIExpression()), !dbg !6
  %istwo = icmp eq i32 %val, 2
  br i1 %istwo, label %istwob, label %cont2

  store i32 2, i32 *%otherptr
  ret i32 2

  ret i32 3

!llvm.module.flags = !{!4}
!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
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/20181203/95d36b44/attachment-0001.html>

More information about the llvm-bugs mailing list