# HG changeset patch # User Peter Hofer # Date 1327317666 -3600 # Node ID 4c223446c28e4150abb35b0b45eb0c50e75795ea # Parent 9ce8594bedafcd5f593d1c4296bd0a01f164fdc9 Replace the eagerResolving option of GraphBuilderConfiguration with three resolve policies: Default, EagerForSnippets (previously eagerResolving), and Eager (resolves exceptions and types of constants as well) diff -r 9ce8594bedaf -r 4c223446c28e graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderConfiguration.java --- a/graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderConfiguration.java Thu Jan 19 14:14:36 2012 -0800 +++ b/graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderConfiguration.java Mon Jan 23 12:21:06 2012 +0100 @@ -26,13 +26,18 @@ import com.oracle.max.graal.compiler.phases.*; public class GraphBuilderConfiguration { + + public static enum ResolvePolicy { + Default, EagerForSnippets, Eager, + } + private final boolean useBranchPrediction; - private final boolean eagerResolving; + private final ResolvePolicy resolving; private final PhasePlan plan; - public GraphBuilderConfiguration(boolean useBranchPrediction, boolean eagerResolving, PhasePlan plan) { + public GraphBuilderConfiguration(boolean useBranchPrediction, ResolvePolicy resolving, PhasePlan plan) { this.useBranchPrediction = useBranchPrediction; - this.eagerResolving = eagerResolving; + this.resolving = resolving; this.plan = plan; } @@ -40,8 +45,12 @@ return useBranchPrediction; } + public boolean eagerResolvingForSnippets() { + return (resolving == ResolvePolicy.EagerForSnippets || resolving == ResolvePolicy.Eager); + } + public boolean eagerResolving() { - return eagerResolving; + return (resolving == ResolvePolicy.Eager); } public PhasePlan plan() { @@ -53,14 +62,14 @@ } public static GraphBuilderConfiguration getDefault(PhasePlan plan) { - return new GraphBuilderConfiguration(GraalOptions.UseBranchPrediction, false, plan); + return new GraphBuilderConfiguration(GraalOptions.UseBranchPrediction, ResolvePolicy.Default, plan); } - public static GraphBuilderConfiguration getDeoptFreeDefault() { - return getDeoptFreeDefault(null); + public static GraphBuilderConfiguration getSnippetDefault() { + return getSnippetDefault(null); } - public static GraphBuilderConfiguration getDeoptFreeDefault(PhasePlan plan) { - return new GraphBuilderConfiguration(false, true, plan); + public static GraphBuilderConfiguration getSnippetDefault(PhasePlan plan) { + return new GraphBuilderConfiguration(false, ResolvePolicy.EagerForSnippets, plan); } } diff -r 9ce8594bedaf -r 4c223446c28e graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderPhase.java Thu Jan 19 14:14:36 2012 -0800 +++ b/graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderPhase.java Mon Jan 23 12:21:06 2012 +0100 @@ -30,18 +30,19 @@ import com.oracle.max.cri.ci.*; import com.oracle.max.cri.ri.*; -import com.oracle.max.cri.ri.RiType.*; +import com.oracle.max.cri.ri.RiType.Representation; import com.oracle.max.criutils.*; import com.oracle.max.graal.compiler.*; import com.oracle.max.graal.compiler.phases.*; import com.oracle.max.graal.compiler.schedule.*; import com.oracle.max.graal.compiler.util.*; import com.oracle.max.graal.graph.*; -import com.oracle.max.graal.java.BlockMap.*; +import com.oracle.max.graal.java.BlockMap.Block; +import com.oracle.max.graal.java.BlockMap.DeoptBlock; +import com.oracle.max.graal.java.BlockMap.ExceptionBlock; import com.oracle.max.graal.nodes.*; import com.oracle.max.graal.nodes.DeoptimizeNode.DeoptAction; import com.oracle.max.graal.nodes.PhiNode.PhiType; -import com.oracle.max.graal.java.BlockMap.Block; import com.oracle.max.graal.nodes.calc.*; import com.oracle.max.graal.nodes.extended.*; import com.oracle.max.graal.nodes.java.*; @@ -381,12 +382,15 @@ return p; } - private void genLoadConstant(int cpi) { + private void genLoadConstant(int cpi, int opcode) { Object con = constantPool.lookupConstant(cpi); if (con instanceof RiType) { // this is a load of class constant which might be unresolved RiType riType = (RiType) con; + if (config.eagerResolving() && !(riType instanceof RiResolvedType)) { + riType = lookupType(cpi, opcode); + } if (riType instanceof RiResolvedType) { frameState.push(CiKind.Object, append(ConstantNode.forCiConstant(((RiResolvedType) riType).getEncoding(Representation.JavaClass), runtime, currentGraph))); } else { @@ -650,28 +654,28 @@ } private RiType lookupType(int cpi, int bytecode) { - eagerResolving(cpi, bytecode); + eagerResolvingForSnippets(cpi, bytecode); RiType result = constantPool.lookupType(cpi, bytecode); - assert !config.eagerResolving() || result instanceof RiResolvedType; + assert !config.eagerResolvingForSnippets() || result instanceof RiResolvedType; return result; } private RiMethod lookupMethod(int cpi, int opcode) { - eagerResolving(cpi, opcode); + eagerResolvingForSnippets(cpi, opcode); RiMethod result = constantPool.lookupMethod(cpi, opcode); - assert !config.eagerResolving() || ((result instanceof RiResolvedMethod) && ((RiResolvedMethod) result).holder().isInitialized()); + assert !config.eagerResolvingForSnippets() || ((result instanceof RiResolvedMethod) && ((RiResolvedMethod) result).holder().isInitialized()); return result; } private RiField lookupField(int cpi, int opcode) { - eagerResolving(cpi, opcode); + eagerResolvingForSnippets(cpi, opcode); RiField result = constantPool.lookupField(cpi, opcode); - assert !config.eagerResolving() || (result instanceof RiResolvedField && ((RiResolvedField) result).holder().isInitialized()); + assert !config.eagerResolvingForSnippets() || (result instanceof RiResolvedField && ((RiResolvedField) result).holder().isInitialized()); return result; } - private void eagerResolving(int cpi, int bytecode) { - if (config.eagerResolving()) { + private void eagerResolvingForSnippets(int cpi, int bytecode) { + if (config.eagerResolvingForSnippets()) { constantPool.loadReferencedType(cpi, bytecode); } } @@ -1386,6 +1390,9 @@ assert frameState.stackSize() == 1 : frameState; RiType catchType = block.handler.catchType(); + if (config.eagerResolving()) { + catchType = lookupType(block.handler.catchTypeCPI(), INSTANCEOF); + } ConstantNode typeInstruction = genTypeOrDeopt(RiType.Representation.ObjectHub, catchType, (catchType instanceof RiResolvedType) && ((RiResolvedType) catchType).isInitialized()); if (typeInstruction != null) { Block nextBlock = block.successors.size() == 1 ? unwindBlock(block.deoptBci) : block.successors.get(1); @@ -1483,7 +1490,7 @@ case SIPUSH : frameState.ipush(appendConstant(CiConstant.forInt(stream.readShort()))); break; case LDC : // fall through case LDC_W : // fall through - case LDC2_W : genLoadConstant(stream.readCPI()); break; + case LDC2_W : genLoadConstant(stream.readCPI(), opcode); break; case ILOAD : loadLocal(stream.readLocalIndex(), CiKind.Int); break; case LLOAD : loadLocal(stream.readLocalIndex(), CiKind.Long); break; case FLOAD : loadLocal(stream.readLocalIndex(), CiKind.Float); break; diff -r 9ce8594bedaf -r 4c223446c28e graal/com.oracle.max.graal.snippets/src/com/oracle/max/graal/snippets/Snippets.java --- a/graal/com.oracle.max.graal.snippets/src/com/oracle/max/graal/snippets/Snippets.java Thu Jan 19 14:14:36 2012 -0800 +++ b/graal/com.oracle.max.graal.snippets/src/com/oracle/max/graal/snippets/Snippets.java Mon Jan 23 12:21:06 2012 +0100 @@ -128,7 +128,7 @@ private static StructuredGraph buildSnippetGraph(RiResolvedMethod snippetRiMethod, GraalRuntime runtime, CiTarget target, GraalContext context, BoxingMethodPool pool, PhasePlan plan, IdealGraphPrinterObserver observer) { - GraphBuilderConfiguration config = GraphBuilderConfiguration.getDeoptFreeDefault(); + GraphBuilderConfiguration config = GraphBuilderConfiguration.getSnippetDefault(); GraphBuilderPhase graphBuilder = new GraphBuilderPhase(runtime, config); StructuredGraph graph = new StructuredGraph(snippetRiMethod); graphBuilder.apply(graph, context); diff -r 9ce8594bedaf -r 4c223446c28e graal/com.oracle.max.graal.tests/src/com/oracle/max/graal/compiler/tests/GraphTest.java --- a/graal/com.oracle.max.graal.tests/src/com/oracle/max/graal/compiler/tests/GraphTest.java Thu Jan 19 14:14:36 2012 -0800 +++ b/graal/com.oracle.max.graal.tests/src/com/oracle/max/graal/compiler/tests/GraphTest.java Mon Jan 23 12:21:06 2012 +0100 @@ -103,13 +103,13 @@ protected StructuredGraph parse(Method m) { RiResolvedMethod riMethod = runtime.getRiMethod(m); StructuredGraph graph = new StructuredGraph(riMethod); - new GraphBuilderPhase(runtime, GraphBuilderConfiguration.getDeoptFreeDefault()).apply(graph); + new GraphBuilderPhase(runtime, GraphBuilderConfiguration.getSnippetDefault()).apply(graph); return graph; } protected PhasePlan getDefaultPhasePlan() { PhasePlan plan = new PhasePlan(); - plan.addPhase(PhasePosition.AFTER_PARSING, new GraphBuilderPhase(runtime, GraphBuilderConfiguration.getDeoptFreeDefault())); + plan.addPhase(PhasePosition.AFTER_PARSING, new GraphBuilderPhase(runtime, GraphBuilderConfiguration.getSnippetDefault())); return plan; }