[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
https://bugs.llvm.org/show_bug.cgi?id=39866
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.
-------->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 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