[vmkit-commits] [vmkit] r101753 - in /vmkit/trunk/lib/J3: Compiler/JavaJITOpcodes.cpp Compiler/LowerConstantCalls.cpp LLVMRuntime/runtime-default.ll VMCore/JavaClass.cpp VMCore/JavaConstantPool.cpp VMCore/JavaObject.h VMCore/JavaRuntimeJIT.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sun Apr 18 13:26:22 PDT 2010


Author: geoffray
Date: Sun Apr 18 15:26:22 2010
New Revision: 101753

URL: http://llvm.org/viewvc/llvm-project?rev=101753&view=rev
Log:
Optimize ANEWARRAY when the array class is not loaded yet by getting the VT instead of the class.


Modified:
    vmkit/trunk/lib/J3/Compiler/JavaJITOpcodes.cpp
    vmkit/trunk/lib/J3/Compiler/LowerConstantCalls.cpp
    vmkit/trunk/lib/J3/LLVMRuntime/runtime-default.ll
    vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
    vmkit/trunk/lib/J3/VMCore/JavaConstantPool.cpp
    vmkit/trunk/lib/J3/VMCore/JavaObject.h
    vmkit/trunk/lib/J3/VMCore/JavaRuntimeJIT.cpp

Modified: vmkit/trunk/lib/J3/Compiler/JavaJITOpcodes.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Compiler/JavaJITOpcodes.cpp?rev=101753&r1=101752&r2=101753&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Compiler/JavaJITOpcodes.cpp (original)
+++ vmkit/trunk/lib/J3/Compiler/JavaJITOpcodes.cpp Sun Apr 18 15:26:22 2010
@@ -730,7 +730,7 @@
           BranchInst::Create(endBlock, exceptionBlock, res, currentBlock);
           
           currentBlock = exceptionBlock;
-          throwException(intrinsics->ArrayStoreExceptionFunction, VTArgs, 1);
+          throwException(intrinsics->ArrayStoreExceptionFunction, VTArgs, 2);
 
           currentBlock = endBlock;
         }
@@ -2009,10 +2009,10 @@
           }
         } else {
           uint16 index = readU2(bytecodes, i);
-          CommonClass* cl = 0;
-          valCl = getResolvedCommonClass(index, true, &cl);
+          CommonClass* cl =
+            compilingClass->ctpInfo->getMethodClassIfLoaded(index); 
 
-          if (cl) {
+          if (cl && (!cl->isClass() || cl->asClass()->isResolved())) {
             JnjvmClassLoader* JCL = cl->classLoader;
             const UTF8* arrayName = JCL->constructArrayName(1, cl->name);
           
@@ -2033,12 +2033,12 @@
 
           } else {
             const llvm::Type* Ty = 
-              PointerType::getUnqual(intrinsics->JavaClassArrayType);
-            Value* args[2]= { valCl, Constant::getNullValue(Ty) };
-            valCl = CallInst::Create(intrinsics->GetArrayClassFunction, args,
-                                     args + 2, "", currentBlock);
-            TheVT = CallInst::Create(intrinsics->GetVTFromClassArrayFunction, valCl, "",
-                                     currentBlock);
+              PointerType::getUnqual(intrinsics->VTType);
+            Value* args[3]= { TheCompiler->getNativeClass(compilingClass),
+                              ConstantInt::get(Type::getInt32Ty(*llvmContext), index),
+                              Constant::getNullValue(Ty) };
+            TheVT = CallInst::Create(intrinsics->GetArrayClassFunction, args,
+                                     args + 3, "", currentBlock);
           }
 
           sizeElement = intrinsics->constantPtrLogSize;

Modified: vmkit/trunk/lib/J3/Compiler/LowerConstantCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Compiler/LowerConstantCalls.cpp?rev=101753&r1=101752&r2=101753&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Compiler/LowerConstantCalls.cpp (original)
+++ vmkit/trunk/lib/J3/Compiler/LowerConstantCalls.cpp Sun Apr 18 15:26:22 2010
@@ -531,17 +531,16 @@
           BranchInst::Create(NBB, trueCl);
           break;
         } else if (V == intrinsics->GetArrayClassFunction) {
-          const llvm::Type* Ty = 
-            PointerType::getUnqual(intrinsics->JavaCommonClassType);
+          const llvm::Type* Ty = PointerType::getUnqual(intrinsics->VTType);
           Constant* nullValue = Constant::getNullValue(Ty);
           // Check if we have already proceed this call.
-          if (Call.getArgument(1) == nullValue) { 
+          if (Call.getArgument(2) == nullValue) { 
             BasicBlock* NBB = II->getParent()->splitBasicBlock(II);
             I->getParent()->getTerminator()->eraseFromParent();
 
-            Constant* init = Constant::getNullValue(intrinsics->JavaClassArrayType);
+            Constant* init = Constant::getNullValue(intrinsics->VTType);
             GlobalVariable* GV = 
-              new GlobalVariable(*(F.getParent()), intrinsics->JavaClassArrayType,
+              new GlobalVariable(*(F.getParent()), intrinsics->VTType,
                                  false, GlobalValue::ExternalLinkage,
                                  init, "");
 
@@ -551,21 +550,22 @@
 
             BasicBlock* OKBlock = BasicBlock::Create(*Context, "", &F);
             BasicBlock* NotOKBlock = BasicBlock::Create(*Context, "", &F);
-            PHINode* node = PHINode::Create(intrinsics->JavaClassArrayType, "",
+            PHINode* node = PHINode::Create(intrinsics->VTType, "",
                                             OKBlock);
             node->addIncoming(LoadedGV, CI->getParent());
 
             BranchInst::Create(NotOKBlock, OKBlock, cmp, CI);
 
-            Value* args[2] = { Call.getArgument(0), GV };
+            Value* args[3] = { Call.getArgument(0), Call.getArgument(1), GV };
             Value* res = CallInst::Create(intrinsics->GetArrayClassFunction, args,
-                                          args + 2, "", NotOKBlock);
+                                          args + 3, "", NotOKBlock);
             BranchInst::Create(OKBlock, NotOKBlock);
             node->addIncoming(res, NotOKBlock);
             
             CI->replaceAllUsesWith(node);
             CI->eraseFromParent();
             BranchInst::Create(NBB, OKBlock);
+            Changed = true;
             break;
           }
         } else if (V == intrinsics->ForceInitialisationCheckFunction ||

Modified: vmkit/trunk/lib/J3/LLVMRuntime/runtime-default.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/LLVMRuntime/runtime-default.ll?rev=101753&r1=101752&r2=101753&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/LLVMRuntime/runtime-default.ll (original)
+++ vmkit/trunk/lib/J3/LLVMRuntime/runtime-default.ll Sun Apr 18 15:26:22 2010
@@ -184,8 +184,7 @@
 declare %JavaObject* @j3RuntimeDelegatee(%JavaCommonClass*) readnone 
 
 ;;; j3GetArrayClass - Get the array user class of the user class.
-declare %JavaClassArray* @j3GetArrayClass(%JavaCommonClass*, 
-                                             %JavaClassArray**) readnone
+declare %VT* @j3GetArrayClass(%JavaClass*, i32, %VT**) readnone
 
 declare i8 @getFinalInt8Field(i8*) readnone
 declare i16 @getFinalInt16Field(i16*) readnone
@@ -209,7 +208,7 @@
 declare %JavaObject* @j3NegativeArraySizeException(i32)
 declare %JavaObject* @j3OutOfMemoryError(i32)
 declare %JavaObject* @j3StackOverflowError()
-declare %JavaObject* @j3ArrayStoreException(%VT*)
+declare %JavaObject* @j3ArrayStoreException(%VT*, %VT*)
 declare %JavaObject* @j3ArithmeticException()
 declare void @j3ThrowException(%JavaObject*)
 declare void @j3ThrowExceptionFromJIT()

Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.cpp?rev=101753&r1=101752&r2=101753&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.cpp Sun Apr 18 15:26:22 2010
@@ -1486,8 +1486,6 @@
     destructor = 0;
     nbSecondaryTypes = 0;
   }
-    
-
 }
   
 JavaVirtualTable::JavaVirtualTable(ClassArray* C) {

Modified: vmkit/trunk/lib/J3/VMCore/JavaConstantPool.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaConstantPool.cpp?rev=101753&r1=101752&r2=101753&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaConstantPool.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaConstantPool.cpp Sun Apr 18 15:26:22 2010
@@ -288,10 +288,8 @@
     if (name->elements[0] == I_TAB) {
       temp = loader->constructArray(name);
     } else {
-      // Put into ctpRes because there is only one representation of the class
       temp = loader->loadName(name, resolve, false);
-    }
-    
+    } 
     ctpRes[index] = temp;
   }
 #endif

Modified: vmkit/trunk/lib/J3/VMCore/JavaObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaObject.h?rev=101753&r1=101752&r2=101753&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaObject.h Sun Apr 18 15:26:22 2010
@@ -81,8 +81,8 @@
   ///
   JavaVirtualTable** secondaryTypes;
 
-  /// baseClass - Holds the base class VT of an array, or the array class VT
-  /// of a regular class. Used for AASTORE checks.
+  /// baseClassVT - Holds the base class VT of an array. Used for AASTORE
+  /// checks.
   ///
   JavaVirtualTable* baseClassVT;
 

Modified: vmkit/trunk/lib/J3/VMCore/JavaRuntimeJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaRuntimeJIT.cpp?rev=101753&r1=101752&r2=101753&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaRuntimeJIT.cpp Sun Apr 18 15:26:22 2010
@@ -189,13 +189,21 @@
   BEGIN_NATIVE_EXCEPTION(1)
    
   UserConstantPool* ctpInfo = caller->getConstantPool();
-  UserClass* cl = (UserClass*)ctpInfo->loadClass(index);
+  UserCommonClass* cl = ctpInfo->loadClass(index);
   // We can not initialize here, because bytecodes such as CHECKCAST
   // or classes used in catch clauses do not trigger class initialization.
   // This is really sad, because we need to insert class initialization checks
   // in the LLVM code.
   assert(cl && "No cl after class lookup");
   res = (void*)cl;
+ 
+  // Create the array class, in case we come from a ANEWARRAY.
+  if (cl->isClass() && !cl->virtualVT->baseClassVT) { 
+    const UTF8* arrayName =
+      cl->classLoader->constructArrayName(1, cl->getName());
+    cl->virtualVT->baseClassVT =
+      cl->classLoader->constructArray(arrayName)->virtualVT;
+  }
 
   END_NATIVE_EXCEPTION
   
@@ -295,18 +303,22 @@
 }
 
 // Throws if the class can not be resolved.
-extern "C" UserClassArray* j3GetArrayClass(UserCommonClass* cl,
-                                              UserClassArray** dcl) {
-  UserClassArray* res = 0;
-
+extern "C" JavaVirtualTable* j3GetArrayClass(UserClass* caller,
+                                             uint32 index,
+                                             JavaVirtualTable** VT) {
+  JavaVirtualTable* res = 0;
+  assert(VT && "Incorrect call to j3GetArrayClass");
   BEGIN_NATIVE_EXCEPTION(1)
   
+  UserConstantPool* ctpInfo = caller->getConstantPool();
+  UserCommonClass* cl = ctpInfo->loadClass(index);
+  
   JnjvmClassLoader* JCL = cl->classLoader;
   if (cl->asClass()) cl->asClass()->resolveClass();
   const UTF8* arrayName = JCL->constructArrayName(1, cl->getName());
   
-  res = JCL->constructArray(arrayName);
-  if (dcl) *dcl = res;
+  res = JCL->constructArray(arrayName)->virtualVT;
+  *VT = res;
 
   END_NATIVE_EXCEPTION
 
@@ -314,7 +326,7 @@
   // exception check. Therefore, we trick LLVM to check the return value of the
   // function.
   JavaObject* obj = JavaThread::get()->pendingException;
-  if (obj) return (UserClassArray*)obj;
+  if (obj) return (JavaVirtualTable*)obj;
   return res;
 }
 
@@ -523,12 +535,12 @@
 }
 
 // Creates a Java object and then throws it.
-extern "C" JavaObject* j3ArrayStoreException(JavaVirtualTable* VT) {
+extern "C" JavaObject* j3ArrayStoreException(JavaVirtualTable* VT,
+                                             JavaVirtualTable* VT2) {
   JavaObject *exc = 0;
   JavaThread *th = JavaThread::get();
 
   BEGIN_NATIVE_EXCEPTION(1)
-  
   exc = th->getJVM()->CreateArrayStoreException(VT);
 
   END_NATIVE_EXCEPTION





More information about the vmkit-commits mailing list