Mercurial > hg > truffle
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; }