Mercurial > hg > truffle
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();