Mercurial > hg > truffle
diff graal/com.oracle.max.graal.compiler/src/com/sun/c1x/ir/Instruction.java @ 2872:0341b6424579
Project renaming.
author | Thomas Wuerthinger <thomas@wuerthinger.net> |
---|---|
date | Wed, 08 Jun 2011 08:42:25 +0200 |
parents | graal/GraalCompiler/src/com/sun/c1x/ir/Instruction.java@caf55daa41dc |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.max.graal.compiler/src/com/sun/c1x/ir/Instruction.java Wed Jun 08 08:42:25 2011 +0200 @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2009, 2010, 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.sun.c1x.ir; + +import java.util.*; + +import com.oracle.graal.graph.*; +import com.sun.c1x.*; +import com.sun.c1x.value.*; +import com.sun.cri.ci.*; + +/** + * Denotes an instruction node in the IR, which is a {@link Value} that + * can be added to a basic block (whereas other {@link Value} nodes such as {@link Phi} and + * {@link Local} cannot be added to basic blocks). + * + * Subclasses of instruction represent arithmetic and object operations, + * control flow operators, phi statements, method calls, the start of basic blocks, and + * the end of basic blocks. + * + * Instruction nodes are chained together in a basic block through the embedded + * {@link Instruction#next} field. An Instruction may also have a list of {@link ExceptionHandler}s. + */ +public abstract class Instruction extends FixedNode { + + private static final int INPUT_COUNT = 0; + + private static final int SUCCESSOR_COUNT = 1; + public static final int SUCCESSOR_NEXT = 0; + + @Override + protected int inputCount() { + return super.inputCount() + INPUT_COUNT; + } + + @Override + protected int successorCount() { + return super.successorCount() + SUCCESSOR_COUNT; + } + + /** + * Links to next instruction in a basic block, to {@code null} if this instruction is the end of a basic block or to + * itself if not in a block. + */ + public Instruction next() { + return (Instruction) successors().get(super.successorCount() + SUCCESSOR_NEXT); + } + + public Node setNext(Instruction next) { + return successors().set(super.successorCount() + SUCCESSOR_NEXT, next); + } + + public int nextIndex() { + return super.successorCount() + SUCCESSOR_NEXT; + } + + + public static final int SYNCHRONIZATION_ENTRY_BCI = -1; + + /** + * Constructs a new instruction with the specified value type. + * @param kind the value type for this instruction + * @param inputCount + * @param successorCount + */ + public Instruction(CiKind kind, int inputCount, int successorCount, Graph graph) { + super(kind, inputCount + INPUT_COUNT, successorCount + SUCCESSOR_COUNT, graph); + C1XMetrics.HIRInstructions++; + } + + + /** + * Gets the list of predecessors of this block. + * @return the predecessor list + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public List<Instruction> blockPredecessors() { + return (List) Collections.unmodifiableList(predecessors()); + } + + /** + * Get the number of predecessors. + * @return the number of predecessors + */ + public int numberOfPreds() { + return predecessors().size(); + } + + public Instruction predAt(int j) { + return (Instruction) predecessors().get(j); + } + + /** + * Gets the state after the instruction, if it is recorded. + * @return the state after the instruction + */ + public FrameState stateAfter() { + return null; + } +}