RFR(M): 8080289: Intermediate writes in a loop not eliminated by optimizer

Roland Westrelin roland.westrelin at oracle.com
Tue Jul 28 18:20:01 UTC 2015


>>> What about
>>> 
>>> volatile int y;
>>> volatile int x;
>>> 
>>> y=1
>>> x=1
>>> y=2
>>> 
>>> transformed to:
>>> 
>>> x=1
>>> y=2
>>> 
>>> ?
>> 
>> I think this is not allowed, since operations over "x" get tied up in
>> the synchronization order.
> 
> Thanks. Then for support_IRIW_for_not_multiple_copy_atomic_cpu true, I don’t see how incorrect reordering is prevented.

I took another look and I was wrong about that.

void Parse::do_put_xxx(Node* obj, ciField* field, bool is_field) {
  bool is_vol = field->is_volatile();
  // If reference is volatile, prevent following memory ops from                                                                                                                                                                                                                
  // floating down past the volatile write.  Also prevents commoning                                                                                                                                                                                                            
  // another volatile read.                                                                                                                                                                                                                                                      
  if (is_vol)  insert_mem_bar(Op_MemBarRelease);

The barrier prevents y=1 from being optimized out.

Roland.


More information about the hotspot-compiler-dev mailing list