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());