# HG changeset patch # User Thomas Wuerthinger # Date 1367091704 -7200 # Node ID ee75b4f569ed905b287c658eea6106771a71fcbf # Parent c408b74bfc42e8ddf7dfa97669dafff34d3936d9 Don't create null check guard if object is kown to be non-null. diff -r c408b74bfc42 -r ee75b4f569ed graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Sat Apr 27 21:25:53 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Sat Apr 27 21:41:44 2013 +0200 @@ -519,7 +519,7 @@ ArrayLengthNode arrayLengthNode = (ArrayLengthNode) n; ValueNode array = arrayLengthNode.array(); ReadNode arrayLengthRead = graph.add(new ReadNode(array, ConstantLocationNode.create(LocationNode.FINAL_LOCATION, Kind.Int, config.arrayLengthOffset, graph), StampFactory.positiveInt())); - arrayLengthRead.dependencies().add(tool.createNullCheckGuard(array)); + tool.createNullCheckGuard(arrayLengthRead.dependencies(), array); graph.replaceFixedWithFixed(arrayLengthNode, arrayLengthRead); } else if (n instanceof Invoke) { Invoke invoke = (Invoke) n; @@ -528,7 +528,7 @@ NodeInputList parameters = callTarget.arguments(); ValueNode receiver = parameters.size() <= 0 ? null : parameters.get(0); if (!callTarget.isStatic() && receiver.kind() == Kind.Object && !receiver.objectStamp().nonNull()) { - invoke.asNode().dependencies().add(tool.createNullCheckGuard(receiver)); + tool.createNullCheckGuard(invoke.asNode().dependencies(), receiver); } JavaType[] signature = MetaUtil.signatureToTypes(callTarget.targetMethod().getSignature(), callTarget.isStatic() ? null : callTarget.targetMethod().getDeclaringClass()); @@ -571,7 +571,7 @@ ValueNode object = loadField.isStatic() ? ConstantNode.forObject(field.getDeclaringClass().mirror(), this, graph) : loadField.object(); assert loadField.kind() != Kind.Illegal; ReadNode memoryRead = graph.add(new ReadNode(object, ConstantLocationNode.create(field, field.getKind(), field.offset(), graph), loadField.stamp())); - memoryRead.dependencies().add(tool.createNullCheckGuard(object)); + tool.createNullCheckGuard(memoryRead.dependencies(), object); graph.replaceFixedWithFixed(loadField, memoryRead); @@ -588,7 +588,7 @@ LocationNode location = ConstantLocationNode.create(field, field.getKind(), field.offset(), graph); WriteBarrierType barrierType = getFieldStoreBarrierType(storeField); WriteNode memoryWrite = graph.add(new WriteNode(object, storeField.value(), location, barrierType)); - memoryWrite.dependencies().add(tool.createNullCheckGuard(object)); + tool.createNullCheckGuard(memoryWrite.dependencies(), object); memoryWrite.setStateAfter(storeField.stateAfter()); graph.replaceFixedWithFixed(storeField, memoryWrite); FixedWithNextNode last = memoryWrite; @@ -671,9 +671,8 @@ LocationNode location = ConstantLocationNode.create(LocationNode.FINAL_LOCATION, wordKind, config.hubOffset, graph); ValueNode object = loadHub.object(); assert !object.isConstant() || object.asConstant().isNull(); - ValueNode guard = tool.createNullCheckGuard(object); ReadNode hub = graph.add(new ReadNode(object, location, StampFactory.forKind(wordKind()))); - hub.dependencies().add(guard); + tool.createNullCheckGuard(hub.dependencies(), object); graph.replaceFixed(loadHub, hub); } else if (n instanceof FixedGuardNode) { FixedGuardNode node = (FixedGuardNode) n; diff -r c408b74bfc42 -r ee75b4f569ed graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LoweringTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LoweringTool.java Sat Apr 27 21:25:53 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LoweringTool.java Sat Apr 27 21:41:44 2013 +0200 @@ -34,7 +34,7 @@ Replacements getReplacements(); - ValueNode createNullCheckGuard(ValueNode object); + ValueNode createNullCheckGuard(NodeInputList dependencies, ValueNode object); ValueNode createGuard(LogicNode condition, DeoptimizationReason deoptReason, DeoptimizationAction action); diff -r c408b74bfc42 -r ee75b4f569ed graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java Sat Apr 27 21:25:53 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java Sat Apr 27 21:41:44 2013 +0200 @@ -68,8 +68,14 @@ } @Override - public ValueNode createNullCheckGuard(ValueNode object) { - return createGuard(object.graph().unique(new IsNullNode(object)), DeoptimizationReason.NullCheckException, DeoptimizationAction.InvalidateReprofile, true); + public ValueNode createNullCheckGuard(NodeInputList list, ValueNode object) { + if (object.objectStamp().nonNull()) { + // Short cut creation of null check guard if the object is known to be non-null. + return null; + } + ValueNode guard = createGuard(object.graph().unique(new IsNullNode(object)), DeoptimizationReason.NullCheckException, DeoptimizationAction.InvalidateReprofile, true); + list.add(guard); + return guard; } @Override