# HG changeset patch # User Andreas Woess # Date 1433347627 -7200 # Node ID 5db03b62b621ec77ab5b07b623f3f124f410c6cf # Parent b939ee385ae440db8cab71adc5f318863787bb89 Truffle: fix FastPE regression diff -r b939ee385ae4 -r 5db03b62b621 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 Jun 03 17:43:21 2015 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Wed Jun 03 18:07:07 2015 +0200 @@ -143,6 +143,30 @@ } } + private class InterceptLoadFieldPlugin implements NodePlugin { + public boolean handleLoadField(GraphBuilderContext builder, ValueNode receiver, ResolvedJavaField field) { + if (receiver.isConstant()) { + JavaConstant asJavaConstant = receiver.asJavaConstant(); + return tryConstantFold(builder, field, asJavaConstant); + } + return false; + } + + public boolean handleLoadStaticField(GraphBuilderContext builder, ResolvedJavaField field) { + return tryConstantFold(builder, field, null); + } + + private boolean tryConstantFold(GraphBuilderContext b, ResolvedJavaField field, JavaConstant object) { + JavaConstant result = providers.getConstantReflection().readConstantFieldValue(field, object); + if (result != null) { + ConstantNode constantNode = ConstantNode.forConstant(result, providers.getMetaAccess(), b.getGraph()); + b.push(field.getKind(), constantNode); + return true; + } + return false; + } + } + private class PEInlineInvokePlugin implements InlineInvokePlugin { private Deque inlining; @@ -273,6 +297,7 @@ newConfig.setUseProfiling(false); Plugins plugins = newConfig.getPlugins(); plugins.prependParameterPlugin(new InterceptReceiverPlugin(callTarget)); + plugins.prependNodePlugin(new InterceptLoadFieldPlugin()); callTarget.setInlining(new TruffleInlining(callTarget, new DefaultInliningPolicy())); plugins.setLoopExplosionPlugin(new PELoopExplosionPlugin());