Mercurial > hg > truffle
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; + } }