Mercurial > hg > graal-compiler
comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java @ 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 | e6d15134ca86 |
children | 224a89858453 |
comparison
equal
deleted
inserted
replaced
16780:534439756990 | 16781:e2ebaf1e1b74 |
---|---|
1260 builder.statement("containsFallback = true"); | 1260 builder.statement("containsFallback = true"); |
1261 builder.end(); | 1261 builder.end(); |
1262 builder.tree(createGenericInvoke(builder, generic, generic)); | 1262 builder.tree(createGenericInvoke(builder, generic, generic)); |
1263 builder.end(); | 1263 builder.end(); |
1264 builder.startElseBlock(); | 1264 builder.startElseBlock(); |
1265 builder.startStatement().startStaticCall(context.getTruffleTypes().getCompilerDirectives(), "transferToInterpreterAndInvalidate").end().end(); | 1265 builder.tree(createDeoptimize(builder)); |
1266 builder.end(); | |
1266 } | 1267 } |
1267 | 1268 |
1268 builder.startReturn(); | 1269 builder.startReturn(); |
1269 builder.startStaticCall(context.getTruffleTypes().getDslShare(), "rewriteUninitialized").string("this").string("newNode").end(); | 1270 builder.startStaticCall(context.getTruffleTypes().getDslShare(), "rewriteUninitialized").string("this").string("newNode").end(); |
1270 builder.string(".").startCall(EXECUTE_CHAINED); | 1271 builder.string(".").startCall(EXECUTE_CHAINED); |
1384 builder.string("this").string(nodeSpecializationClassName(current), ".", METADATA_FIELD_NAME).end().end(); | 1385 builder.string("this").string(nodeSpecializationClassName(current), ".", METADATA_FIELD_NAME).end().end(); |
1385 builder.startBlock(); | 1386 builder.startBlock(); |
1386 } | 1387 } |
1387 | 1388 |
1388 if (current.getNode().getGenericSpecialization().isReachable()) { | 1389 if (current.getNode().getGenericSpecialization().isReachable()) { |
1389 builder.startStatement().startStaticCall(context.getTruffleTypes().getCompilerDirectives(), "transferToInterpreterAndInvalidate").end().end(); | 1390 builder.tree(createDeoptimize(builder)); |
1390 } | 1391 } |
1391 builder.startReturn(); | 1392 builder.startReturn(); |
1392 builder.cast(baseClassName(getModel().getNode())); | 1393 builder.cast(baseClassName(getModel().getNode())); |
1393 builder.startGroup().startCall(className, FACTORY_METHOD_NAME).string("this"); | 1394 builder.startGroup().startCall(className, FACTORY_METHOD_NAME).string("this"); |
1394 for (Parameter param : current.getSignatureParameters()) { | 1395 for (Parameter param : current.getSignatureParameters()) { |
2649 if (specialization.isPolymorphic()) { | 2650 if (specialization.isPolymorphic()) { |
2650 builder.startReturn().startCall("this.next0", EXECUTE_CHAINED); | 2651 builder.startReturn().startCall("this.next0", EXECUTE_CHAINED); |
2651 addInternalValueParameterNames(builder, polymorphic, polymorphic, null, true, null); | 2652 addInternalValueParameterNames(builder, polymorphic, polymorphic, null, true, null); |
2652 builder.end().end(); | 2653 builder.end().end(); |
2653 } else if (specialization.isUninitialized()) { | 2654 } else if (specialization.isUninitialized()) { |
2654 if (node.getGenericSpecialization().isReachable()) { | 2655 builder.tree(createDeoptimizeUninitialized(node, builder)); |
2655 builder.startIf().string("!containsFallback").end().startBlock(); | |
2656 builder.startStatement().startStaticCall(context.getTruffleTypes().getCompilerDirectives(), "transferToInterpreterAndInvalidate").end().end(); | |
2657 builder.end(); | |
2658 } else { | |
2659 builder.startStatement().startStaticCall(context.getTruffleTypes().getCompilerDirectives(), "transferToInterpreterAndInvalidate").end().end(); | |
2660 } | |
2661 builder.startReturn().startCall("this", EXECUTE_UNINITIALIZED); | 2656 builder.startReturn().startCall("this", EXECUTE_UNINITIALIZED); |
2662 addInternalValueParameterNames(builder, polymorphic, polymorphic, null, true, null); | 2657 addInternalValueParameterNames(builder, polymorphic, polymorphic, null, true, null); |
2663 builder.end().end(); | 2658 builder.end().end(); |
2664 } else { | 2659 } else { |
2665 CodeTreeBuilder elseBuilder = new CodeTreeBuilder(builder); | 2660 CodeTreeBuilder elseBuilder = new CodeTreeBuilder(builder); |
2673 return createGenericInvoke(b, polymorphic, current); | 2668 return createGenericInvoke(b, polymorphic, current); |
2674 } | 2669 } |
2675 }, elseBuilder.getRoot(), false, true, true, false)); | 2670 }, elseBuilder.getRoot(), false, true, true, false)); |
2676 } | 2671 } |
2677 clazz.add(executeMethod); | 2672 clazz.add(executeMethod); |
2673 } | |
2674 | |
2675 private CodeTree createDeoptimizeUninitialized(NodeData node, CodeTreeBuilder parent) { | |
2676 CodeTreeBuilder builder = parent.create(); | |
2677 if (node.getGenericSpecialization().isReachable()) { | |
2678 builder.startIf().string("!containsFallback").end().startBlock(); | |
2679 builder.tree(createDeoptimize(builder)); | |
2680 builder.end(); | |
2681 } else { | |
2682 builder.tree(createDeoptimize(builder)); | |
2683 } | |
2684 return builder.getRoot(); | |
2678 } | 2685 } |
2679 | 2686 |
2680 private CodeTree createExecuteBody(CodeTreeBuilder parent, SpecializationData specialization, ExecutableTypeData execType) { | 2687 private CodeTree createExecuteBody(CodeTreeBuilder parent, SpecializationData specialization, ExecutableTypeData execType) { |
2681 CodeTreeBuilder builder = new CodeTreeBuilder(parent); | 2688 CodeTreeBuilder builder = new CodeTreeBuilder(parent); |
2682 | 2689 |
2797 return filteredTypes; | 2804 return filteredTypes; |
2798 } | 2805 } |
2799 | 2806 |
2800 private CodeTree createFunctionalExecute(CodeTreeBuilder parent, final SpecializationData specialization, final ExecutableTypeData executable) { | 2807 private CodeTree createFunctionalExecute(CodeTreeBuilder parent, final SpecializationData specialization, final ExecutableTypeData executable) { |
2801 CodeTreeBuilder builder = new CodeTreeBuilder(parent); | 2808 CodeTreeBuilder builder = new CodeTreeBuilder(parent); |
2809 | |
2802 if (specialization.isUninitialized()) { | 2810 if (specialization.isUninitialized()) { |
2803 builder.tree(createDeoptimize(builder)); | 2811 builder.tree(createDeoptimizeUninitialized(specialization.getNode(), builder)); |
2804 } | 2812 } |
2805 | 2813 |
2806 builder.tree(createExecuteChildren(builder, executable, specialization, specialization.getParameters(), null)); | 2814 builder.tree(createExecuteChildren(builder, executable, specialization, specialization.getParameters(), null)); |
2807 | 2815 |
2808 CodeTree returnSpecialized = null; | 2816 CodeTree returnSpecialized = null; |