changeset 17251:6ee7afea175a

Truffle-DSL: Fixed @SlowPath was not applied to certain specialize0 implementations. This will reduce the pressure on the truffle cache.
author Christian Humer <christian.humer@gmail.com>
date Mon, 29 Sep 2014 18:37:24 +0200
parents 9f001294893d
children 1680a4ddc2a7
files graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/NodeData.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/SpecializationData.java
diffstat 3 files changed, 23 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java	Mon Sep 29 18:37:24 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java	Mon Sep 29 18:37:24 2014 +0200
@@ -1249,7 +1249,7 @@
 
             CodeTreeBuilder createSpecializationCall = builder.create();
             createSpecializationCall.startCall(SPECIALIZE);
-            addInternalValueParameterNames(createSpecializationCall, generic, generic, null, node.needsFrame(getContext()), null);
+            addInternalValueParameterNames(createSpecializationCall, generic, generic, null, node.isFrameUsedByAnyGuard(getContext()), null);
             createSpecializationCall.end();
             builder.declaration(baseClassName(node), "newNode", createSpecializationCall);
 
@@ -1302,7 +1302,7 @@
             String baseClassName = baseClassName(getModel().getNode());
             CodeTreeBuilder createSpecializationCall = builder.create();
             createSpecializationCall.startCall(SPECIALIZE);
-            addInternalValueParameterNames(createSpecializationCall, generic, generic, null, node.needsFrame(getContext()), null);
+            addInternalValueParameterNames(createSpecializationCall, generic, generic, null, node.isFrameUsedByAnyGuard(getContext()), null);
             createSpecializationCall.end();
             builder.declaration(baseClassName, "newNode", createSpecializationCall);
 
@@ -1356,16 +1356,19 @@
         private CodeExecutableElement createCreateSpecializationMethod(NodeData node, SpecializationGroup group) {
             CodeExecutableElement method = new CodeExecutableElement(modifiers(PROTECTED, FINAL), new GeneratedTypeMirror(ElementUtils.getPackageName(node.getTemplateType()), baseClassName(node)),
                             SPECIALIZE);
-            if (!node.needsFrame(getContext())) {
+
+            final boolean needsFrame = node.isFrameUsedByAnyGuard(getContext());
+
+            if (!needsFrame) {
                 method.getAnnotationMirrors().add(new CodeAnnotationMirror(getContext().getTruffleTypes().getSlowPath()));
             }
 
-            addInternalValueParameters(method, node.getGenericSpecialization(), node.needsFrame(getContext()), false);
+            addInternalValueParameters(method, node.getGenericSpecialization(), needsFrame, false);
             final CodeTreeBuilder builder = method.createBuilder();
             builder.tree(createExecuteTree(builder, node.getGenericSpecialization(), group, new CodeBlock<SpecializationData>() {
 
                 public CodeTree create(CodeTreeBuilder b, SpecializationData current) {
-                    return createCreateSpecializationMethodBody0(builder, current);
+                    return createCreateSpecializationMethodBody0(builder, current, needsFrame);
                 }
             }, null, false, true, false, true));
 
@@ -1374,7 +1377,7 @@
             return method;
         }
 
-        protected CodeTree createCreateSpecializationMethodBody0(CodeTreeBuilder parent, SpecializationData current) {
+        protected CodeTree createCreateSpecializationMethodBody0(CodeTreeBuilder parent, SpecializationData current, boolean useDeoptimize) {
             CodeTreeBuilder builder = new CodeTreeBuilder(parent);
             if (current.isGeneric()) {
                 builder.startReturn().nullLiteral().end();
@@ -1386,7 +1389,7 @@
                     builder.startBlock();
                 }
 
-                if (current.getNode().getGenericSpecialization().isReachable()) {
+                if (current.getNode().getGenericSpecialization().isReachable() && useDeoptimize) {
                     builder.tree(createDeoptimize(builder));
                 }
                 builder.startReturn();
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/NodeData.java	Mon Sep 29 18:37:24 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/NodeData.java	Mon Sep 29 18:37:24 2014 +0200
@@ -99,12 +99,12 @@
         return 0;
     }
 
-    public boolean needsFrame(ProcessorContext context) {
+    public boolean isFrameUsedByAnyGuard(ProcessorContext context) {
         for (SpecializationData specialization : specializations) {
             if (!specialization.isReachable()) {
                 continue;
             }
-            if (specialization.hasFrame(context)) {
+            if (specialization.isFrameUsedByGuard(context)) {
                 return true;
             }
         }
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/SpecializationData.java	Mon Sep 29 18:37:24 2014 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/SpecializationData.java	Mon Sep 29 18:37:24 2014 +0200
@@ -287,12 +287,19 @@
         return String.format("%s [id = %s, method = %s, guards = %s, signature = %s]", getClass().getSimpleName(), getId(), getMethod(), getGuards(), getTypeSignature());
     }
 
-    public boolean hasFrame(ProcessorContext context) {
-        for (Parameter param : getParameters()) {
-            if (ElementUtils.typeEquals(param.getType(), context.getTruffleTypes().getFrame())) {
-                return true;
+    public boolean isFrameUsedByGuard(ProcessorContext context) {
+        for (GuardExpression guard : getGuards()) {
+            if (guard.getResolvedGuard() == null) {
+                continue;
+            }
+
+            for (Parameter param : guard.getResolvedGuard().getParameters()) {
+                if (ElementUtils.typeEquals(param.getType(), context.getTruffleTypes().getFrame())) {
+                    return true;
+                }
             }
         }
+
         return false;
     }