# HG changeset patch # User Christian Humer # Date 1407800042 -7200 # Node ID e2ebaf1e1b74d2675e49bbb827485a515a4c628b # Parent 5344397569904fbaa1af1fe175f7f994bce40d1a Truffle-DSL: fixed uninitialized triggered a deopt even if fallback was set to true. diff -r 534439756990 -r e2ebaf1e1b74 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 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));