Mercurial > hg > graal-compiler
changeset 12368:a2866cf1c9af
Do not add write barriers to newly allocated objects
author | Christos Kotselidis <christos.kotselidis@oracle.com> |
---|---|
date | Fri, 11 Oct 2013 17:12:35 +0200 |
parents | c4af81d4fcc3 |
children | 380ef624593c |
files | graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java |
diffstat | 1 files changed, 9 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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) {