# HG changeset patch # User Christos Kotselidis # Date 1374523457 -7200 # Node ID cea4beb67bfde815b8bef29f0e31bbb86be73cd4 # Parent e7679ec4f27ff658bf67eec60cef7d4cccb464a2# Parent 4da2141fc40f3b33a52b92660f58dde40ef99cdb Merge diff -r 4da2141fc40f -r cea4beb67bfd 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 19:12:14 2013 +0200 +++ b/graal/com.oracle.graal.compiler.hsail/src/com/oracle/graal/compiler/hsail/HSAILLIRGenerator.java Mon Jul 22 22:04:17 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 4da2141fc40f -r cea4beb67bfd 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 19:12:14 2013 +0200 +++ b/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java Mon Jul 22 22:04:17 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 4da2141fc40f -r cea4beb67bfd 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 19:12:14 2013 +0200 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Mon Jul 22 22:04:17 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 4da2141fc40f -r cea4beb67bfd 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 19:12:14 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Mon Jul 22 22:04:17 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 4da2141fc40f -r cea4beb67bfd 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 19:12:14 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Mon Jul 22 22:04:17 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 4da2141fc40f -r cea4beb67bfd 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 19:12:14 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierAdditionPhase.java Mon Jul 22 22:04:17 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 4da2141fc40f -r cea4beb67bfd 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 19:12:14 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierVerificationPhase.java Mon Jul 22 22:04:17 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 4da2141fc40f -r cea4beb67bfd 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 19:12:14 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java Mon Jul 22 22:04:17 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 4da2141fc40f -r cea4beb67bfd graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoweredCompareAndSwapNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoweredCompareAndSwapNode.java Mon Jul 22 22:04:17 2013 +0200 @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.nodes.java; + +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.*; +import com.oracle.graal.nodes.type.*; + +/** + * Represents the lowered version of an atomic compare-and-swap operation{@code CompareAndSwapNode}. + */ +public class LoweredCompareAndSwapNode extends AccessNode implements StateSplit, LIRLowerable, MemoryCheckpoint.Single, Node.IterableNodeType { + + @Input private ValueNode object; + @Input private ValueNode expectedValue; + @Input private ValueNode newValue; + @Input private LocationNode location; + @Input(notDataflow = true) private FrameState stateAfter; + + public FrameState stateAfter() { + return stateAfter; + } + + public void setStateAfter(FrameState x) { + assert x == null || x.isAlive() : "frame state must be in a graph"; + updateUsages(stateAfter, x); + stateAfter = x; + } + + public boolean hasSideEffect() { + return true; + } + + public ValueNode getObject() { + return object; + } + + public ValueNode getExpectedValue() { + return expectedValue; + } + + public ValueNode getNewValue() { + return newValue; + } + + public LocationNode getLocation() { + return location; + } + + public LoweredCompareAndSwapNode(ValueNode object, LocationNode location, ValueNode expectedValue, ValueNode newValue, BarrierType barrierType, boolean compressible) { + super(object, location, StampFactory.forKind(Kind.Boolean.getStackKind()), barrierType, compressible); + assert expectedValue.kind() == newValue.kind(); + this.object = object; + this.expectedValue = expectedValue; + this.newValue = newValue; + this.location = location; + } + + @Override + public LocationIdentity getLocationIdentity() { + return location.getLocationIdentity(); + } + + @Override + public void generate(LIRGeneratorTool gen) { + gen.visitCompareAndSwap(this, getLocation().generateAddress(gen, gen.operand(getObject()))); + } +} diff -r 4da2141fc40f -r cea4beb67bfd 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 19:12:14 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java Mon Jul 22 22:04:17 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.