292 } |
292 } |
293 |
293 |
294 // If reference is volatile, prevent following volatiles ops from |
294 // If reference is volatile, prevent following volatiles ops from |
295 // floating up before the volatile write. |
295 // floating up before the volatile write. |
296 if (is_vol) { |
296 if (is_vol) { |
297 // First place the specific membar for THIS volatile index. This first |
297 insert_mem_bar(Op_MemBarVolatile); // Use fat membar |
298 // membar is dependent on the store, keeping any other membars generated |
|
299 // below from floating up past the store. |
|
300 int adr_idx = C->get_alias_index(adr_type); |
|
301 insert_mem_bar_volatile(Op_MemBarVolatile, adr_idx, store); |
|
302 |
|
303 // Now place a membar for AliasIdxBot for the unknown yet-to-be-parsed |
|
304 // volatile alias indices. Skip this if the membar is redundant. |
|
305 if (adr_idx != Compile::AliasIdxBot) { |
|
306 insert_mem_bar_volatile(Op_MemBarVolatile, Compile::AliasIdxBot, store); |
|
307 } |
|
308 |
|
309 // Finally, place alias-index-specific membars for each volatile index |
|
310 // that isn't the adr_idx membar. Typically there's only 1 or 2. |
|
311 for( int i = Compile::AliasIdxRaw; i < C->num_alias_types(); i++ ) { |
|
312 if (i != adr_idx && C->alias_type(i)->is_volatile()) { |
|
313 insert_mem_bar_volatile(Op_MemBarVolatile, i, store); |
|
314 } |
|
315 } |
|
316 } |
298 } |
317 |
299 |
318 // If the field is final, the rules of Java say we are in <init> or <clinit>. |
300 // If the field is final, the rules of Java say we are in <init> or <clinit>. |
319 // Note the presence of writes to final non-static fields, so that we |
301 // Note the presence of writes to final non-static fields, so that we |
320 // can insert a memory barrier later on to keep the writes from floating |
302 // can insert a memory barrier later on to keep the writes from floating |