8202565: C1 compilation crashes with "assert(is_double_stack() && !is_virtual()) failed: type check"

Only eagerly resolving the address into a register if the store is precise.

Reviewed-by: roland, eosterlund
This commit is contained in:
Tobias Hartmann 2018-05-07 08:56:35 +02:00
parent 20324b99d3
commit 29b1984560

View File

@ -87,6 +87,9 @@ LIR_Opr ModRefBarrierSetC1::resolve_address(LIRAccess& access, bool resolve_in_r
DecoratorSet decorators = access.decorators();
bool needs_patching = (decorators & C1_NEEDS_PATCHING) != 0;
bool is_write = (decorators & C1_WRITE_ACCESS) != 0;
resolve_in_register |= !needs_patching && is_write && access.is_oop();
bool on_array = (decorators & IN_HEAP_ARRAY) != 0;
bool on_anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0;
bool precise = on_array || on_anonymous;
resolve_in_register |= !needs_patching && is_write && access.is_oop() && precise;
return BarrierSetC1::resolve_address(access, resolve_in_register);
}