# HG changeset patch # User Christian Humer # Date 1412008644 -7200 # Node ID 6ee7afea175afd1ff01005fbd5a65a9b93fc1a7c # Parent 9f001294893da8d08c0725cc6654a429111a3258 Truffle-DSL: Fixed @SlowPath was not applied to certain specialize0 implementations. This will reduce the pressure on the truffle cache. diff -r 9f001294893d -r 6ee7afea175a graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java --- 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() { 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(); diff -r 9f001294893d -r 6ee7afea175a graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/NodeData.java --- 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; } } diff -r 9f001294893d -r 6ee7afea175a graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/model/SpecializationData.java --- 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; }