Open Quuxplusone opened 4 years ago
Bugzilla Link | PR46009 |
Status | CONFIRMED |
Importance | P enhancement |
Reported by | Luca Massarelli (massarelli@diag.uniroma1.it) |
Reported on | 2020-05-20 09:02:59 -0700 |
Last modified on | 2020-06-17 11:16:50 -0700 |
Version | trunk |
Hardware | PC Linux |
CC | aprantl@apple.com, ditaliano@apple.com, jdevlieghere@apple.com, jeremy.morse.llvm@gmail.com, keith.walker@arm.com, llvm-bugs@lists.llvm.org, paul_robinson@playstation.sony.com, vsk@apple.com |
Fixed by commit(s) | |
Attachments | |
Blocks | |
Blocked by | |
See also |
Confirmed on
davide@Davides-iMac-Pro bin % ./clang --version
clang version 11.0.0 (https://github.com/llvm/llvm-project
31984063678ef523b940160ac9d49fcb87c1e2ac)
Target: x86_64-apple-darwin20.0.0
Thread model: posix
InstalledDir: /Users/davide/work/build/bin/.
BISECT: running pass (78) Shrink Wrapping analysis on function (main)
BISECT: running pass (79) Control Flow Optimizer on function (main)
This is the pass responsible for the bug.
MIR after BranchFolding:
(lldb) p MF.dump()
# Machine code for function main: NoPHIs, TracksLiveness, NoVRegs
Frame Objects:
fi#-1: size=8, align=16, fixed, at location [SP-8]
bb.0.entry:
successors: %bb.2(0x30000000), %bb.1(0x50000000); %bb.2(37.50%), %bb.1(62.50%)
frame-setup PUSH64r killed $rbp, implicit-def $rsp, implicit $rsp
CFI_INSTRUCTION def_cfa_offset 16
CFI_INSTRUCTION offset $rbp, -16
$rbp = frame-setup MOV64rr $rsp
CFI_INSTRUCTION def_cfa_register $rbp
DBG_VALUE 5, $noreg, !"ui1", !DIExpression(), debug-location !23; ../../build/bin/a.c:0 line no:4
renamable $ecx = MOV32rm $rip, 1, $noreg, @b, $noreg, debug-location !24 :: (dereferenceable load 4 from @b, !tbaa !25); ../../build/bin/a.c:4:26
DBG_VALUE $ecx, $noreg, !"ui2", !DIExpression(), debug-location !23; ../../build/bin/a.c:0 line no:4
$eax = MOV32ri 5, debug-location !31; ../../build/bin/a.c:8:16
TEST32rr renamable $ecx, renamable $ecx, implicit-def $eflags, debug-location !29; ../../build/bin/a.c:6:15
JCC_1 %bb.2, 4, implicit $eflags, debug-location !30; ../../build/bin/a.c:6:11
[...]
Before HoistCommonCodeInSuccs:
bb.0.entry:
successors: %bb.1(0x30000000), %bb.2(0x50000000); %bb.1(37.50%), %bb.2(62.50%)
frame-setup PUSH64r killed $rbp, implicit-def $rsp, implicit $rsp
CFI_INSTRUCTION def_cfa_offset 16
CFI_INSTRUCTION offset $rbp, -16
$rbp = frame-setup MOV64rr $rsp
CFI_INSTRUCTION def_cfa_register $rbp
DBG_VALUE 5, $noreg, !"ui1", !DIExpression(), debug-location !23; ../../build/bin/a.c:0 line no:4
renamable $ecx = MOV32rm $rip, 1, $noreg, @b, $noreg, debug-location !24 :: (dereferenceable load 4 from @b, !tbaa !25); ../../build/bin/a.c:4:26
DBG_VALUE $ecx, $noreg, !"ui2", !DIExpression(), debug-location !23; ../../build/bin/a.c:0 line no:4
TEST32rr renamable $ecx, renamable $ecx, implicit-def $eflags, debug-location !29; ../../build/bin/a.c:6:15
JCC_1 %bb.2, 5, implicit killed $eflags, debug-location !30; ../../build/bin/a.c:6:11
bb.1:
; predecessors: %bb.0
successors: %bb.3(0x80000000); %bb.3(100.00%)
renamable $eax = MOV32ri 5
JMP_1 %bb.3
bb.2.cond.false:
; predecessors: %bb.0
successors: %bb.3(0x80000000); %bb.3(100.00%)
liveins: $ecx
$eax = MOV32ri 5, debug-location !31; ../../build/bin/a.c:8:16
$edx = MOV32r0 implicit-def dead $eflags, debug-location !31; ../../build/bin/a.c:8:16
IDIV32r killed renamable $ecx, implicit-def $eax, implicit-def dead $edx, implicit-def dead $eflags, implicit $eax, implicit killed $edx, debug-location !31; ../../build/bin/a.c:8:16
So it's the hoisting that screws us over. :|
The question here is: should we always drop locations when hoisting? Or, more generally, should we have splice
dropping the locations?
Proposed patch here:
Back to this. What Vedant suggests I think it's correct and I'll try implementing it now.