[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