changeset 2048:177398c6147d

Added unique concrete subtype assumption.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Mon, 10 Jan 2011 10:50:22 +0100
parents eb575e79136f
children 7e09ea4a8f36
files c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotRuntime.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTargetMethod.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypePrimitive.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeResolved.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeUnresolved.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntries.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntriesNative.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExitsNative.java src/share/vm/c1x/c1x_CodeInstaller.cpp src/share/vm/c1x/c1x_CodeInstaller.hpp src/share/vm/c1x/c1x_JavaAccess.hpp src/share/vm/c1x/c1x_VMEntries.cpp src/share/vm/classfile/systemDictionary.hpp src/share/vm/classfile/vmSymbols.hpp src/share/vm/compiler/compileBroker.cpp
diffstat 15 files changed, 121 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- 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;
     }
 
--- 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 {
--- 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;
+    }
+
 }
--- 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;
--- 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");
     }
--- 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
 }
--- 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
--- 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
--- 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() {
--- 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);
--- 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                                                                             \
--- 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)},
--- 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) \
--- 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")                             \
--- 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();
       }
     }