Mercurial > hg > truffle
changeset 16781:e2ebaf1e1b74
Truffle-DSL: fixed uninitialized triggered a deopt even if fallback was set to true.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Tue, 12 Aug 2014 01:34:02 +0200 |
parents | 534439756990 |
children | 9f5e33cf8d52 |
files | graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java |
diffstat | 1 files changed, 18 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java Tue Aug 12 01:34:02 2014 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java Tue Aug 12 01:34:02 2014 +0200 @@ -1262,7 +1262,8 @@ builder.tree(createGenericInvoke(builder, generic, generic)); builder.end(); builder.startElseBlock(); - builder.startStatement().startStaticCall(context.getTruffleTypes().getCompilerDirectives(), "transferToInterpreterAndInvalidate").end().end(); + builder.tree(createDeoptimize(builder)); + builder.end(); } builder.startReturn(); @@ -1386,7 +1387,7 @@ } if (current.getNode().getGenericSpecialization().isReachable()) { - builder.startStatement().startStaticCall(context.getTruffleTypes().getCompilerDirectives(), "transferToInterpreterAndInvalidate").end().end(); + builder.tree(createDeoptimize(builder)); } builder.startReturn(); builder.cast(baseClassName(getModel().getNode())); @@ -2651,13 +2652,7 @@ addInternalValueParameterNames(builder, polymorphic, polymorphic, null, true, null); builder.end().end(); } else if (specialization.isUninitialized()) { - if (node.getGenericSpecialization().isReachable()) { - builder.startIf().string("!containsFallback").end().startBlock(); - builder.startStatement().startStaticCall(context.getTruffleTypes().getCompilerDirectives(), "transferToInterpreterAndInvalidate").end().end(); - builder.end(); - } else { - builder.startStatement().startStaticCall(context.getTruffleTypes().getCompilerDirectives(), "transferToInterpreterAndInvalidate").end().end(); - } + builder.tree(createDeoptimizeUninitialized(node, builder)); builder.startReturn().startCall("this", EXECUTE_UNINITIALIZED); addInternalValueParameterNames(builder, polymorphic, polymorphic, null, true, null); builder.end().end(); @@ -2677,6 +2672,18 @@ clazz.add(executeMethod); } + private CodeTree createDeoptimizeUninitialized(NodeData node, CodeTreeBuilder parent) { + CodeTreeBuilder builder = parent.create(); + if (node.getGenericSpecialization().isReachable()) { + builder.startIf().string("!containsFallback").end().startBlock(); + builder.tree(createDeoptimize(builder)); + builder.end(); + } else { + builder.tree(createDeoptimize(builder)); + } + return builder.getRoot(); + } + private CodeTree createExecuteBody(CodeTreeBuilder parent, SpecializationData specialization, ExecutableTypeData execType) { CodeTreeBuilder builder = new CodeTreeBuilder(parent); @@ -2799,8 +2806,9 @@ private CodeTree createFunctionalExecute(CodeTreeBuilder parent, final SpecializationData specialization, final ExecutableTypeData executable) { CodeTreeBuilder builder = new CodeTreeBuilder(parent); + if (specialization.isUninitialized()) { - builder.tree(createDeoptimize(builder)); + builder.tree(createDeoptimizeUninitialized(specialization.getNode(), builder)); } builder.tree(createExecuteChildren(builder, executable, specialization, specialization.getParameters(), null));