RFR(S): 8211231: BarrierSetC1::generate_referent_check() confuses register allocator

Roland Westrelin rwestrel at redhat.com
Thu Sep 27 14:36:29 UTC 2018


http://cr.openjdk.java.net/~roland/8211231/webrev.00/

With Shenandoah, we had a crash in compiled code because a value was
restored from a spill in a branch that's not always executed in
BarrierSetC1::generate_referent_check(). That method generates code with
control flow within a basic block. The register allocator is not aware
of that control flow. So if a value that was spilled before is needed in
a branch, the register allocator may decide to restore it and then
assume it's live in a register from there. The fix I propose is to
assign a temp register to that value and load it before any control
flow.

Details (intermediate representation and generated code) are here:

http://mail.openjdk.java.net/pipermail/shenandoah-dev/2018-September/007605.html

Roland.



More information about the hotspot-compiler-dev mailing list