changeset 10689:3ae117e62905

Removed frame argument for generic cases if not needed. Added @SlowPath annotation to generated generic cases.
author Christian Humer <christian.humer@gmail.com>
date Wed, 10 Jul 2013 09:23:15 +0200
parents 87d2df0a7624
children a0309f88306c
files graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/TruffleTypes.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java
diffstat 3 files changed, 36 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/TruffleTypes.java	Wed Jul 10 05:27:45 2013 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/TruffleTypes.java	Wed Jul 10 09:23:15 2013 +0200
@@ -29,6 +29,7 @@
 import javax.tools.Diagnostic.Kind;
 
 import com.oracle.truffle.api.*;
+import com.oracle.truffle.api.CompilerDirectives.*;
 import com.oracle.truffle.api.frame.*;
 import com.oracle.truffle.api.nodes.*;
 import com.oracle.truffle.api.nodes.Node.Child;
@@ -51,6 +52,7 @@
     private final DeclaredType nodeInfoKind;
     private final TypeMirror compilerDirectives;
     private final TypeMirror compilerAsserts;
+    private final DeclaredType slowPath;
 
     private final List<String> errors = new ArrayList<>();
 
@@ -67,6 +69,7 @@
         invalidAssumption = getRequired(context, InvalidAssumptionException.class);
         nodeInfoAnnotation = getRequired(context, NodeInfo.class);
         nodeInfoKind = getRequired(context, NodeInfo.Kind.class);
+        slowPath = getRequired(context, SlowPath.class);
     }
 
     public DeclaredType getNodeInfoAnnotation() {
@@ -136,4 +139,8 @@
     public TypeMirror getCompilerAsserts() {
         return compilerAsserts;
     }
+
+    public DeclaredType getSlowPath() {
+        return slowPath;
+    }
 }
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java	Wed Jul 10 05:27:45 2013 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java	Wed Jul 10 09:23:15 2013 +0200
@@ -1449,7 +1449,10 @@
         private CodeExecutableElement createGenericExecute(NodeData node) {
             TypeMirror genericReturnType = node.getGenericSpecialization().getReturnType().getType();
             CodeExecutableElement method = new CodeExecutableElement(modifiers(PROTECTED), genericReturnType, EXECUTE_GENERIC_NAME);
-            addInternalValueParameters(method, node.getGenericSpecialization(), true, false);
+
+            method.getAnnotationMirrors().add(new CodeAnnotationMirror(getContext().getTruffleTypes().getSlowPath()));
+
+            addInternalValueParameters(method, node.getGenericSpecialization(), false, false);
             CodeTreeBuilder builder = method.createBuilder();
 
             String prefix = null;
@@ -2251,7 +2254,7 @@
             builder.end();
 
             builder.startReturn().startCall("super", EXECUTE_GENERIC_NAME);
-            addInternalValueParameterNames(builder, specialization, node.getGenericSpecialization(), null, true, true);
+            addInternalValueParameterNames(builder, specialization, node.getGenericSpecialization(), null, false, true);
             builder.end().end();
 
             builder.end().startElseBlock();
@@ -2417,7 +2420,7 @@
                 emitEncounteredSynthetic(builder, specialization);
             } else if (specialization.isGeneric()) {
                 returnBuilder.startCall("super", EXECUTE_GENERIC_NAME);
-                addInternalValueParameterNames(returnBuilder, specialization, specialization, null, true, true);
+                addInternalValueParameterNames(returnBuilder, specialization, specialization, null, false, true);
                 returnBuilder.end();
             } else {
                 returnBuilder.tree(createTemplateMethodCall(returnBuilder, null, specialization, specialization, null));
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java	Wed Jul 10 05:27:45 2013 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java	Wed Jul 10 09:23:15 2013 +0200
@@ -41,6 +41,8 @@
 
 public class NodeParser extends TemplateParser<NodeData> {
 
+    private static final String FRAME_VALUE = "frameValue";
+
     public static final List<Class<? extends Annotation>> ANNOTATIONS = Arrays.asList(Generic.class, TypeSystemReference.class, ShortCircuit.class, Specialization.class, SpecializationListener.class,
                     NodeContainer.class, NodeChild.class, NodeChildren.class, NodeId.class);
 
@@ -653,6 +655,27 @@
             }
         }
 
+        // remove frame parameter of generic if not needed
+        if (genericSpecialization != null) {
+            ActualParameter frame = genericSpecialization.findParameter(FRAME_VALUE);
+            if (frame != null) {
+                boolean frameUsed = false;
+                for (SpecializationData specialization : specializations) {
+                    if (!specialization.isReachable()) {
+                        continue;
+                    }
+                    frameUsed = specialization.findParameter(FRAME_VALUE) != null;
+                    if (frameUsed) {
+                        break;
+                    }
+                }
+
+                if (!frameUsed) {
+                    genericSpecialization.getParameters().remove(frame);
+                }
+            }
+        }
+
         if (node.getPolymorphicDepth() < 0) {
             node.setPolymorphicDepth(specializationCount - 1);
         }