diff graal/GraalCompiler/src/com/sun/c1x/gen/LIRGenerator.java @ 2671:d8601d421b96

New Deoptimize node, remove ResolveClass node and replace it with deoptimization
author Gilles Duboscq <gilles.duboscq@oracle.com>
date Thu, 12 May 2011 17:17:50 +0200
parents 50b181d88c9f
children 0ea5f12e873a
line wrap: on
line diff
--- a/graal/GraalCompiler/src/com/sun/c1x/gen/LIRGenerator.java	Thu May 12 17:00:09 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/gen/LIRGenerator.java	Thu May 12 17:17:50 2011 +0200
@@ -210,6 +210,13 @@
         return deoptimizationStubs;
     }
 
+    private void addDeoptimizationStub(DeoptimizationStub stub) {
+        if (deoptimizationStubs == null) {
+            deoptimizationStubs = new ArrayList<LIRGenerator.DeoptimizationStub>();
+        }
+        deoptimizationStubs.add(stub);
+    }
+
     public static class DeoptimizationStub {
         public final Label label = new Label();
         public final LIRDebugInfo info;
@@ -298,13 +305,6 @@
     }
 
     @Override
-    public void visitResolveClass(ResolveClass i) {
-        LIRDebugInfo info = stateFor(i);
-        XirSnippet snippet = xir.genResolveClass(site(i), i.type, i.portion);
-        emitXir(snippet, i, info, null, true);
-    }
-
-    @Override
     public void visitCheckCast(CheckCast x) {
         XirArgument obj = toXirArgument(x.object());
         XirSnippet snippet = xir.genCheckCast(site(x), obj, toXirArgument(x.targetClassInstruction()), x.targetClass());
@@ -447,11 +447,7 @@
         lir.cmove(i.condition(), tVal, fVal, reg);
     }
 
-    protected FrameState stateBeforeInvoke(Invoke invoke) {
-        Value[] args = new Value[invoke.argumentCount()];
-        for (int i = 0; i < invoke.argumentCount(); i++) {
-            args[i] = invoke.argument(i);
-        }
+    protected FrameState stateBeforeInvokeReturn(Invoke invoke) {
         return invoke.stateAfter().duplicateModified(invoke.bci(), invoke.kind/*, args*/);
     }
 
@@ -467,7 +463,7 @@
     public void visitInvoke(Invoke x) {
         RiMethod target = x.target();
         LIRDebugInfo info = stateFor(x, stateBeforeInvokeWithArguments(x));
-        LIRDebugInfo info2 = stateFor(x, stateBeforeInvoke(x));
+        LIRDebugInfo info2 = stateFor(x, stateBeforeInvokeReturn(x));
 
         XirSnippet snippet = null;
 
@@ -887,6 +883,13 @@
         lir.throwException(CiValue.IllegalValue, argumentOperand, info);
     }
 
+    @Override
+    public void visitDeoptimize(Deoptimize deoptimize) {
+        DeoptimizationStub stub = new DeoptimizationStub(deoptimize.stateBefore());
+        addDeoptimizationStub(stub);
+        lir.branch(Condition.TRUE, stub.label, stub.info);
+    }
+
     private void blockDoEpilog(BlockBegin block) {
         if (C1XOptions.PrintIRWithLIR) {
             TTY.println();