< prev index next >

src/share/vm/opto/parse3.cpp

Print this page
rev 12911 : test code
rev 12912 : 8179070: nashorn+octane's box2d causes c2 to crash with "Bad graph detected in compute_lca_of_uses"
Summary: ciTypeFlow speculates field is null but parsing uses non null constant because of concurrent class initialization
Reviewed-by:
rev 12913 : Backed out changeset c947429d5abc
rev 12914 : debug

*** 144,155 **** } } void Parse::do_get_xxx(Node* obj, ciField* field, bool is_field) { // Does this field have a constant value? If so, just push the value. ! if (field->is_constant()) { // final or stable field Node* con = make_constant_from_field(field, obj); if (con != NULL) { push_node(field->layout_type(), con); return; --- 144,163 ---- } } 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() && ! // 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) { push_node(field->layout_type(), con); return;
*** 161,171 **** // Compute address and memory type. 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; bool must_assert_null = false; --- 169,178 ----
< prev index next >