mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-19 23:05:28 +00:00
8179070: nashorn+octane's box2d causes c2 to crash with "Bad graph detected in compute_lca_of_uses"
CiTypeFlow speculates field is null but parsing uses non null constant because of concurrent class initialization Reviewed-by: thartmann
This commit is contained in:
parent
7176f55ced
commit
aa386ac45b
@ -146,8 +146,16 @@ void Parse::do_field_access(bool is_get, bool is_field) {
|
||||
|
||||
|
||||
void Parse::do_get_xxx(Node* obj, ciField* field, bool is_field) {
|
||||
BasicType bt = field->layout_type();
|
||||
|
||||
// Does this field have a constant value? If so, just push the value.
|
||||
if (field->is_constant()) {
|
||||
if (field->is_constant() &&
|
||||
// Keep consistent with types found by ciTypeFlow: for an
|
||||
// unloaded field type, ciTypeFlow::StateVector::do_getstatic()
|
||||
// speculates the field is null. The code in the rest of this
|
||||
// method does the same. We must not bypass it and use a non
|
||||
// null constant here.
|
||||
(bt != T_OBJECT || field->type()->is_loaded())) {
|
||||
// final or stable field
|
||||
Node* con = make_constant_from_field(field, obj);
|
||||
if (con != NULL) {
|
||||
@ -163,7 +171,6 @@ void Parse::do_get_xxx(Node* obj, ciField* field, bool is_field) {
|
||||
int offset = field->offset_in_bytes();
|
||||
const TypePtr* adr_type = C->alias_type(field)->adr_type();
|
||||
Node *adr = basic_plus_adr(obj, obj, offset);
|
||||
BasicType bt = field->layout_type();
|
||||
|
||||
// Build the resultant type of the load
|
||||
const Type *type;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user