diff options
author | Denis Antrushin <dantrushin@gmail.com> | 2020-08-27 19:51:30 +0700 |
---|---|---|
committer | Denis Antrushin <dantrushin@gmail.com> | 2020-08-28 23:22:07 +0700 |
commit | fabd4c1ae1fc573eb83ba9541e133a265c5549da (patch) | |
tree | 039adafda3f3d7c9d5c47bc377ba00337fbb9461 /llvm/lib/CodeGen/CommandFlags.cpp | |
parent | 46e0ced762ce2c32bc846b5c0129c3b5020ca5d9 (diff) | |
download | llvm-fabd4c1ae1fc573eb83ba9541e133a265c5549da.zip llvm-fabd4c1ae1fc573eb83ba9541e133a265c5549da.tar.gz llvm-fabd4c1ae1fc573eb83ba9541e133a265c5549da.tar.bz2 |
[Statepoint] Always spill base pointer.
There is a subtle problem with new statepoint lowering scheme
when base and pointers are the same (see PR46917 for more context):
%1 = STATEPOINT ... %0, %0(tied-def 0)...
if, for some reason, register allocator desides to put two instances
of %0 into two different objects (registers or spill slots), we may
end up with
$reg3 = STATEPOINT ... $reg2, $reg1(tied-def 0)...
and nothing will prevent later passes to sink uses of $reg2 below
statepoint, which is incorrect.
As a short term solution, always put base pointers on stack during
lowering.
A longer term solution may be to rework MIR statepoint format to
avoid GC pointer duplication in statepoint argument list.
Reviewed By: reames
Differential Revision: https://reviews.llvm.org/D86712
Diffstat (limited to 'llvm/lib/CodeGen/CommandFlags.cpp')
0 files changed, 0 insertions, 0 deletions