equal
deleted
inserted
replaced
141 |
141 |
142 //=============================allocation====================================== |
142 //=============================allocation====================================== |
143 // We failed the fast-path allocation. Now we need to do a scavenge or GC |
143 // We failed the fast-path allocation. Now we need to do a scavenge or GC |
144 // and try allocation again. |
144 // and try allocation again. |
145 |
145 |
146 void OptoRuntime::maybe_defer_card_mark(JavaThread* thread) { |
146 void OptoRuntime::new_store_pre_barrier(JavaThread* thread) { |
147 // After any safepoint, just before going back to compiled code, |
147 // After any safepoint, just before going back to compiled code, |
148 // we inform the GC that we will be doing initializing writes to |
148 // we inform the GC that we will be doing initializing writes to |
149 // this object in the future without emitting card-marks, so |
149 // this object in the future without emitting card-marks, so |
150 // GC may take any compensating steps. |
150 // GC may take any compensating steps. |
151 // NOTE: Keep this code consistent with GraphKit::store_barrier. |
151 // NOTE: Keep this code consistent with GraphKit::store_barrier. |
154 if (new_obj == NULL) return; |
154 if (new_obj == NULL) return; |
155 |
155 |
156 assert(Universe::heap()->can_elide_tlab_store_barriers(), |
156 assert(Universe::heap()->can_elide_tlab_store_barriers(), |
157 "compiler must check this first"); |
157 "compiler must check this first"); |
158 // GC may decide to give back a safer copy of new_obj. |
158 // GC may decide to give back a safer copy of new_obj. |
159 new_obj = Universe::heap()->defer_store_barrier(thread, new_obj); |
159 new_obj = Universe::heap()->new_store_pre_barrier(thread, new_obj); |
160 thread->set_vm_result(new_obj); |
160 thread->set_vm_result(new_obj); |
161 } |
161 } |
162 |
162 |
163 // object allocation |
163 // object allocation |
164 JRT_BLOCK_ENTRY(void, OptoRuntime::new_instance_C(klassOopDesc* klass, JavaThread* thread)) |
164 JRT_BLOCK_ENTRY(void, OptoRuntime::new_instance_C(klassOopDesc* klass, JavaThread* thread)) |
198 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION); |
198 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION); |
199 JRT_BLOCK_END; |
199 JRT_BLOCK_END; |
200 |
200 |
201 if (GraphKit::use_ReduceInitialCardMarks()) { |
201 if (GraphKit::use_ReduceInitialCardMarks()) { |
202 // inform GC that we won't do card marks for initializing writes. |
202 // inform GC that we won't do card marks for initializing writes. |
203 maybe_defer_card_mark(thread); |
203 new_store_pre_barrier(thread); |
204 } |
204 } |
205 JRT_END |
205 JRT_END |
206 |
206 |
207 |
207 |
208 // array allocation |
208 // array allocation |
237 thread->set_vm_result(result); |
237 thread->set_vm_result(result); |
238 JRT_BLOCK_END; |
238 JRT_BLOCK_END; |
239 |
239 |
240 if (GraphKit::use_ReduceInitialCardMarks()) { |
240 if (GraphKit::use_ReduceInitialCardMarks()) { |
241 // inform GC that we won't do card marks for initializing writes. |
241 // inform GC that we won't do card marks for initializing writes. |
242 maybe_defer_card_mark(thread); |
242 new_store_pre_barrier(thread); |
243 } |
243 } |
244 JRT_END |
244 JRT_END |
245 |
245 |
246 // Note: multianewarray for one dimension is handled inline by GraphKit::new_array. |
246 // Note: multianewarray for one dimension is handled inline by GraphKit::new_array. |
247 |
247 |