7170145: C1 doesn't respect the JMM with volatile field loads
authortwisti
Fri, 25 May 2012 11:39:13 -0700
changeset 12946 6007040eb77d
parent 12945 e63d6176cbd1
child 12947 ba8ba6c2dd83
7170145: C1 doesn't respect the JMM with volatile field loads Reviewed-by: kvn, roland
hotspot/src/share/vm/c1/c1_ValueMap.hpp
--- a/hotspot/src/share/vm/c1/c1_ValueMap.hpp	Fri May 25 07:53:11 2012 -0700
+++ b/hotspot/src/share/vm/c1/c1_ValueMap.hpp	Fri May 25 11:39:13 2012 -0700
@@ -141,8 +141,11 @@
 
   // visitor functions
   void do_StoreField     (StoreField*      x) {
-    if (x->is_init_point()) {
-      // putstatic is an initialization point so treat it as a wide kill
+    if (x->is_init_point() ||  // putstatic is an initialization point so treat it as a wide kill
+        // This is actually too strict and the JMM doesn't require
+        // this in all cases (e.g. load a; volatile store b; load a)
+        // but possible future optimizations might require this.
+        x->field()->is_volatile()) {
       kill_memory();
     } else {
       kill_field(x->field());
@@ -160,8 +163,8 @@
   void do_Local          (Local*           x) { /* nothing to do */ }
   void do_Constant       (Constant*        x) { /* nothing to do */ }
   void do_LoadField      (LoadField*       x) {
-    if (x->is_init_point()) {
-      // getstatic is an initialization point so treat it as a wide kill
+    if (x->is_init_point() ||         // getstatic is an initialization point so treat it as a wide kill
+        x->field()->is_volatile()) {  // the JMM requires this
       kill_memory();
     }
   }