001/* 002 * Copyright (c) 2011, 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.memory; 024 025import jdk.internal.jvmci.meta.*; 026 027import com.oracle.graal.compiler.common.type.*; 028import com.oracle.graal.graph.*; 029import com.oracle.graal.nodeinfo.*; 030import com.oracle.graal.nodes.*; 031import com.oracle.graal.nodes.extended.*; 032import com.oracle.graal.nodes.memory.address.*; 033 034/** 035 * Accesses a value at an memory address specified by an {@linkplain #address address}. The access 036 * does not include a null check on the object. 037 */ 038@NodeInfo 039public abstract class FixedAccessNode extends DeoptimizingFixedWithNextNode implements Access { 040 public static final NodeClass<FixedAccessNode> TYPE = NodeClass.create(FixedAccessNode.class); 041 042 @OptionalInput(InputType.Guard) protected GuardingNode guard; 043 044 @Input(InputType.Association) AddressNode address; 045 protected final LocationIdentity location; 046 047 protected boolean nullCheck; 048 protected BarrierType barrierType; 049 050 public AddressNode getAddress() { 051 return address; 052 } 053 054 public void setAddress(AddressNode address) { 055 updateUsages(this.address, address); 056 this.address = address; 057 } 058 059 public LocationIdentity getLocationIdentity() { 060 return location; 061 } 062 063 public boolean getNullCheck() { 064 return nullCheck; 065 } 066 067 public void setNullCheck(boolean check) { 068 this.nullCheck = check; 069 } 070 071 protected FixedAccessNode(NodeClass<? extends FixedAccessNode> c, AddressNode address, LocationIdentity location, Stamp stamp) { 072 this(c, address, location, stamp, BarrierType.NONE); 073 } 074 075 protected FixedAccessNode(NodeClass<? extends FixedAccessNode> c, AddressNode address, LocationIdentity location, Stamp stamp, BarrierType barrierType) { 076 this(c, address, location, stamp, null, barrierType, false, null); 077 } 078 079 protected FixedAccessNode(NodeClass<? extends FixedAccessNode> c, AddressNode address, LocationIdentity location, Stamp stamp, GuardingNode guard, BarrierType barrierType, boolean nullCheck, 080 FrameState stateBefore) { 081 super(c, stamp, stateBefore); 082 this.address = address; 083 this.location = location; 084 this.guard = guard; 085 this.barrierType = barrierType; 086 this.nullCheck = nullCheck; 087 } 088 089 @Override 090 public boolean canDeoptimize() { 091 return nullCheck; 092 } 093 094 @Override 095 public GuardingNode getGuard() { 096 return guard; 097 } 098 099 @Override 100 public void setGuard(GuardingNode guard) { 101 updateUsagesInterface(this.guard, guard); 102 this.guard = guard; 103 } 104 105 @Override 106 public BarrierType getBarrierType() { 107 return barrierType; 108 } 109}