[vmkit-commits] [vmkit] r58172 - /vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Sat Oct 25 16:30:41 PDT 2008
Author: geoffray
Date: Sat Oct 25 18:30:41 2008
New Revision: 58172
URL: http://llvm.org/viewvc/llvm-project?rev=58172&view=rev
Log:
Inline of virtual calls (currently disabled).
Modified:
vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=58172&r1=58171&r2=58172&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Sat Oct 25 18:30:41 2008
@@ -70,9 +70,33 @@
const llvm::FunctionType* virtualType = LSI->getVirtualType();
FunctionType::param_iterator it = virtualType->param_end();
makeArgs(it, index, args, signature->args.size() + 1);
+ const llvm::Type* retType = virtualType->getReturnType();
+
+ JITVerifyNull(args[0]);
+ BasicBlock* endBlock = 0;
+ PHINode* node = 0;
+ if (meth && !isAbstract(meth->access) && meth->canBeInlined &&
+ meth != compilingMethod && inlineMethods[meth] == 0) {
+ Value* cl = CallInst::Create(module->GetClassFunction, args[0], "",
+ currentBlock);
+ Value* cl2 = module->getNativeClass((Class*)cl, this);
+ Value* test = new ICmpInst(ICmpInst::ICMP_EQ, cl, cl2, "", currentBlock);
+
+ BasicBlock* trueBlock = createBasicBlock("true virtual invoke");
+ BasicBlock* falseBlock = createBasicBlock("false virtual invoke");
+ endBlock = createBasicBlock("end virtual invoke");
+ BranchInst::Create(trueBlock, falseBlock, test, currentBlock);
+ currentBlock = trueBlock;
+ Value* res = invokeInline(meth, args);
+ BranchInst::Create(endBlock, currentBlock);
+ if (retType != Type::VoidTy) {
+ node = PHINode::Create(virtualType->getReturnType(), "", endBlock);
+ node->addIncoming(res, currentBlock);
+ }
+ currentBlock = falseBlock;
+ }
- JITVerifyNull(args[0]);
Value* VT = CallInst::Create(module->GetVTFunction, args[0], "",
currentBlock);
@@ -117,7 +141,15 @@
#endif
Value* val = invoke(Func, args, "", currentBlock);
- const llvm::Type* retType = virtualType->getReturnType();
+ if (endBlock) {
+ if (node) {
+ node->addIncoming(val, currentBlock);
+ val = node;
+ }
+ BranchInst::Create(endBlock, currentBlock);
+ currentBlock = endBlock;
+ }
+
if (retType != Type::VoidTy) {
push(val, retTypedef->isUnsigned());
if (retType == Type::DoubleTy || retType == Type::Int64Ty) {
More information about the vmkit-commits
mailing list