# HG changeset patch # User Thomas Wuerthinger # Date 1307633336 -7200 # Node ID cd4176d590e78009abf4a26e885249bfdf5e9765 # Parent bf15ed11c2bc3778bd596bd1bcd63d6b6dacfd75 Towards lowering phase. diff -r bf15ed11c2bc -r cd4176d590e7 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java Thu Jun 09 14:56:14 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java Thu Jun 09 17:28:56 2011 +0200 @@ -397,6 +397,9 @@ DeoptimizationStub stub = new DeoptimizationStub(state); deoptimizationStubs.add(stub); + + emitCompare(x.node()); + //emitBranch(x.node(), stub.label) throw new RuntimeException(); //lir.branch(x.condition.negate(), stub.label, stub.info); } diff -r bf15ed11c2bc -r cd4176d590e7 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessField.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessField.java Thu Jun 09 14:56:14 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessField.java Thu Jun 09 17:28:56 2011 +0200 @@ -74,6 +74,8 @@ super(kind, inputCount + INPUT_COUNT, successorCount + SUCCESSOR_COUNT, graph); this.field = field; setObject(object); + assert field.isResolved(); + assert field.holder().isResolved(); } /** @@ -93,18 +95,10 @@ } /** - * Checks whether the class of the field of this access is loaded. - * @return {@code true} if the class is loaded - */ - public boolean isLoaded() { - return field.isResolved(); - } - - /** * Checks whether this field is declared volatile. * @return {@code true} if the field is resolved and declared volatile */ public boolean isVolatile() { - return isLoaded() && Modifier.isVolatile(field.accessFlags()); + return Modifier.isVolatile(field.accessFlags()); } } diff -r bf15ed11c2bc -r cd4176d590e7 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ArrayLength.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ArrayLength.java Thu Jun 09 14:56:14 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ArrayLength.java Thu Jun 09 17:28:56 2011 +0200 @@ -126,9 +126,7 @@ return length; } CiConstant constantValue = null; - if (array instanceof LoadField) { - constantValue = ((LoadField) array).constantValue(); - } else if (array.isConstant()) { + if (array.isConstant()) { constantValue = array.asConstant(); } if (constantValue != null && constantValue.isNonNull()) { diff -r bf15ed11c2bc -r cd4176d590e7 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/GuardNode.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/GuardNode.java Thu Jun 09 14:56:14 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/GuardNode.java Thu Jun 09 17:28:56 2011 +0200 @@ -36,12 +36,12 @@ /** * The instruction that produces the object tested against null. */ - public FloatingNode node() { - return (FloatingNode) inputs().get(super.inputCount() + INPUT_NODE); + public Compare node() { + return (Compare) inputs().get(super.inputCount() + INPUT_NODE); } - public FloatingNode setNode(FloatingNode n) { - return (FloatingNode) inputs().set(super.inputCount() + INPUT_NODE, n); + public Compare setNode(Compare n) { + return (Compare) inputs().set(super.inputCount() + INPUT_NODE, n); } public GuardNode(Graph graph) { diff -r bf15ed11c2bc -r cd4176d590e7 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadField.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadField.java Thu Jun 09 14:56:14 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadField.java Thu Jun 09 17:28:56 2011 +0200 @@ -68,8 +68,8 @@ */ @Override public RiType exactType() { - RiType declaredType = declaredType(); - return declaredType.isResolved() ? declaredType.exactType() : null; + RiType declared = declaredType(); + return declared != null && declared.isResolved() ? declared.exactType() : null; } @Override @@ -97,7 +97,7 @@ * * @return {@code null} if this load cannot be reduced to a constant */ - public CiConstant constantValue() { + private CiConstant constantValue() { if (isStatic()) { return field.constantValue(null); } else if (object().isConstant()) { @@ -108,8 +108,7 @@ @Override public Node copy(Graph into) { - LoadField x = new LoadField(null, field, into); - return x; + return new LoadField(null, field, into); } @SuppressWarnings("unchecked") diff -r bf15ed11c2bc -r cd4176d590e7 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoweringPhase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoweringPhase.java Thu Jun 09 17:28:56 2011 +0200 @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2011, 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.max.graal.compiler.phases; + +import java.util.*; + +import com.oracle.max.graal.compiler.*; +import com.oracle.max.graal.compiler.ir.*; +import com.oracle.max.graal.compiler.schedule.*; +import com.oracle.max.graal.graph.*; + +public class LoweringPhase extends Phase { + @Override + protected void run(Graph graph) { + NodeMap javaBlockNodes = graph.createNodeMap(); + NodeBitMap nodeBitMap = graph.createNodeBitMap(); + for (Node n : graph.getNodes()) { + if (n instanceof FixedNode) { + LoweringOp op = n.lookup(LoweringOp.class); + if (op != null) { + Node javaBlockNode = getJavaBlockNode(javaBlockNodes, n, nodeBitMap); + } + } + + } + } + + private Node getJavaBlockNode(NodeMap javaBlockNodes, Node n, NodeBitMap nodeBitMap) { + assert n instanceof FixedNode; + if (javaBlockNodes.get(n) == null) { + + Node truePred = null; + int count = 0; + for (Node pred : n.predecessors()) { + if (pred instanceof FixedNode) { + truePred = pred; + count++; + } + } + + assert count > 0; + if (count == 1) { + if (Schedule.trueSuccessorCount(truePred) == 1) { + javaBlockNodes.set(n, getJavaBlockNode(javaBlockNodes, truePred, nodeBitMap)); + } else { + // Single predecessor is a split => we are our own block node. + javaBlockNodes.set(n, n); + } + } else { + Node dominator = null; + for (Node pred : n.predecessors()) { + if (pred instanceof FixedNode) { + dominator = getCommonDominator(dominator, pred, nodeBitMap); + } + } + } + } + + assert Schedule.truePredecessorCount(javaBlockNodes.get(n)) == 1; + return javaBlockNodes.get(n); + } + + private Node getCommonDominator(Node a, Node b, NodeBitMap map) { + if (a == null) { + return b; + } + + if (b == null) { + return a; + } + + + map.clearAll(); + } + + public interface LoweringOp extends Op { + Node lower(Node node); + } +} diff -r bf15ed11c2bc -r cd4176d590e7 graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java --- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java Thu Jun 09 14:56:14 2011 +0200 +++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java Thu Jun 09 17:28:56 2011 +0200 @@ -65,6 +65,10 @@ check(node); bitMap.clear(node.id()); } + + public void clearAll() { + bitMap.clearAll(); + } private void check(Node node) { assert node.graph == graph : "this node is not part of the graph";