changeset 1445:a7b84a5e16c6

Remove caching for constant pool entries (same index can be used to retrieve e.g. type and field). Fast fail on bailout in C1X.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 09 Nov 2010 13:42:06 +0100
parents c0e244017dad
children 5f1100e1cb12 8cfe3537a0d3
files c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotConstantPool.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/VMExits.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExitsNative.java c1x4hotspotsrc/hotspot/hotspot SciMark.launch src/share/vm/c1x/c1x_VMEntries.cpp src/share/vm/oops/instanceKlass.cpp
diffstat 8 files changed, 27 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotConstantPool.java	Tue Nov 09 12:30:21 2010 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotConstantPool.java	Tue Nov 09 13:42:06 2010 +0100
@@ -32,8 +32,7 @@
  */
 public class HotSpotConstantPool implements RiConstantPool, CompilerObject {
 
-    long vmId;
-    HashMap<Integer, Object> cache = new HashMap<Integer, Object>();
+    private final long vmId;
 
     public HotSpotConstantPool(long vmId) {
         this.vmId = vmId;
@@ -47,52 +46,27 @@
 
     @Override
     public Object lookupConstant(int cpi) {
-        Object value = cache.get(cpi);
-        if (value == null) {
-            value = Compiler.getVMEntries().RiConstantPool_lookupConstant(vmId, cpi);
-            cache.put(cpi, value);
-        }
-        return value;
+        return Compiler.getVMEntries().RiConstantPool_lookupConstant(vmId, cpi);
     }
 
     @Override
     public RiMethod lookupMethod(int cpi, int byteCode) {
-        RiMethod value = (RiMethod) cache.get(cpi);
-        if (value == null) {
-            value = Compiler.getVMEntries().RiConstantPool_lookupMethod(vmId, cpi, (byte) byteCode);
-            cache.put(cpi, value);
-        }
-        return value;
+        return Compiler.getVMEntries().RiConstantPool_lookupMethod(vmId, cpi, (byte) byteCode);
     }
 
     @Override
     public RiSignature lookupSignature(int cpi) {
-        RiSignature value = (RiSignature) cache.get(cpi);
-        if (value == null) {
-            value = Compiler.getVMEntries().RiConstantPool_lookupSignature(vmId, cpi);
-            cache.put(cpi, value);
-        }
-        return value;
+        return Compiler.getVMEntries().RiConstantPool_lookupSignature(vmId, cpi);
     }
 
     @Override
     public RiType lookupType(int cpi, int opcode) {
-        RiType value = (RiType) cache.get(cpi);
-        if (value == null) {
-            value = Compiler.getVMEntries().RiConstantPool_lookupType(vmId, cpi);
-            cache.put(cpi, value);
-        }
-        return value;
+        return Compiler.getVMEntries().RiConstantPool_lookupType(vmId, cpi);
     }
 
     @Override
     public RiField lookupField(int cpi, int opcode) {
-        RiField value = (RiField) cache.get(cpi);
-        if (value == null) {
-            value = Compiler.getVMEntries().RiConstantPool_lookupField(vmId, cpi);
-            cache.put(cpi, value);
-        }
-        return value;
+        return Compiler.getVMEntries().RiConstantPool_lookupField(vmId, cpi);
     }
 
 }
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntries.java	Tue Nov 09 12:30:21 2010 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntries.java	Tue Nov 09 13:42:06 2010 +0100
@@ -81,5 +81,7 @@
 
     boolean RiMethod_hasBalancedMonitors(long vmId);
 
+    void recordBailout(String reason);
+
     // Checkstyle: resume
 }
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntriesNative.java	Tue Nov 09 12:30:21 2010 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntriesNative.java	Tue Nov 09 13:42:06 2010 +0100
@@ -103,5 +103,9 @@
 
     @Override
     public native boolean RiMethod_hasBalancedMonitors(long vmId);
+
+    @Override
+    public native void recordBailout(String reason);
+
     // Checkstyle: resume
 }
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExits.java	Tue Nov 09 12:30:21 2010 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExits.java	Tue Nov 09 13:42:06 2010 +0100
@@ -33,7 +33,7 @@
 
     boolean setOption(String option);
 
-    void compileMethod(long methodVmId, String name, int entryBCI);
+    void compileMethod(long methodVmId, String name, int entryBCI) throws Throwable;
 
     RiMethod createRiMethodResolved(long vmId, String name);
 
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExitsNative.java	Tue Nov 09 12:30:21 2010 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExitsNative.java	Tue Nov 09 13:42:06 2010 +0100
@@ -103,7 +103,7 @@
     }
 
     @Override
-    public void compileMethod(long methodVmId, String name, int entryBCI) {
+    public void compileMethod(long methodVmId, String name, int entryBCI) throws Throwable {
 
         if (!compileMethods) {
             return;
@@ -118,6 +118,7 @@
                 StringWriter out = new StringWriter();
                 result.bailout().printStackTrace(new PrintWriter(out));
                 Logger.info("Bailout:\n" + out.toString());
+                Compiler.getVMEntries().recordBailout(result.bailout().getMessage());
             } else {
                 Logger.log("Compilation result: " + result.targetMethod());
                 HotSpotTargetMethod.installMethod(riMethod, result.targetMethod());
@@ -126,6 +127,7 @@
             StringWriter out = new StringWriter();
             t.printStackTrace(new PrintWriter(out));
             Logger.info("Compilation interrupted:\n" + out.toString());
+            throw t;
         }
     }
 
--- a/c1x4hotspotsrc/hotspot/hotspot SciMark.launch	Tue Nov 09 12:30:21 2010 +0100
+++ b/c1x4hotspotsrc/hotspot/hotspot SciMark.launch	Tue Nov 09 13:42:06 2010 +0100
@@ -38,7 +38,7 @@
 <stringAttribute key="org.eclipse.cdt.launch.FORMAT" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&lt;contentList&gt;&lt;content id=&quot;r10-(format)&quot; val=&quot;4&quot;/&gt;&lt;/contentList&gt;"/>
 <stringAttribute key="org.eclipse.cdt.launch.GLOBAL_VARIABLES" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;globalVariableList/&gt;&#10;"/>
 <stringAttribute key="org.eclipse.cdt.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;memoryBlockExpressionList/&gt;&#10;"/>
-<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="-client -C1X:-DetailedAsserts -XX:+UseC1X -XX:+PrintGC -Xms1g -Xmx1g -Xbootclasspath/p:${workspace_loc:hotspot}/../../../maxine/C1X/bin:${workspace_loc:hotspot}/../../../maxine/CRI/bin:${workspace_loc:hotspot}/../../../maxine/Base/bin:${workspace_loc:hotspot}/../../../maxine/Assembler/bin:${workspace_loc:hotspot}/../HotSpotVM/bin -Xbootclasspath/a:/home/tw/Benchmarks/scimark/ -classpath &quot;/home/tw/Benchmarks/scimark&quot; -C1X:-PrintCFGToFile  -C1X:-PrintAssembly -XX:+PrintCompilation -C1X:+PrintCompilation -XX:+BackgroundCompilation -XX:CompileOnly=*.visitIf -C1X:+PrintTimers  jnt.scimark2.commandline -large"/>
+<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="-client -C1X:-DetailedAsserts -XX:+UseC1X -XX:+PrintGC -Xms1g -Xmx1g -Xbootclasspath/p:${workspace_loc:hotspot}/../../../maxine/C1X/bin:${workspace_loc:hotspot}/../../../maxine/CRI/bin:${workspace_loc:hotspot}/../../../maxine/Base/bin:${workspace_loc:hotspot}/../../../maxine/Assembler/bin:${workspace_loc:hotspot}/../HotSpotVM/bin -Xbootclasspath/a:/home/tw/Benchmarks/scimark/ -classpath &quot;/home/tw/Benchmarks/scimark&quot; -C1X:-PrintCFGToFile  -C1X:-PrintAssembly -XX:+PrintCompilation -C1X:+PrintCompilation -XX:+BackgroundCompilation -C1X:+PrintTimers  jnt.scimark2.commandline -large"/>
 <stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="/home/tw/Projects/jre1.7.0/bin/java"/>
 <stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="hotspot"/>
 <stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="cdt.managedbuild.toolchain.gnu.solaris.base.945602881"/>
--- a/src/share/vm/c1x/c1x_VMEntries.cpp	Tue Nov 09 12:30:21 2010 +0100
+++ b/src/share/vm/c1x/c1x_VMEntries.cpp	Tue Nov 09 13:42:06 2010 +0100
@@ -449,6 +449,11 @@
   return id;
 }
 
+// public void recordBailout(String reason);
+JNIEXPORT void JNICALL Java_com_sun_hotspot_c1x_VMEntries_recordBailout(JNIEnv *jniEnv, jobject) {
+  fatal("Bailout in C1X");
+}
+
 
 
 
@@ -495,7 +500,8 @@
   {CC"getType",                         CC"("CLASS")"TYPE,                  FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_getType)},
   {CC"getConfiguration",                CC"()"CONFIG,                       FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_getConfiguration)},
   {CC"installMethod",                   CC"("TARGET_METHOD")V",             FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_installMethod)},
-  {CC"installStub",                     CC"("TARGET_METHOD")"PROXY,         FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_installStub)}
+  {CC"installStub",                     CC"("TARGET_METHOD")"PROXY,         FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_installStub)},
+  {CC"recordBailout",                   CC"("STRING")V",                    FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_recordBailout)}
 };
 
 int VMEntries_methods_count() {
--- a/src/share/vm/oops/instanceKlass.cpp	Tue Nov 09 12:30:21 2010 +0100
+++ b/src/share/vm/oops/instanceKlass.cpp	Tue Nov 09 13:42:06 2010 +0100
@@ -572,7 +572,9 @@
 }
 
 objArrayOop instanceKlass::allocate_objArray(int n, int length, TRAPS) {
-  if (length < 0) THROW_0(vmSymbols::java_lang_NegativeArraySizeException());
+  if (length < 0) {
+    THROW_0(vmSymbols::java_lang_NegativeArraySizeException());
+  }
   if (length > arrayOopDesc::max_array_length(T_OBJECT)) {
     report_java_out_of_memory("Requested array size exceeds VM limit");
     THROW_OOP_0(Universe::out_of_memory_error_array_size());