Mercurial > hg > truffle
changeset 21704:5db03b62b621
Truffle: fix FastPE regression
author | Andreas Woess <andreas.woess@oracle.com> |
---|---|
date | Wed, 03 Jun 2015 18:07:07 +0200 |
parents | b939ee385ae4 |
children | 729e6acde6c0 |
files | graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java |
diffstat | 1 files changed, 25 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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<TruffleInlining> 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());