# HG changeset patch # User Lukas Stadler # Date 1330599877 -3600 # Node ID 985fbd8adf650b0bdb9d79c6895e4efd263f5db1 # Parent 11ce128f8d284de02499aab9271dc65a0e32a6a7 cleanup of XirSite: remove unused (and incorrectly implemented) type functions, add receiver to determine nonNull property diff -r 11ce128f8d28 -r 985fbd8adf65 graal/com.oracle.max.cri/src/com/oracle/max/cri/xir/XirSite.java --- a/graal/com.oracle.max.cri/src/com/oracle/max/cri/xir/XirSite.java Wed Feb 29 14:49:54 2012 +0100 +++ b/graal/com.oracle.max.cri/src/com/oracle/max/cri/xir/XirSite.java Thu Mar 01 12:04:37 2012 +0100 @@ -75,20 +75,4 @@ * @return {@code true} if an array store check is required */ boolean requiresArrayStoreCheck(); - - /** - * Checks whether an approximation of the type for the specified argument is available. - * @param argument the argument - * @return an {@link RiType} indicating the most specific type known for the argument, if any; - * {@code null} if no particular type is known - */ - RiType getApproximateType(XirArgument argument); - - /** - * Checks whether an exact type is known for the specified argument. - * @param argument the argument - * @return an {@link RiType} indicating the exact type known for the argument, if any; - * {@code null} if no particular type is known - */ - RiType getExactType(XirArgument argument); } diff -r 11ce128f8d28 -r 985fbd8adf65 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java Wed Feb 29 14:49:54 2012 +0100 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java Thu Mar 01 12:04:37 2012 +0100 @@ -514,7 +514,7 @@ @Override public void visitArrayLength(ArrayLengthNode x) { XirArgument array = toXirArgument(x.array()); - XirSnippet snippet = xir.genArrayLength(site(x), array); + XirSnippet snippet = xir.genArrayLength(site(x, x.array()), array); emitXir(snippet, x, state(), true); operand(x); } @@ -522,7 +522,7 @@ @Override public void visitCheckCast(CheckCastNode x) { if (x.emitCode()) { - XirSnippet snippet = xir.genCheckCast(site(x), toXirArgument(x.object()), toXirArgument(x.targetClassInstruction()), x.targetClass(), x.hints(), x.hintsExact()); + XirSnippet snippet = xir.genCheckCast(site(x, x.object()), toXirArgument(x.object()), toXirArgument(x.targetClassInstruction()), x.targetClass(), x.hints(), x.hintsExact()); emitXir(snippet, x, state(), true); } // The result of a checkcast is the unmodified object, so no need to allocate a new variable for it. @@ -548,7 +548,7 @@ // The state after the monitor enter is used for deoptimization, after the monitor has blocked, so it must contain the newly locked object. LIRDebugInfo stateAfter = stateFor(x.stateAfter()); - XirSnippet snippet = xir.genMonitorEnter(site(x), obj, lockAddress); + XirSnippet snippet = xir.genMonitorEnter(site(x, x.object()), obj, lockAddress); emitXir(snippet, x, stateBefore, stateAfter, true, null, null); } @@ -569,7 +569,7 @@ LIRDebugInfo stateBefore = state(); curLocks = curLocks.outer; - XirSnippet snippet = xir.genMonitorExit(site(x), obj, lockAddress); + XirSnippet snippet = xir.genMonitorExit(site(x, x.object()), obj, lockAddress); emitXir(snippet, x, stateBefore, true); } @@ -581,7 +581,7 @@ emitMembar(JMM_PRE_VOLATILE_READ); } XirArgument receiver = toXirArgument(x.object()); - XirSnippet snippet = x.isStatic() ? xir.genGetStatic(site(x), receiver, field) : xir.genGetField(site(x), receiver, field); + XirSnippet snippet = x.isStatic() ? xir.genGetStatic(site(x, x.object()), receiver, field) : xir.genGetField(site(x, x.object()), receiver, field); emitXir(snippet, x, info, true); if (x.isVolatile()) { emitMembar(JMM_POST_VOLATILE_READ); @@ -597,7 +597,7 @@ } XirArgument receiver = toXirArgument(x.object()); XirArgument value = toXirArgument(x.value()); - XirSnippet snippet = x.isStatic() ? xir.genPutStatic(site(x), receiver, field, value) : xir.genPutField(site(x), receiver, field, value); + XirSnippet snippet = x.isStatic() ? xir.genPutStatic(site(x, x.object()), receiver, field, value) : xir.genPutField(site(x, x.object()), receiver, field, value); emitXir(snippet, x, info, true); if (x.isVolatile()) { emitMembar(JMM_POST_VOLATILE_WRITE); @@ -608,7 +608,7 @@ public void visitLoadIndexed(LoadIndexedNode x) { XirArgument array = toXirArgument(x.array()); XirArgument index = toXirArgument(x.index()); - XirSnippet snippet = xir.genArrayLoad(site(x), array, index, x.elementKind(), null); + XirSnippet snippet = xir.genArrayLoad(site(x, x.array()), array, index, x.elementKind(), null); emitXir(snippet, x, state(), true); } @@ -617,7 +617,7 @@ XirArgument array = toXirArgument(x.array()); XirArgument index = toXirArgument(x.index()); XirArgument value = toXirArgument(x.value()); - XirSnippet snippet = xir.genArrayStore(site(x), array, index, value, x.elementKind(), null); + XirSnippet snippet = xir.genArrayStore(site(x, x.array()), array, index, value, x.elementKind(), null); emitXir(snippet, x, state(), true); } @@ -811,7 +811,7 @@ private void emitInstanceOfBranch(InstanceOfNode x, LabelRef trueSuccessor, LabelRef falseSuccessor, LIRDebugInfo info) { XirArgument obj = toXirArgument(x.object()); - XirSnippet snippet = xir.genInstanceOf(site(x), obj, toXirArgument(x.targetClassInstruction()), x.targetClass(), x.hints(), x.hintsExact()); + XirSnippet snippet = xir.genInstanceOf(site(x, x.object()), obj, toXirArgument(x.targetClassInstruction()), x.targetClass(), x.hints(), x.hintsExact()); emitXir(snippet, x, info, null, false, x.negated() ? falseSuccessor : trueSuccessor, x.negated() ? trueSuccessor : falseSuccessor); } @@ -862,7 +862,7 @@ XirArgument obj = toXirArgument(x.object()); XirArgument trueArg = toXirArgument(x.negated() ? falseValue : trueValue); XirArgument falseArg = toXirArgument(x.negated() ? trueValue : falseValue); - XirSnippet snippet = xir.genMaterializeInstanceOf(site(x), obj, toXirArgument(x.targetClassInstruction()), trueArg, falseArg, x.targetClass(), x.hints(), x.hintsExact()); + XirSnippet snippet = xir.genMaterializeInstanceOf(site(x, x.object()), obj, toXirArgument(x.targetClassInstruction()), trueArg, falseArg, x.targetClass(), x.hints(), x.hintsExact()); return (Variable) emitXir(snippet, null, null, false); } @@ -926,17 +926,17 @@ break; case Special: receiver = toXirArgument(callTarget.receiver()); - snippet = xir.genInvokeSpecial(site(x.node()), receiver, targetMethod); + snippet = xir.genInvokeSpecial(site(x.node(), callTarget.receiver()), receiver, targetMethod); break; case Virtual: assert callTarget.receiver().kind() == CiKind.Object : callTarget + ": " + callTarget.targetMethod().toString(); receiver = toXirArgument(callTarget.receiver()); - snippet = xir.genInvokeVirtual(site(x.node()), receiver, targetMethod); + snippet = xir.genInvokeVirtual(site(x.node(), callTarget.receiver()), receiver, targetMethod); break; case Interface: assert callTarget.receiver().kind() == CiKind.Object : callTarget; receiver = toXirArgument(callTarget.receiver()); - snippet = xir.genInvokeInterface(site(x.node()), receiver, targetMethod); + snippet = xir.genInvokeInterface(site(x.node(), callTarget.receiver()), receiver, targetMethod); break; } @@ -1437,7 +1437,11 @@ } protected XirSupport site(ValueNode x) { - return xirSupport.site(x); + return xirSupport.site(x, null); + } + + protected XirSupport site(ValueNode x, ValueNode receiver) { + return xirSupport.site(x, receiver); } /** @@ -1445,6 +1449,7 @@ */ static class XirSupport implements XirSite { ValueNode current; + ValueNode receiver; XirSupport() { } @@ -1464,7 +1469,7 @@ } public boolean requiresNullCheck() { - return current == null || true; + return receiver == null || !receiver.stamp().nonNull(); } public boolean requiresBoundsCheck() { @@ -1483,16 +1488,9 @@ return true; } - public RiType getApproximateType(XirArgument argument) { - return current == null ? null : current.declaredType(); - } - - public RiType getExactType(XirArgument argument) { - return current == null ? null : current.exactType(); - } - - XirSupport site(ValueNode v) { + XirSupport site(ValueNode v, ValueNode r) { current = v; + receiver = r; return this; }