https://bugs.llvm.org/show_bug.cgi?id=39866

            Bug ID: 39866
           Summary: [DebugInfo@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: [email protected]
          Reporter: [email protected]
                CC: [email protected], [email protected],
                    [email protected],
                    [email protected], [email protected]
            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.

-------->8--------
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

isoneb:
  store i32 1, i32 *%otherptr
  ret i32 1

cont1:
  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

istwob:
  store i32 2, i32 *%otherptr
  ret i32 2

cont2:
  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:
!2)
!6 = !DILocation(line: 0, scope: !5)
--------8<--------

[0]
https://github.com/llvm-mirror/clang/blob/aa528ab4a083268edddd038d0f251afe792cfa36/lib/Sema/SemaOpenMP.cpp#L9694


Referenced Bugs:

https://bugs.llvm.org/show_bug.cgi?id=38754
[Bug 38754] [DebugInfo@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.
_______________________________________________
llvm-bugs mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to