changeset 15549:ff05eeb654d4

Added write barriers for LoweredAtomicReadAndWriteNode.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Wed, 07 May 2014 23:58:43 +0200
parents 240083895914
children 3882866b6ff9
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierAdditionPhase.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoweredAtomicReadAndWriteNode.java
diffstat 2 files changed, 34 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierAdditionPhase.java	Wed May 07 15:31:04 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierAdditionPhase.java	Wed May 07 23:58:43 2014 +0200
@@ -45,6 +45,9 @@
                 addReadNodeBarriers((ReadNode) n, graph);
             } else if (n instanceof WriteNode) {
                 addWriteNodeBarriers((WriteNode) n, graph);
+            } else if (n instanceof LoweredAtomicReadAndWriteNode) {
+                LoweredAtomicReadAndWriteNode loweredAtomicReadAndWriteNode = (LoweredAtomicReadAndWriteNode) n;
+                addAtomicReadWriteNodeBarriers(loweredAtomicReadAndWriteNode, graph);
             } else if (n instanceof LoweredCompareAndSwapNode) {
                 addCASBarriers((LoweredCompareAndSwapNode) n, graph);
             } else if (n instanceof ArrayRangeWriteNode) {
@@ -110,6 +113,33 @@
         }
     }
 
+    private void addAtomicReadWriteNodeBarriers(LoweredAtomicReadAndWriteNode loweredAtomicReadAndWriteNode, StructuredGraph graph) {
+        BarrierType barrierType = loweredAtomicReadAndWriteNode.getBarrierType();
+        if (barrierType == BarrierType.PRECISE) {
+            if (useG1GC()) {
+                addG1PreWriteBarrier(loweredAtomicReadAndWriteNode, loweredAtomicReadAndWriteNode.object(), null, loweredAtomicReadAndWriteNode.location(), true,
+                                loweredAtomicReadAndWriteNode.getNullCheck(), graph);
+                addG1PostWriteBarrier(loweredAtomicReadAndWriteNode, loweredAtomicReadAndWriteNode.object(), loweredAtomicReadAndWriteNode.getNewValue(), loweredAtomicReadAndWriteNode.location(),
+                                true, graph);
+            } else {
+                addSerialPostWriteBarrier(loweredAtomicReadAndWriteNode, loweredAtomicReadAndWriteNode.object(), loweredAtomicReadAndWriteNode.getNewValue(), loweredAtomicReadAndWriteNode.location(),
+                                true, graph);
+            }
+        } else if (barrierType == BarrierType.IMPRECISE) {
+            if (useG1GC()) {
+                addG1PreWriteBarrier(loweredAtomicReadAndWriteNode, loweredAtomicReadAndWriteNode.object(), null, loweredAtomicReadAndWriteNode.location(), true,
+                                loweredAtomicReadAndWriteNode.getNullCheck(), graph);
+                addG1PostWriteBarrier(loweredAtomicReadAndWriteNode, loweredAtomicReadAndWriteNode.object(), loweredAtomicReadAndWriteNode.getNewValue(), loweredAtomicReadAndWriteNode.location(),
+                                false, graph);
+            } else {
+                addSerialPostWriteBarrier(loweredAtomicReadAndWriteNode, loweredAtomicReadAndWriteNode.object(), loweredAtomicReadAndWriteNode.getNewValue(), loweredAtomicReadAndWriteNode.location(),
+                                false, graph);
+            }
+        } else {
+            assert barrierType == BarrierType.NONE;
+        }
+    }
+
     private void addCASBarriers(LoweredCompareAndSwapNode node, StructuredGraph graph) {
         BarrierType barrierType = node.getBarrierType();
         if (barrierType == BarrierType.PRECISE) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoweredAtomicReadAndWriteNode.java	Wed May 07 15:31:04 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoweredAtomicReadAndWriteNode.java	Wed May 07 23:58:43 2014 +0200
@@ -65,7 +65,7 @@
 
     public void generate(NodeLIRBuilderTool gen) {
         Value address = location().generateAddress(gen, gen.getLIRGeneratorTool(), gen.operand(object()));
-        Value result = gen.getLIRGeneratorTool().emitAtomicReadAndWrite(address, gen.operand(newValue));
+        Value result = gen.getLIRGeneratorTool().emitAtomicReadAndWrite(address, gen.operand(getNewValue()));
         gen.setResult(this, result);
     }
 
@@ -81,4 +81,7 @@
         return false;
     }
 
+    public final ValueNode getNewValue() {
+        return newValue;
+    }
 }