# HG changeset patch # User Christian Humer # Date 1373440995 -7200 # Node ID 3ae117e62905e34b146fe7a7bfa70fba5b1ca268 # Parent 87d2df0a7624fe3c533eeca59e35efc3c3263ecb Removed frame argument for generic cases if not needed. Added @SlowPath annotation to generated generic cases. diff -r 87d2df0a7624 -r 3ae117e62905 graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/TruffleTypes.java --- 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 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; + } } diff -r 87d2df0a7624 -r 3ae117e62905 graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java --- 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)); diff -r 87d2df0a7624 -r 3ae117e62905 graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java --- 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 { + private static final String FRAME_VALUE = "frameValue"; + public static final List> 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); }