[vmkit-commits] [vmkit] r57960 - in /vmkit/trunk/lib/JnJVM: LLVMRuntime/runtime-default.ll VMCore/JavaRuntimeJIT.cpp VMCore/JnjvmModule.cpp VMCore/JnjvmModule.h VMCore/LowerConstantCalls.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue Oct 21 22:28:42 PDT 2008


Author: geoffray
Date: Wed Oct 22 00:28:42 2008
New Revision: 57960

URL: http://llvm.org/viewvc/llvm-project?rev=57960&view=rev
Log:
Faster class initialization check.


Modified:
    vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll
    vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
    vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp

Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll?rev=57960&r1=57959&r2=57960&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original)
+++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Wed Oct 22 00:28:42 2008
@@ -50,10 +50,8 @@
 ;;;;; Constant calls for Jnjvm runtime internal objects field accesses ;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-;;; initialisationCheck - Checks if the class has been initialized and 
-;;; initializes if not. This is used for initialization barriers in an isolate
-;;; environment, and in some specific scenario in a single environment.
-declare %JavaClass* @initialisationCheck(%JavaClass*) readnone 
+;;; jnjvmRuntimeInitialiseClass - Initialises the class.
+declare %JavaClass* @jnjvmRuntimeInitialiseClass(%JavaClass*) readnone 
 
 ;;; arrayLength - Get the length of an array.
 declare i32 @arrayLength(%JavaObject*) readnone 
@@ -95,6 +93,11 @@
 ;;; specific methods.
 declare %JavaObject* @multiCallNew(%JavaClass*, i32, ...)
 
+;;; initialisationCheck - Checks if the class has been initialized and 
+;;; initializes if not. This is used for initialization barriers in an isolate
+;;; environment, and in some specific scenario in a single environment.
+declare %JavaClass* @initialisationCheck(%JavaClass*) readnone 
+
 ;;; forceInitialisationCheck - Force to check initialization. The difference
 ;;; between this function and the initialisationCheck function is that the
 ;;; latter is readnone and can thus be removed. This function is removed

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=57960&r1=57959&r2=57960&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Wed Oct 22 00:28:42 2008
@@ -304,7 +304,7 @@
   JavaThread::get()->isolate->indexOutOfBounds(obj, index);
 }
 
-extern "C" UserCommonClass* initialisationCheck(UserCommonClass* cl) {
+extern "C" UserCommonClass* jnjvmRuntimeInitialiseClass(UserCommonClass* cl) {
   cl->initialiseClass(JavaThread::get()->isolate);
   return cl;
 }

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=57960&r1=57959&r2=57960&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Oct 22 00:28:42 2008
@@ -58,6 +58,7 @@
 llvm::ConstantInt*    JnjvmModule::OffsetDisplayInClassConstant;
 llvm::ConstantInt*    JnjvmModule::OffsetStatusInClassConstant;
 llvm::ConstantInt*    JnjvmModule::OffsetCtpInClassConstant;
+llvm::ConstantInt*    JnjvmModule::ClassReadyConstant;
 const llvm::Type*     JnjvmModule::JavaClassType;
 const llvm::Type*     JnjvmModule::VTType;
 llvm::ConstantInt*    JnjvmModule::JavaArrayElementsOffsetConstant;
@@ -924,6 +925,8 @@
   OffsetDepthInClassConstant = mvm::MvmModule::constantFour;
   OffsetStatusInClassConstant = mvm::MvmModule::constantFive;
   OffsetCtpInClassConstant = mvm::MvmModule::constantSix;
+  
+  ClassReadyConstant = ConstantInt::get(Type::Int32Ty, clinitParent);
 
   LLVMAssessorInfo::initialise();
 }
@@ -990,6 +993,7 @@
   InitialisationCheckFunction = module->getFunction("initialisationCheck");
   ForceInitialisationCheckFunction = 
     module->getFunction("forceInitialisationCheck");
+  InitialiseClassFunction = module->getFunction("jnjvmRuntimeInitialiseClass");
   
   GetConstantPoolAtFunction = module->getFunction("getConstantPoolAt");
   ArrayLengthFunction = module->getFunction("arrayLength");

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=57960&r1=57959&r2=57960&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Wed Oct 22 00:28:42 2008
@@ -252,6 +252,7 @@
   llvm::Function* PrintMethodStartFunction;
   llvm::Function* PrintMethodEndFunction;
   llvm::Function* JniProceedPendingExceptionFunction;
+  llvm::Function* InitialiseClassFunction;
   llvm::Function* InitialisationCheckFunction;
   llvm::Function* ForceInitialisationCheckFunction;
   llvm::Function* ClassLookupFunction;
@@ -311,6 +312,8 @@
   static llvm::ConstantInt* OffsetDisplayInClassConstant;
   static llvm::ConstantInt* OffsetStatusInClassConstant;
   static llvm::ConstantInt* OffsetCtpInClassConstant;
+  
+  static llvm::ConstantInt* ClassReadyConstant;
 
   static llvm::Constant* JavaClassNullConstant;
 

Modified: vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=57960&r1=57959&r2=57960&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Wed Oct 22 00:28:42 2008
@@ -228,9 +228,72 @@
             BranchInst::Create(NBB, ifTrue);
             break;
           }
-        }
-        
-        else if (V == module->GetConstantPoolAtFunction) {
+        } else if (V == module->InitialisationCheckFunction) {
+          Changed = true;
+          
+          BasicBlock* NBB = 0;
+          if (CI->getParent()->getTerminator() != CI) {
+            NBB = II->getParent()->splitBasicBlock(II);
+            CI->getParent()->getTerminator()->eraseFromParent();
+          } else {
+            InvokeInst* Invoke = dyn_cast<InvokeInst>(CI);
+            assert(Invoke && "Last instruction is not an invoke");
+            NBB = Invoke->getNormalDest();
+          }
+          
+          Value* Cl = Call.getArgument(0); 
+          std::vector<Value*> indexes; 
+          indexes.push_back(mvm::MvmModule::constantZero);
+          indexes.push_back(module->OffsetStatusInClassConstant);
+          Value* StatusPtr = GetElementPtrInst::Create(Cl, indexes.begin(),
+                                                       indexes.end(), "", CI);
+          Value* Status = new LoadInst(StatusPtr, "", CI);
+          
+          
+          Value* test = new ICmpInst(ICmpInst::ICMP_UGT, Status,
+                                     jnjvm::JnjvmModule::ClassReadyConstant,
+                                     "", CI);
+ 
+          BasicBlock* trueCl = BasicBlock::Create("Initialized", &F);
+          BasicBlock* falseCl = BasicBlock::Create("Uninitialized", &F);
+          PHINode* node = llvm::PHINode::Create(JnjvmModule::JavaClassType, "", trueCl);
+          node->addIncoming(Cl, CI->getParent());
+          BranchInst::Create(trueCl, falseCl, test, CI);
+  
+          std::vector<Value*> Args;
+          Args.push_back(Cl);
+          
+          Value* res = 0;
+          if (InvokeInst* Invoke = dyn_cast<InvokeInst>(CI)) {
+            BasicBlock* UI = Invoke->getUnwindDest();
+            res = InvokeInst::Create(module->InitialiseClassFunction,
+                                     trueCl, UI, Args.begin(),
+                                     Args.end(), "", falseCl);
+
+            // For some reason, an LLVM pass may add PHI nodes to the
+            // exception destination.
+            BasicBlock::iterator Temp = UI->getInstList().begin();
+            while (PHINode* PHI = dyn_cast<PHINode>(Temp)) {
+              Value* Val = PHI->getIncomingValueForBlock(CI->getParent());
+              PHI->removeIncomingValue(CI->getParent(), false);
+              PHI->addIncoming(Val, falseCl);
+              Temp++;
+            }
+          } else {
+            res = CallInst::Create(module->InitialiseClassFunction,
+                                   Args.begin(), Args.end(), "",
+                                   falseCl);
+            BranchInst::Create(trueCl, falseCl);
+          }
+          
+          node->addIncoming(res, falseCl);
+
+
+          CI->replaceAllUsesWith(node);
+          CI->eraseFromParent();
+          BranchInst::Create(NBB, trueCl);
+          break;
+        } else if (V == module->GetConstantPoolAtFunction) {
           Function* resolver = dyn_cast<Function>(Call.getArgument(0));
           assert(resolver && "Wrong use of GetConstantPoolAt");
           const Type* returnType = resolver->getReturnType();





More information about the vmkit-commits mailing list