# HG changeset patch # User Doug Simon # Date 1339754666 -7200 # Node ID 310ed6650682deae1f1bf8353c09108f9d22dea6 # Parent ff7961661b9691b28f13feebae5c27771f00237a added check to ensure fast path allocation is never used for types that don't allow it diff -r ff7961661b96 -r 310ed6650682 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java Thu Jun 14 17:03:22 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java Fri Jun 15 12:04:26 2012 +0200 @@ -200,6 +200,11 @@ return constantPool; } + /** + * Gets the instance size of this type. If an instance of this type cannot + * be fast path allocated, then the returned value is negative (its absolute + * value gives the size). + */ public int instanceSize() { return instanceSize; } diff -r ff7961661b96 -r 310ed6650682 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotXirGenerator.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotXirGenerator.java Thu Jun 14 17:03:22 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotXirGenerator.java Fri Jun 15 12:04:26 2012 +0200 @@ -783,6 +783,7 @@ public XirSnippet genNewInstance(XirSite site, JavaType type) { HotSpotResolvedJavaType resolvedType = (HotSpotResolvedJavaType) type; int instanceSize = resolvedType.instanceSize(); + assert instanceSize >= 0; return new XirSnippet(newInstanceTemplates.get(site, instanceSize), XirArgument.forObject(resolvedType.klassOop())); } diff -r ff7961661b96 -r 310ed6650682 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/NewInstanceSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/NewInstanceSnippets.java Thu Jun 14 17:03:22 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/NewInstanceSnippets.java Fri Jun 15 12:04:26 2012 +0200 @@ -189,6 +189,8 @@ HotSpotResolvedJavaType type = (HotSpotResolvedJavaType) newInstanceNode.instanceClass(); HotSpotKlassOop hub = type.klassOop(); int instanceSize = type.instanceSize(); + assert (instanceSize % wordSize()) == 0; + assert instanceSize >= 0; Key key = new Key(newInstance).add("size", instanceSize).add("checkInit", !type.isInitialized()).add("useTLAB", useTLAB).add("logType", LOG_ALLOCATION ? type.name() : null); Arguments arguments = arguments("hub", hub); SnippetTemplate template = cache.get(key); diff -r ff7961661b96 -r 310ed6650682 src/share/vm/graal/graalCompiler.cpp --- a/src/share/vm/graal/graalCompiler.cpp Thu Jun 14 17:03:22 2012 +0200 +++ b/src/share/vm/graal/graalCompiler.cpp Fri Jun 15 12:04:26 2012 +0200 @@ -278,8 +278,12 @@ if (klass->oop_is_javaArray()) { HotSpotResolvedJavaType::set_isArrayClass(obj, true); } else { + int size = instanceKlass::cast(klass())->size_helper() * HeapWordSize; + if (!instanceKlass::cast(klass())->can_be_fastpath_allocated()) { + size = -size; + } HotSpotResolvedJavaType::set_isArrayClass(obj, false); - HotSpotResolvedJavaType::set_instanceSize(obj, instanceKlass::cast(klass())->size_helper() * HeapWordSize); + HotSpotResolvedJavaType::set_instanceSize(obj, size); HotSpotResolvedJavaType::set_hasFinalizer(obj, klass->has_finalizer()); }