# HG changeset patch # User Christos Kotselidis # Date 1374523433 -7200 # Node ID e7679ec4f27ff658bf67eec60cef7d4cccb464a2 # Parent 23a7cbee48d07e5616197038b09495e7027cda7d Lower CAS nodes to their lowered versions diff -r 23a7cbee48d0 -r e7679ec4f27f graal/com.oracle.graal.compiler.hsail/src/com/oracle/graal/compiler/hsail/HSAILLIRGenerator.java --- a/graal/com.oracle.graal.compiler.hsail/src/com/oracle/graal/compiler/hsail/HSAILLIRGenerator.java Mon Jul 22 22:03:27 2013 +0200 +++ b/graal/com.oracle.graal.compiler.hsail/src/com/oracle/graal/compiler/hsail/HSAILLIRGenerator.java Mon Jul 22 22:03:53 2013 +0200 @@ -690,7 +690,7 @@ } @Override - public void visitCompareAndSwap(CompareAndSwapNode node) { + public void visitCompareAndSwap(LoweredCompareAndSwapNode node, Value address) { throw new InternalError("NYI"); } diff -r 23a7cbee48d0 -r e7679ec4f27f graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java --- a/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java Mon Jul 22 22:03:27 2013 +0200 +++ b/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java Mon Jul 22 22:03:53 2013 +0200 @@ -62,7 +62,7 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.Condition; import com.oracle.graal.nodes.calc.ConvertNode; -import com.oracle.graal.nodes.java.CompareAndSwapNode; +import com.oracle.graal.nodes.java.*; /** * This class implements the PTX specific portion of the LIR generator. @@ -731,7 +731,7 @@ } @Override - public void visitCompareAndSwap(CompareAndSwapNode node) { + public void visitCompareAndSwap(LoweredCompareAndSwapNode node, Value address) { throw new InternalError("NYI"); } diff -r 23a7cbee48d0 -r e7679ec4f27f graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java --- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Mon Jul 22 22:03:27 2013 +0200 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Mon Jul 22 22:03:53 2013 +0200 @@ -808,7 +808,7 @@ } @Override - public void visitCompareAndSwap(CompareAndSwapNode i) { + public void visitCompareAndSwap(LoweredCompareAndSwapNode i, Value address) { throw new InternalError("NYI"); } diff -r 23a7cbee48d0 -r e7679ec4f27f graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Mon Jul 22 22:03:27 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Mon Jul 22 22:03:53 2013 +0200 @@ -468,31 +468,19 @@ } @Override - public void visitCompareAndSwap(CompareAndSwapNode node) { - Kind kind = node.newValue().kind(); - assert kind == node.expected().kind(); - - Value expected = loadNonConst(operand(node.expected())); - Variable newValue = load(operand(node.newValue())); - - AMD64AddressValue address; - int displacement = node.displacement(); - Value index = operand(node.offset()); - if (isConstant(index) && NumUtil.isInt(asConstant(index).asLong() + displacement)) { - assert !runtime.needsDataPatch(asConstant(index)); - displacement += (int) asConstant(index).asLong(); - address = new AMD64AddressValue(kind, load(operand(node.object())), displacement); - } else { - address = new AMD64AddressValue(kind, load(operand(node.object())), load(index), Scale.Times1, displacement); - } - + public void visitCompareAndSwap(LoweredCompareAndSwapNode node, Value address) { + Kind kind = node.getNewValue().kind(); + assert kind == node.getExpectedValue().kind(); + Value expected = loadNonConst(operand(node.getExpectedValue())); + Variable newValue = load(operand(node.getNewValue())); + AMD64AddressValue addressValue = asAddressValue(address); RegisterValue raxRes = AMD64.rax.asValue(kind); emitMove(raxRes, expected); if (runtime().config.useCompressedOops && node.isCompressible()) { Variable scratch = newVariable(Kind.Long); - append(new CompareAndSwapCompressedOp(raxRes, address, raxRes, newValue, scratch, runtime().config.narrowOopBase, runtime().config.narrowOopShift, runtime().config.logMinObjAlignment)); + append(new CompareAndSwapCompressedOp(raxRes, addressValue, raxRes, newValue, scratch, runtime().config.narrowOopBase, runtime().config.narrowOopShift, runtime().config.logMinObjAlignment)); } else { - append(new CompareAndSwapOp(raxRes, address, raxRes, newValue)); + append(new CompareAndSwapOp(raxRes, addressValue, raxRes, newValue)); } Variable result = newVariable(node.kind()); append(new CondMoveOp(result, Condition.EQ, load(Constant.TRUE), Constant.FALSE)); diff -r 23a7cbee48d0 -r e7679ec4f27f graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Mon Jul 22 22:03:27 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Mon Jul 22 22:03:53 2013 +0200 @@ -580,11 +580,9 @@ // Separate out GC barrier semantics CompareAndSwapNode cas = (CompareAndSwapNode) n; LocationNode location = IndexedLocationNode.create(ANY_LOCATION, cas.expected().kind(), cas.displacement(), cas.offset(), graph, 1); - cas.setLocation(location); - cas.setBarrierType(getCompareAndSwapBarrier(cas)); - if (cas.expected().kind() == Kind.Object) { - cas.setCompressible(); - } + LoweredCompareAndSwapNode atomicNode = graph.add(new LoweredCompareAndSwapNode(cas.object(), location, cas.expected(), cas.newValue(), getCompareAndSwapBarrier(cas), + cas.expected().kind() == Kind.Object)); + graph.replaceFixedWithFixed(cas, atomicNode); } else if (n instanceof LoadIndexedNode) { LoadIndexedNode loadIndexed = (LoadIndexedNode) n; GuardingNode boundsCheck = createBoundsCheck(loadIndexed, tool); diff -r 23a7cbee48d0 -r e7679ec4f27f 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 Mon Jul 22 22:03:27 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierAdditionPhase.java Mon Jul 22 22:03:53 2013 +0200 @@ -43,7 +43,7 @@ for (WriteNode node : graph.getNodes(WriteNode.class)) { addWriteNodeBarriers(node, graph); } - for (CompareAndSwapNode node : graph.getNodes(CompareAndSwapNode.class)) { + for (LoweredCompareAndSwapNode node : graph.getNodes(LoweredCompareAndSwapNode.class)) { addCASBarriers(node, graph); } for (ArrayRangeWriteNode node : graph.getNodes(ArrayRangeWriteNode.class)) { @@ -93,19 +93,19 @@ } - private static void addCASBarriers(CompareAndSwapNode node, StructuredGraph graph) { + private static void addCASBarriers(LoweredCompareAndSwapNode node, StructuredGraph graph) { BarrierType barrierType = node.getBarrierType(); if (barrierType == BarrierType.PRECISE) { if (useG1GC()) { - graph.addBeforeFixed(node, graph.add(new G1PreWriteBarrier(node.object(), node.expected(), node.getLocation(), false, false))); - graph.addAfterFixed(node, graph.add(new G1PostWriteBarrier(node.object(), node.newValue(), node.getLocation(), true))); + graph.addBeforeFixed(node, graph.add(new G1PreWriteBarrier(node.object(), node.getExpectedValue(), node.getLocation(), false, false))); + graph.addAfterFixed(node, graph.add(new G1PostWriteBarrier(node.object(), node.getNewValue(), node.getLocation(), true))); } else { graph.addAfterFixed(node, graph.add(new SerialWriteBarrier(node.object(), node.getLocation(), true))); } } else if (barrierType == BarrierType.IMPRECISE) { if (useG1GC()) { - graph.addBeforeFixed(node, graph.add(new G1PreWriteBarrier(node.object(), node.expected(), node.getLocation(), false, false))); - graph.addAfterFixed(node, graph.add(new G1PostWriteBarrier(node.object(), node.newValue(), node.getLocation(), false))); + graph.addBeforeFixed(node, graph.add(new G1PreWriteBarrier(node.object(), node.getExpectedValue(), node.getLocation(), false, false))); + graph.addAfterFixed(node, graph.add(new G1PostWriteBarrier(node.object(), node.getNewValue(), node.getLocation(), false))); } else { graph.addAfterFixed(node, graph.add(new SerialWriteBarrier(node.object(), node.getLocation(), false))); } diff -r 23a7cbee48d0 -r e7679ec4f27f graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierVerificationPhase.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierVerificationPhase.java Mon Jul 22 22:03:27 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierVerificationPhase.java Mon Jul 22 22:03:53 2013 +0200 @@ -113,7 +113,7 @@ private static boolean isObjectWrite(Node node) { if ((node instanceof WriteNode && (((WriteNode) node).getBarrierType() != BarrierType.NONE)) || - (node instanceof CompareAndSwapNode && (((CompareAndSwapNode) node).getBarrierType() != BarrierType.NONE))) { + (node instanceof LoweredCompareAndSwapNode && (((LoweredCompareAndSwapNode) node).getBarrierType() != BarrierType.NONE))) { return true; } return false; @@ -146,9 +146,9 @@ if (write instanceof WriteNode) { writtenObject = ((WriteNode) write).object(); writtenLocation = ((WriteNode) write).location(); - } else if (write instanceof CompareAndSwapNode) { - writtenObject = ((CompareAndSwapNode) write).object(); - writtenLocation = ((CompareAndSwapNode) write).getLocation(); + } else if (write instanceof LoweredCompareAndSwapNode) { + writtenObject = ((LoweredCompareAndSwapNode) write).object(); + writtenLocation = ((LoweredCompareAndSwapNode) write).getLocation(); } else { assert false : "Node must be of type requiring a write barrier"; } diff -r 23a7cbee48d0 -r e7679ec4f27f graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java Mon Jul 22 22:03:27 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java Mon Jul 22 22:03:53 2013 +0200 @@ -25,7 +25,6 @@ import static com.oracle.graal.graph.UnsafeAccess.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.spi.*; @@ -35,7 +34,7 @@ * Represents an atomic compare-and-swap operation The result is a boolean that contains whether the * value matched the expected value. */ -public class CompareAndSwapNode extends AbstractStateSplit implements StateSplit, LIRLowerable, Lowerable, MemoryCheckpoint.Single, Node.IterableNodeType, HeapAccess { +public class CompareAndSwapNode extends AbstractStateSplit implements StateSplit, Lowerable, MemoryCheckpoint.Single { @Input private ValueNode object; @Input private ValueNode offset; @@ -43,8 +42,6 @@ @Input private ValueNode newValue; @Input private LocationNode location; private final int displacement; - private BarrierType barrierType; - private boolean compressible; public ValueNode object() { return object; @@ -75,24 +72,6 @@ this.location = location; } - @Override - public BarrierType getBarrierType() { - return barrierType; - } - - public void setBarrierType(BarrierType type) { - this.barrierType = type; - } - - @Override - public boolean isCompressible() { - return compressible; - } - - public void setCompressible() { - this.compressible = true; - } - public CompareAndSwapNode(ValueNode object, int displacement, ValueNode offset, ValueNode expected, ValueNode newValue) { super(StampFactory.forKind(Kind.Boolean.getStackKind())); assert expected.kind() == newValue.kind(); @@ -101,8 +80,6 @@ this.expected = expected; this.newValue = newValue; this.displacement = displacement; - this.barrierType = BarrierType.NONE; - this.compressible = false; } @Override @@ -111,11 +88,6 @@ } @Override - public void generate(LIRGeneratorTool gen) { - gen.visitCompareAndSwap(this); - } - - @Override public void lower(LoweringTool tool, LoweringType loweringType) { tool.getRuntime().lower(this, tool); } diff -r 23a7cbee48d0 -r e7679ec4f27f graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java Mon Jul 22 22:03:27 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java Mon Jul 22 22:03:53 2013 +0200 @@ -118,7 +118,7 @@ void visitLoopEnd(LoopEndNode i); - void visitCompareAndSwap(CompareAndSwapNode i); + void visitCompareAndSwap(LoweredCompareAndSwapNode i, Value address); // These methods define the contract a runtime specific backend must provide.