# HG changeset patch # User Thomas Wuerthinger # Date 1294653022 -3600 # Node ID 177398c6147d5b482029dcac009a30fec1ed5650 # Parent eb575e79136fbebe0f4ad930931eb9ed39c95a90 Added unique concrete subtype assumption. diff -r eb575e79136f -r 177398c6147d c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotRuntime.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotRuntime.java Fri Jan 07 19:08:13 2011 +0100 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotRuntime.java Mon Jan 10 10:50:22 2011 +0100 @@ -211,6 +211,7 @@ @Override public boolean recordLeafMethodAssumption(RiMethod method) { + System.out.println("Trying to record leaf method assumption: " + method.toString()); return false; } diff -r eb575e79136f -r 177398c6147d c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTargetMethod.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTargetMethod.java Fri Jan 07 19:08:13 2011 +0100 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTargetMethod.java Mon Jan 10 10:50:22 2011 +0100 @@ -46,6 +46,9 @@ this.name = null; sites = getSortedSites(targetMethod); + for (int i = 1; i < sites.length; ++i) { + assert sites[i - 1].pcOffset <= sites[i].pcOffset : sites[i-1].pcOffset + "<=" + sites[i].pcOffset; + } if (targetMethod.exceptionHandlers == null) { exceptionHandlers = null; } else { diff -r eb575e79136f -r 177398c6147d c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypePrimitive.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypePrimitive.java Fri Jan 07 19:08:13 2011 +0100 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypePrimitive.java Mon Jan 10 10:50:22 2011 +0100 @@ -160,4 +160,9 @@ return "HotSpotTypePrimitive<" + kind + ">"; } + @Override + public RiType uniqueConcreteSubtype() { + return this; + } + } diff -r eb575e79136f -r 177398c6147d c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeResolved.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeResolved.java Fri Jan 07 19:08:13 2011 +0100 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeResolved.java Mon Jan 10 10:50:22 2011 +0100 @@ -66,6 +66,11 @@ } @Override + public RiType uniqueConcreteSubtype() { + return Compiler.getVMEntries().RiType_uniqueConcreteSubtype(this); + } + + @Override public RiType exactType() { if (Modifier.isFinal(accessFlags)) { return this; diff -r eb575e79136f -r 177398c6147d c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeUnresolved.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeUnresolved.java Fri Jan 07 19:08:13 2011 +0100 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeUnresolved.java Mon Jan 10 10:50:22 2011 +0100 @@ -77,6 +77,11 @@ } @Override + public RiType uniqueConcreteSubtype() { + throw unresolved("uniqueConcreteSubtype"); + } + + @Override public Class javaClass() { throw unresolved("javaClass"); } diff -r eb575e79136f -r 177398c6147d c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntries.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntries.java Fri Jan 07 19:08:13 2011 +0100 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntries.java Mon Jan 10 10:50:22 2011 +0100 @@ -83,5 +83,7 @@ void recordBailout(String reason); + RiType RiType_uniqueConcreteSubtype(HotSpotTypeResolved hotSpotTypeResolved); + // Checkstyle: resume } diff -r eb575e79136f -r 177398c6147d c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntriesNative.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntriesNative.java Fri Jan 07 19:08:13 2011 +0100 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntriesNative.java Mon Jan 10 10:50:22 2011 +0100 @@ -99,6 +99,9 @@ public native RiType RiType_componentType(HotSpotTypeResolved klass); @Override + public native RiType RiType_uniqueConcreteSubtype(HotSpotTypeResolved klass); + + @Override public native RiType getType(Class javaClass); @Override diff -r eb575e79136f -r 177398c6147d c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExitsNative.java --- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExitsNative.java Fri Jan 07 19:08:13 2011 +0100 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExitsNative.java Mon Jan 10 10:50:22 2011 +0100 @@ -48,11 +48,12 @@ C1XOptions.setOptimizationLevel(3); C1XOptions.OptInlineExcept = false; C1XOptions.OptInlineSynchronized = false; - C1XOptions.UseDeopt = false; C1XOptions.IRChecking = false; C1XOptions.DetailedAsserts = false; C1XOptions.CommentedAssembly = false; C1XOptions.MethodEndBreakpointGuards = 2; + C1XOptions.PrintAssumptions = false; + C1XOptions.UseAssumptions = true; } @Override diff -r eb575e79136f -r 177398c6147d src/share/vm/c1x/c1x_CodeInstaller.cpp --- a/src/share/vm/c1x/c1x_CodeInstaller.cpp Fri Jan 07 19:08:13 2011 +0100 +++ b/src/share/vm/c1x/c1x_CodeInstaller.cpp Mon Jan 10 10:50:22 2011 +0100 @@ -28,6 +28,7 @@ #include "c1x/c1x_JavaAccess.hpp" #include "c1x/c1x_VmIds.hpp" #include "c1/c1_Runtime1.hpp" +#include "classfile/vmSymbols.hpp" #include "vmreg_x86.inline.hpp" @@ -208,6 +209,12 @@ _hotspot_method = HotSpotTargetMethod::method(target_method); _name = HotSpotTargetMethod::name(target_method); _sites = (arrayOop) HotSpotTargetMethod::sites(target_method); + oop assumptions = CiTargetMethod::assumptions(_citarget_method); + if (assumptions != NULL) { + _assumptions = (arrayOop) CiAssumptions::list(assumptions); + } else { + _assumptions = NULL; + } _exception_handlers = (arrayOop) HotSpotTargetMethod::exceptionHandlers(target_method); _code = (arrayOop) CiTargetMethod::targetCode(_citarget_method); @@ -270,6 +277,43 @@ fatal("unexpected Site subclass"); } } + + + if (_assumptions != NULL) { + oop* assumptions = (oop*) _assumptions->base(T_OBJECT); + for (int i = 0; i < _assumptions->length(); ++i) { + oop assumption = assumptions[i]; + if (assumption != NULL) { + if (assumption->is_a(CiAssumptions_ConcreteSubtype::klass())) { + assumption_ConcreteSubtype(assumption); + } else if (assumption->is_a(CiAssumptions_ConcreteMethod::klass())) { + assumption_ConcreteMethod(assumption); + } else { + fatal("unexpected Assumption subclass"); + } + } + } + } +} + +void CodeInstaller::assumption_ConcreteSubtype(oop assumption) { + oop context_oop = CiAssumptions_ConcreteSubtype::context(assumption); + oop type_oop = CiAssumptions_ConcreteSubtype::subtype(assumption); + + ciKlass* context = (ciKlass*) CURRENT_ENV->get_object(java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(context_oop))); + ciKlass* type = (ciKlass*) CURRENT_ENV->get_object(java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(type_oop))); + + if (context == type) { + _dependencies->assert_leaf_type(type); + } else { + assert(context->is_abstract(), ""); + ThreadToNativeFromVM trans(JavaThread::current()); + _dependencies->assert_abstract_with_unique_concrete_subtype(context, type); + } +} + +void CodeInstaller::assumption_ConcreteMethod(oop assumption) { + fatal("unimplemented"); } void CodeInstaller::process_exception_handlers() { diff -r eb575e79136f -r 177398c6147d src/share/vm/c1x/c1x_CodeInstaller.hpp --- a/src/share/vm/c1x/c1x_CodeInstaller.hpp Fri Jan 07 19:08:13 2011 +0100 +++ b/src/share/vm/c1x/c1x_CodeInstaller.hpp Mon Jan 10 10:50:22 2011 +0100 @@ -53,6 +53,7 @@ oop _hotspot_method; oop _name; arrayOop _sites; + arrayOop _assumptions; arrayOop _exception_handlers; CodeOffsets _offsets; @@ -91,6 +92,9 @@ // perform data and call relocation on the CodeBuffer void initialize_buffer(CodeBuffer& buffer); + void assumption_ConcreteSubtype(oop assumption); + void assumption_ConcreteMethod(oop assumption); + void site_Safepoint(CodeBuffer& buffer, jint pc_offset, oop site); void site_Call(CodeBuffer& buffer, jint pc_offset, oop site); void site_DataPatch(CodeBuffer& buffer, jint pc_offset, oop site); diff -r eb575e79136f -r 177398c6147d src/share/vm/c1x/c1x_JavaAccess.hpp --- a/src/share/vm/c1x/c1x_JavaAccess.hpp Fri Jan 07 19:08:13 2011 +0100 +++ b/src/share/vm/c1x/c1x_JavaAccess.hpp Mon Jan 10 10:50:22 2011 +0100 @@ -84,8 +84,20 @@ int_field(CiTargetMethod, frameSize) \ int_field(CiTargetMethod, customStackAreaOffset) \ oop_field(CiTargetMethod, targetCode, "[B") \ + oop_field(CiTargetMethod, assumptions, "Lcom/sun/cri/ci/CiAssumptions;") \ int_field(CiTargetMethod, targetCodeSize) \ end_class \ + start_class(CiAssumptions) \ + oop_field(CiAssumptions, list, "[Lcom/sun/cri/ci/CiAssumptions$Assumption;") \ + end_class \ + start_class(CiAssumptions_ConcreteSubtype) \ + oop_field(CiAssumptions_ConcreteSubtype, context, "Lcom/sun/cri/ri/RiType;") \ + oop_field(CiAssumptions_ConcreteSubtype, subtype, "Lcom/sun/cri/ri/RiType;") \ + end_class \ + start_class(CiAssumptions_ConcreteMethod) \ + oop_field(CiAssumptions_ConcreteMethod, context, "Lcom/sun/cri/ri/RiMethod;") \ + oop_field(CiAssumptions_ConcreteMethod, method, "Lcom/sun/cri/ri/RiMethod;") \ + end_class \ start_class(CiTargetMethod_Site) \ int_field(CiTargetMethod_Site, pcOffset) \ end_class \ diff -r eb575e79136f -r 177398c6147d src/share/vm/c1x/c1x_VMEntries.cpp --- a/src/share/vm/c1x/c1x_VMEntries.cpp Fri Jan 07 19:08:13 2011 +0100 +++ b/src/share/vm/c1x/c1x_VMEntries.cpp Mon Jan 10 10:50:22 2011 +0100 @@ -375,6 +375,32 @@ return JNIHandles::make_local(C1XCompiler::get_RiType(element_type, java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(klass)), THREAD)); } + +// public RiType RiType_uniqueConcreteSubtype(HotSpotResolvedType klass); +JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1uniqueConcreteSubtype(JNIEnv *, jobject, jobject klass) { + + Thread* THREAD = Thread::current(); + KlassHandle klass_handle(java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(klass))); + ciInstanceKlass* k = NULL; + { + VM_ENTRY_MARK; + k = (ciInstanceKlass *) CURRENT_ENV->get_object(klass_handle()); + } + + if (k->is_abstract()) { + ciInstanceKlass* sub = k->unique_concrete_subklass(); + if (sub != NULL) { + VM_ENTRY_MARK; + return JNIHandles::make_local(C1XCompiler::get_RiType(sub, klass_handle, THREAD)); + } + } else if (k->is_leaf_type()) { + assert(!k->is_interface(), ""); + return klass; + } + + return NULL; +} + // public RiType RiType_arrayOf(long vmId); JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1arrayOf(JNIEnv *, jobject, jlong vmId) { VM_ENTRY_MARK; @@ -574,8 +600,9 @@ {CC"RiConstantPool_lookupField", CC"("PROXY"IB)"FIELD, FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupField)}, {CC"RiType_constantPool", CC"("RESOLVED_TYPE")"CONSTANT_POOL, FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1constantPool)}, {CC"RiType_resolveMethodImpl", CC"("RESOLVED_TYPE STRING STRING")"METHOD, FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_3resolveMethodImpl)}, - {CC"RiType_isSubtypeOf", CC"("RESOLVED_TYPE TYPE")Z", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_2isSubtypeOf)}, + {CC"RiType_isSubtypeOf", CC"("RESOLVED_TYPE TYPE")Z", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_2isSubtypeOf)}, {CC"RiType_componentType", CC"("RESOLVED_TYPE")"TYPE, FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1componentType)}, + {CC"RiType_uniqueConcreteSubtype", CC"("RESOLVED_TYPE")"TYPE, FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1uniqueConcreteSubtype)}, {CC"RiType_arrayOf", CC"("PROXY")"TYPE, FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1arrayOf)}, {CC"getPrimitiveArrayType", CC"("CI_KIND")"TYPE, FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_getPrimitiveArrayType)}, {CC"getType", CC"("CLASS")"TYPE, FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_getType)}, diff -r eb575e79136f -r 177398c6147d src/share/vm/classfile/systemDictionary.hpp --- a/src/share/vm/classfile/systemDictionary.hpp Fri Jan 07 19:08:13 2011 +0100 +++ b/src/share/vm/classfile/systemDictionary.hpp Mon Jan 10 10:50:22 2011 +0100 @@ -188,6 +188,9 @@ template(HotSpotTargetMethod_klass, com_sun_hotspot_c1x_HotSpotTargetMethod, Opt) \ template(HotSpotExceptionHandler_klass,com_sun_hotspot_c1x_HotSpotExceptionHandler, Opt) \ template(HotSpotProxy_klass, com_sun_hotspot_c1x_HotSpotProxy, Opt) \ + template(CiAssumptions_klass, com_sun_cri_ci_CiAssumptions, Opt) \ + template(CiAssumptions_ConcreteSubtype_klass, com_sun_cri_ci_CiAssumptions_ConcreteSubtype, Opt) \ + template(CiAssumptions_ConcreteMethod_klass, com_sun_cri_ci_CiAssumptions_ConcreteMethod, Opt) \ template(CiTargetMethod_klass, com_sun_cri_ci_CiTargetMethod, Opt) \ template(CiTargetMethod_Site_klass, com_sun_cri_ci_CiTargetMethod_Site, Opt) \ template(CiTargetMethod_Call_klass, com_sun_cri_ci_CiTargetMethod_Call, Opt) \ diff -r eb575e79136f -r 177398c6147d src/share/vm/classfile/vmSymbols.hpp --- a/src/share/vm/classfile/vmSymbols.hpp Fri Jan 07 19:08:13 2011 +0100 +++ b/src/share/vm/classfile/vmSymbols.hpp Mon Jan 10 10:50:22 2011 +0100 @@ -275,6 +275,9 @@ template(com_sun_cri_ri_RiType, "com/sun/cri/ri/RiType") \ template(com_sun_cri_ri_RiConstantPool, "com/sun/cri/ri/RiConstantPool") \ template(com_sun_cri_ri_RiExceptionHandler, "com/sun/cri/ri/RiExceptionHandler") \ + template(com_sun_cri_ci_CiAssumptions, "com/sun/cri/ci/CiAssumptions") \ + template(com_sun_cri_ci_CiAssumptions_ConcreteSubtype, "com/sun/cri/ci/CiAssumptions$ConcreteSubtype") \ + template(com_sun_cri_ci_CiAssumptions_ConcreteMethod, "com/sun/cri/ci/CiAssumptions$ConcreteMethod") \ template(com_sun_cri_ci_CiTargetMethod, "com/sun/cri/ci/CiTargetMethod") \ template(com_sun_cri_ci_CiTargetMethod_Site, "com/sun/cri/ci/CiTargetMethod$Site") \ template(com_sun_cri_ci_CiTargetMethod_Call, "com/sun/cri/ci/CiTargetMethod$Call") \ diff -r eb575e79136f -r 177398c6147d src/share/vm/compiler/compileBroker.cpp --- a/src/share/vm/compiler/compileBroker.cpp Fri Jan 07 19:08:13 2011 +0100 +++ b/src/share/vm/compiler/compileBroker.cpp Mon Jan 10 10:50:22 2011 +0100 @@ -594,7 +594,7 @@ break; } } - if (TraceC1X >= 4) { + if (TraceC1X >= 5) { _c1_method_queue->print(); } }