[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