[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