comparison src/share/vm/opto/library_call.cpp @ 825:8f5825e0aeaa

6818666: G1: Type lost in g1 pre-barrier Reviewed-by: kvn
author never
date Fri, 26 Jun 2009 13:03:29 -0700
parents aabd393cf1ee
children bf3489cc0aa0
comparison
equal deleted inserted replaced
824:18a08a7e16b5 825:8f5825e0aeaa
2176 (void) store_to_memory(control(), adr, val, type, adr_type, is_volatile); 2176 (void) store_to_memory(control(), adr, val, type, adr_type, is_volatile);
2177 } else { 2177 } else {
2178 // Possibly an oop being stored to Java heap or native memory 2178 // Possibly an oop being stored to Java heap or native memory
2179 if (!TypePtr::NULL_PTR->higher_equal(_gvn.type(heap_base_oop))) { 2179 if (!TypePtr::NULL_PTR->higher_equal(_gvn.type(heap_base_oop))) {
2180 // oop to Java heap. 2180 // oop to Java heap.
2181 (void) store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, val->bottom_type(), type); 2181 (void) store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, type);
2182 } else { 2182 } else {
2183
2184 // We can't tell at compile time if we are storing in the Java heap or outside 2183 // We can't tell at compile time if we are storing in the Java heap or outside
2185 // of it. So we need to emit code to conditionally do the proper type of 2184 // of it. So we need to emit code to conditionally do the proper type of
2186 // store. 2185 // store.
2187 2186
2188 IdealKit kit(gvn(), control(), merged_memory()); 2187 IdealKit kit(gvn(), control(), merged_memory());
2189 kit.declares_done(); 2188 kit.declares_done();
2190 // QQQ who knows what probability is here?? 2189 // QQQ who knows what probability is here??
2191 kit.if_then(heap_base_oop, BoolTest::ne, null(), PROB_UNLIKELY(0.999)); { 2190 kit.if_then(heap_base_oop, BoolTest::ne, null(), PROB_UNLIKELY(0.999)); {
2192 (void) store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, val->bottom_type(), type); 2191 (void) store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, type);
2193 } kit.else_(); { 2192 } kit.else_(); {
2194 (void) store_to_memory(control(), adr, val, type, adr_type, is_volatile); 2193 (void) store_to_memory(control(), adr, val, type, adr_type, is_volatile);
2195 } kit.end_if(); 2194 } kit.end_if();
2196 } 2195 }
2197 } 2196 }
2392 cas = _gvn.transform(new (C, 5) CompareAndSwapLNode(control(), mem, adr, newval, oldval)); 2391 cas = _gvn.transform(new (C, 5) CompareAndSwapLNode(control(), mem, adr, newval, oldval));
2393 break; 2392 break;
2394 case T_OBJECT: 2393 case T_OBJECT:
2395 // reference stores need a store barrier. 2394 // reference stores need a store barrier.
2396 // (They don't if CAS fails, but it isn't worth checking.) 2395 // (They don't if CAS fails, but it isn't worth checking.)
2397 pre_barrier(control(), base, adr, alias_idx, newval, value_type, T_OBJECT); 2396 pre_barrier(control(), base, adr, alias_idx, newval, value_type->is_oopptr(), T_OBJECT);
2398 #ifdef _LP64 2397 #ifdef _LP64
2399 if (adr->bottom_type()->is_ptr_to_narrowoop()) { 2398 if (adr->bottom_type()->is_ptr_to_narrowoop()) {
2400 Node *newval_enc = _gvn.transform(new (C, 2) EncodePNode(newval, newval->bottom_type()->make_narrowoop())); 2399 Node *newval_enc = _gvn.transform(new (C, 2) EncodePNode(newval, newval->bottom_type()->make_narrowoop()));
2401 Node *oldval_enc = _gvn.transform(new (C, 2) EncodePNode(oldval, oldval->bottom_type()->make_narrowoop())); 2400 Node *oldval_enc = _gvn.transform(new (C, 2) EncodePNode(oldval, oldval->bottom_type()->make_narrowoop()));
2402 cas = _gvn.transform(new (C, 5) CompareAndSwapNNode(control(), mem, adr, 2401 cas = _gvn.transform(new (C, 5) CompareAndSwapNNode(control(), mem, adr,
2487 insert_mem_bar(Op_MemBarCPUOrder); 2486 insert_mem_bar(Op_MemBarCPUOrder);
2488 // Ensure that the store is atomic for longs: 2487 // Ensure that the store is atomic for longs:
2489 bool require_atomic_access = true; 2488 bool require_atomic_access = true;
2490 Node* store; 2489 Node* store;
2491 if (type == T_OBJECT) // reference stores need a store barrier. 2490 if (type == T_OBJECT) // reference stores need a store barrier.
2492 store = store_oop_to_unknown(control(), base, adr, adr_type, val, value_type, type); 2491 store = store_oop_to_unknown(control(), base, adr, adr_type, val, type);
2493 else { 2492 else {
2494 store = store_to_memory(control(), adr, val, type, adr_type, require_atomic_access); 2493 store = store_to_memory(control(), adr, val, type, adr_type, require_atomic_access);
2495 } 2494 }
2496 insert_mem_bar(Op_MemBarCPUOrder); 2495 insert_mem_bar(Op_MemBarCPUOrder);
2497 return true; 2496 return true;