发patch学到的:
https://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2018-September/030745.html
简而言之,lsra不能只能识别BlockBegin链接的cfg,但是不能识别block里面用__ branch这些创建的cfg,需要特别注意。
The problem is that there's control flow here that's invisible to
the register allocator. The register allocator only knows about control
flow that connects basic blocks. The control flow here is within a
block. So as far as the register allocator is concerned the code above
is a linear sequence of instructions all of which are all executed: so
once R584 is live by restoring the value from the stack into rdi, that
value in rdi is live too at the end of the code sequence above. Of
course, it's not true, the code sequence has branches, if branch at LIR
instruction 170 is taken, the value is not restored in rdi as expected
and that's why we have the crash.
ra从栈R584恢复到rdi后,他认为rdi的值直到block结束都是存活的。但是不适当,因为如果走到了170的分支,就不会restore