# HG changeset patch # User Thomas Wuerthinger # Date 1399499923 -7200 # Node ID ff05eeb654d4e4fdda38124ec885564be951ed0c # Parent 240083895914734773b2054896fff07c7f9764ae Added write barriers for LoweredAtomicReadAndWriteNode. diff -r 240083895914 -r ff05eeb654d4 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierAdditionPhase.java --- 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) { diff -r 240083895914 -r ff05eeb654d4 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoweredAtomicReadAndWriteNode.java --- 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; + } }