# HG changeset patch # User Christos Kotselidis # Date 1381504355 -7200 # Node ID a2866cf1c9afc97b1767bc8c53643a7d8432aa1c # Parent c4af81d4fcc394de297904c1b5e0f84bfe48599e Do not add write barriers to newly allocated objects diff -r c4af81d4fcc3 -r a2866cf1c9af 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 Fri Oct 11 17:09:13 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Fri Oct 11 17:12:35 2013 +0200 @@ -718,8 +718,8 @@ } if (!(value.isConstant() && value.asConstant().isDefaultForKind())) { WriteNode write = new WriteNode(newObject, value, createFieldLocation(graph, (HotSpotResolvedJavaField) virtualInstance.field(i)), - virtualInstance.field(i).getKind() == Kind.Object ? BarrierType.IMPRECISE : BarrierType.NONE, virtualInstance.field(i).getKind() == Kind.Object); - + (virtualInstance.field(i).getKind() == Kind.Object && !deferInitBarrier(newObject)) ? BarrierType.IMPRECISE : BarrierType.NONE, + virtualInstance.field(i).getKind() == Kind.Object); graph.addBeforeFixed(commit, graph.add(write)); } } @@ -736,7 +736,7 @@ } if (!(value.isConstant() && value.asConstant().isDefaultForKind())) { WriteNode write = new WriteNode(newObject, value, createArrayLocation(graph, element.getKind(), ConstantNode.forInt(i, graph)), - value.kind() == Kind.Object ? BarrierType.PRECISE : BarrierType.NONE, value.kind() == Kind.Object); + (value.kind() == Kind.Object && !deferInitBarrier(newObject)) ? BarrierType.PRECISE : BarrierType.NONE, value.kind() == Kind.Object); graph.addBeforeFixed(commit, graph.add(write)); } } @@ -897,7 +897,7 @@ private static BarrierType getFieldStoreBarrierType(StoreFieldNode storeField) { BarrierType barrierType = BarrierType.NONE; - if (storeField.field().getKind() == Kind.Object) { + if (storeField.field().getKind() == Kind.Object && !deferInitBarrier(storeField.object())) { barrierType = BarrierType.IMPRECISE; } return barrierType; @@ -905,12 +905,16 @@ private static BarrierType getArrayStoreBarrierType(StoreIndexedNode store) { BarrierType barrierType = BarrierType.NONE; - if (store.elementKind() == Kind.Object) { + if (store.elementKind() == Kind.Object && !deferInitBarrier(store.array())) { barrierType = BarrierType.PRECISE; } return barrierType; } + private static boolean deferInitBarrier(ValueNode object) { + return useDeferredInitBarriers() && (object instanceof NewInstanceNode || object instanceof NewArrayNode); + } + private static BarrierType getUnsafeStoreBarrierType(UnsafeStoreNode store) { BarrierType barrierType = BarrierType.NONE; if (store.value().kind() == Kind.Object) {