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;