protected void lowerCompareAndExchangeNode(UnsafeCompareAndExchangeNode cas) {
StructuredGraph graph = cas.graph();
JavaKind valueKind = cas.getValueKind();
ValueNode expectedValue = implicitStoreConvert(graph, valueKind, cas.expected());
ValueNode newValue = implicitStoreConvert(graph, valueKind, cas.newValue());
AddressNode address = graph.unique(new OffsetAddressNode(cas.object(), cas.offset()));
BarrierType barrierType = guessStoreBarrierType(cas.object(), expectedValue);
ValueCompareAndSwapNode atomicNode = graph.add(new ValueCompareAndSwapNode(address, expectedValue, newValue, cas.getLocationIdentity(), barrierType));
ValueNode coercedNode = implicitLoadConvert(graph, valueKind, atomicNode, true);
atomicNode.setStateAfter(cas.stateAfter());
cas.replaceAtUsages(coercedNode);
graph.replaceFixedWithFixed(cas, atomicNode);
}