# HG changeset patch # User Thomas Wuerthinger # Date 1423011579 -3600 # Node ID 844ee652443f92751b7d66e00fbd5650fc11da71 # Parent c2019f6e821b49d2d819c1dd90586ff8297bf667 Canonicalize load fields on constant receivers at partial evaluation parse time. diff -r c2019f6e821b -r 844ee652443f graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Wed Feb 04 01:41:30 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Wed Feb 04 01:59:39 2015 +0100 @@ -1010,7 +1010,6 @@ } public T append(T v) { - assert !(v instanceof ConstantNode); T added = currentGraph.unique(v); return added; } diff -r c2019f6e821b -r 844ee652443f graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Wed Feb 04 01:41:30 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Wed Feb 04 01:59:39 2015 +0100 @@ -141,14 +141,23 @@ return graph; } - private static final GraphBuilderPlugins.LoadFieldPlugin loadFieldPlugin = new GraphBuilderPlugins.LoadFieldPlugin() { + private class InterceptLoadFieldPlugin implements GraphBuilderPlugins.LoadFieldPlugin { public boolean apply(GraphBuilderContext builder, ValueNode receiver, ResolvedJavaField field) { System.out.println("Load field plugin called for receiver: " + receiver + " and field " + field); + + if (receiver.isConstant()) { + JavaConstant asJavaConstant = receiver.asJavaConstant(); + JavaConstant result = providers.getConstantReflection().readConstantFieldValue(field, asJavaConstant); + if (result != null) { + ConstantNode constantNode = builder.append(ConstantNode.forConstant(result, providers.getMetaAccess())); + builder.push(constantNode.getKind(), constantNode); + return true; + } + } return false; } - - }; + } private class InterceptReceiverPlugin implements GraphBuilderPlugins.ParameterPlugin { @@ -169,7 +178,7 @@ @SuppressWarnings("unused") private void fastPartialEvaluation(OptimizedCallTarget callTarget, Assumptions assumptions, StructuredGraph graph, PhaseContext baseContext, HighTierContext tierContext) { GraphBuilderConfiguration newConfig = configForRoot.copy(); - newConfig.setLoadFieldPlugin(loadFieldPlugin); + newConfig.setLoadFieldPlugin(new InterceptLoadFieldPlugin()); newConfig.setParameterPlugin(new InterceptReceiverPlugin(callTarget)); new GraphBuilderPhase.Instance(providers.getMetaAccess(), providers.getStampProvider(), new Assumptions(false), newConfig, TruffleCompilerImpl.Optimizations).apply(graph); Debug.dump(graph, "After FastPE");