001/* 002 * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. 003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 004 * 005 * This code is free software; you can redistribute it and/or modify it 006 * under the terms of the GNU General Public License version 2 only, as 007 * published by the Free Software Foundation. 008 * 009 * This code is distributed in the hope that it will be useful, but WITHOUT 010 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 011 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 012 * version 2 for more details (a copy is included in the LICENSE file that 013 * accompanied this code). 014 * 015 * You should have received a copy of the GNU General Public License version 016 * 2 along with this work; if not, write to the Free Software Foundation, 017 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 018 * 019 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 020 * or visit www.oracle.com if you need additional information or have any 021 * questions. 022 */ 023package com.oracle.graal.nodes.java; 024 025import jdk.internal.jvmci.meta.*; 026import sun.misc.*; 027 028import com.oracle.graal.graph.*; 029import com.oracle.graal.nodeinfo.*; 030import com.oracle.graal.nodes.*; 031import com.oracle.graal.nodes.memory.*; 032import com.oracle.graal.nodes.memory.address.*; 033import com.oracle.graal.nodes.spi.*; 034 035/** 036 * Represents the lowered version of an atomic read-and-write operation like 037 * {@link Unsafe#getAndSetInt(Object, long, int)} . 038 */ 039@NodeInfo(allowedUsageTypes = {InputType.Memory}) 040public final class LoweredAtomicReadAndWriteNode extends FixedAccessNode implements StateSplit, LIRLowerable, MemoryCheckpoint.Single { 041 042 public static final NodeClass<LoweredAtomicReadAndWriteNode> TYPE = NodeClass.create(LoweredAtomicReadAndWriteNode.class); 043 @Input ValueNode newValue; 044 @OptionalInput(InputType.State) FrameState stateAfter; 045 046 public LoweredAtomicReadAndWriteNode(AddressNode address, LocationIdentity location, ValueNode newValue, BarrierType barrierType) { 047 super(TYPE, address, location, newValue.stamp().unrestricted(), barrierType); 048 this.newValue = newValue; 049 } 050 051 public FrameState stateAfter() { 052 return stateAfter; 053 } 054 055 public void setStateAfter(FrameState x) { 056 assert x == null || x.isAlive() : "frame state must be in a graph"; 057 updateUsages(stateAfter, x); 058 stateAfter = x; 059 } 060 061 public boolean hasSideEffect() { 062 return true; 063 } 064 065 public void generate(NodeLIRBuilderTool gen) { 066 Value result = gen.getLIRGeneratorTool().emitAtomicReadAndWrite(gen.operand(getAddress()), gen.operand(getNewValue())); 067 gen.setResult(this, result); 068 } 069 070 public boolean canNullCheck() { 071 return false; 072 } 073 074 public ValueNode getNewValue() { 075 return newValue; 076 } 077}