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));