# HG changeset patch # User never # Date 1246046609 25200 # Node ID 8f5825e0aeaaf3185b612d3a3318c480321c4ecf # Parent 18a08a7e16b5063c6c126d0ab76251f4d5c1befe 6818666: G1: Type lost in g1 pre-barrier Reviewed-by: kvn diff -r 18a08a7e16b5 -r 8f5825e0aeaa src/share/vm/opto/graphKit.cpp --- a/src/share/vm/opto/graphKit.cpp Fri Jun 26 07:26:10 2009 -0700 +++ b/src/share/vm/opto/graphKit.cpp Fri Jun 26 13:03:29 2009 -0700 @@ -1378,7 +1378,7 @@ Node* adr, uint adr_idx, Node *val, - const Type* val_type, + const TypeOopPtr* val_type, BasicType bt) { BarrierSet* bs = Universe::heap()->barrier_set(); set_control(ctl); @@ -1436,7 +1436,7 @@ Node* adr, const TypePtr* adr_type, Node *val, - const Type* val_type, + const TypeOopPtr* val_type, BasicType bt) { uint adr_idx = C->get_alias_index(adr_type); Node* store; @@ -1451,7 +1451,7 @@ Node* adr, const TypePtr* adr_type, Node *val, - const Type* val_type, + const TypeOopPtr* val_type, BasicType bt) { uint adr_idx = C->get_alias_index(adr_type); Node* store; @@ -1466,12 +1466,29 @@ Node* adr, const TypePtr* adr_type, Node *val, - const Type* val_type, BasicType bt) { - uint adr_idx = C->get_alias_index(adr_type); - Node* store; + Compile::AliasType* at = C->alias_type(adr_type); + const TypeOopPtr* val_type = NULL; + if (adr_type->isa_instptr()) { + if (at->field() != NULL) { + // known field. This code is a copy of the do_put_xxx logic. + ciField* field = at->field(); + if (!field->type()->is_loaded()) { + val_type = TypeInstPtr::BOTTOM; + } else { + val_type = TypeOopPtr::make_from_klass(field->type()->as_klass()); + } + } + } else if (adr_type->isa_aryptr()) { + val_type = adr_type->is_aryptr()->elem()->isa_oopptr(); + } + if (val_type == NULL) { + val_type = TypeInstPtr::BOTTOM; + } + + uint adr_idx = at->index(); pre_barrier(ctl, obj, adr, adr_idx, val, val_type, bt); - store = store_to_memory(control(), adr, val, bt, adr_idx); + Node* store = store_to_memory(control(), adr, val, bt, adr_idx); post_barrier(control(), store, obj, adr, adr_idx, val, bt, true); return store; } @@ -3202,7 +3219,7 @@ Node* adr, uint alias_idx, Node* val, - const Type* val_type, + const TypeOopPtr* val_type, BasicType bt) { IdealKit ideal(gvn(), control(), merged_memory(), true); #define __ ideal. diff -r 18a08a7e16b5 -r 8f5825e0aeaa src/share/vm/opto/graphKit.hpp --- a/src/share/vm/opto/graphKit.hpp Fri Jun 26 07:26:10 2009 -0700 +++ b/src/share/vm/opto/graphKit.hpp Fri Jun 26 13:03:29 2009 -0700 @@ -454,7 +454,7 @@ Node* adr, // actual adress to store val at const TypePtr* adr_type, Node* val, - const Type* val_type, + const TypeOopPtr* val_type, BasicType bt); Node* store_oop_to_array(Node* ctl, @@ -462,7 +462,7 @@ Node* adr, // actual adress to store val at const TypePtr* adr_type, Node* val, - const Type* val_type, + const TypeOopPtr* val_type, BasicType bt); // Could be an array or object we don't know at compile time (unsafe ref.) @@ -471,12 +471,11 @@ Node* adr, // actual adress to store val at const TypePtr* adr_type, Node* val, - const Type* val_type, BasicType bt); // For the few case where the barriers need special help void pre_barrier(Node* ctl, Node* obj, Node* adr, uint adr_idx, - Node* val, const Type* val_type, BasicType bt); + Node* val, const TypeOopPtr* val_type, BasicType bt); void post_barrier(Node* ctl, Node* store, Node* obj, Node* adr, uint adr_idx, Node* val, BasicType bt, bool use_precise); @@ -599,7 +598,7 @@ Node* adr, uint alias_idx, Node* val, - const Type* val_type, + const TypeOopPtr* val_type, BasicType bt); void g1_write_barrier_post(Node* store, diff -r 18a08a7e16b5 -r 8f5825e0aeaa src/share/vm/opto/library_call.cpp --- a/src/share/vm/opto/library_call.cpp Fri Jun 26 07:26:10 2009 -0700 +++ b/src/share/vm/opto/library_call.cpp Fri Jun 26 13:03:29 2009 -0700 @@ -2178,9 +2178,8 @@ // Possibly an oop being stored to Java heap or native memory if (!TypePtr::NULL_PTR->higher_equal(_gvn.type(heap_base_oop))) { // oop to Java heap. - (void) store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, val->bottom_type(), type); + (void) store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, type); } else { - // We can't tell at compile time if we are storing in the Java heap or outside // of it. So we need to emit code to conditionally do the proper type of // store. @@ -2189,7 +2188,7 @@ kit.declares_done(); // QQQ who knows what probability is here?? kit.if_then(heap_base_oop, BoolTest::ne, null(), PROB_UNLIKELY(0.999)); { - (void) store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, val->bottom_type(), type); + (void) store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, type); } kit.else_(); { (void) store_to_memory(control(), adr, val, type, adr_type, is_volatile); } kit.end_if(); @@ -2394,7 +2393,7 @@ case T_OBJECT: // reference stores need a store barrier. // (They don't if CAS fails, but it isn't worth checking.) - pre_barrier(control(), base, adr, alias_idx, newval, value_type, T_OBJECT); + pre_barrier(control(), base, adr, alias_idx, newval, value_type->is_oopptr(), T_OBJECT); #ifdef _LP64 if (adr->bottom_type()->is_ptr_to_narrowoop()) { Node *newval_enc = _gvn.transform(new (C, 2) EncodePNode(newval, newval->bottom_type()->make_narrowoop())); @@ -2489,7 +2488,7 @@ bool require_atomic_access = true; Node* store; if (type == T_OBJECT) // reference stores need a store barrier. - store = store_oop_to_unknown(control(), base, adr, adr_type, val, value_type, type); + store = store_oop_to_unknown(control(), base, adr, adr_type, val, type); else { store = store_to_memory(control(), adr, val, type, adr_type, require_atomic_access); } diff -r 18a08a7e16b5 -r 8f5825e0aeaa src/share/vm/opto/parse2.cpp --- a/src/share/vm/opto/parse2.cpp Fri Jun 26 07:26:10 2009 -0700 +++ b/src/share/vm/opto/parse2.cpp Fri Jun 26 13:03:29 2009 -0700 @@ -1565,7 +1565,7 @@ c = pop(); // Oop to store b = pop(); // index (already used) a = pop(); // the array itself - const Type* elemtype = _gvn.type(a)->is_aryptr()->elem(); + const TypeOopPtr* elemtype = _gvn.type(a)->is_aryptr()->elem()->is_oopptr(); const TypeAryPtr* adr_type = TypeAryPtr::OOPS; Node* store = store_oop_to_array(control(), a, d, adr_type, c, elemtype, T_OBJECT); break; diff -r 18a08a7e16b5 -r 8f5825e0aeaa src/share/vm/opto/parse3.cpp --- a/src/share/vm/opto/parse3.cpp Fri Jun 26 07:26:10 2009 -0700 +++ b/src/share/vm/opto/parse3.cpp Fri Jun 26 13:03:29 2009 -0700 @@ -222,7 +222,7 @@ // Store the value. Node* store; if (bt == T_OBJECT) { - const TypePtr* field_type; + const TypeOopPtr* field_type; if (!field->type()->is_loaded()) { field_type = TypeInstPtr::BOTTOM; } else { @@ -361,7 +361,7 @@ guarantee(length_con >= 0, "non-constant multianewarray"); ciArrayKlass* array_klass_1 = array_klass->as_obj_array_klass()->element_klass()->as_array_klass(); const TypePtr* adr_type = TypeAryPtr::OOPS; - const Type* elemtype = _gvn.type(array)->is_aryptr()->elem(); + const TypeOopPtr* elemtype = _gvn.type(array)->is_aryptr()->elem()->is_oopptr(); const intptr_t header = arrayOopDesc::base_offset_in_bytes(T_OBJECT); for (jint i = 0; i < length_con; i++) { Node* elem = expand_multianewarray(array_klass_1, &lengths[1], ndimensions-1, nargs);