[vmkit-commits] [vmkit] r88905 - in /vmkit/trunk/lib/JnJVM/Compiler: JavaJIT.cpp JavaJIT.h JavaJITOpcodes.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Mon Nov 16 01:48:00 PST 2009


Author: geoffray
Date: Mon Nov 16 03:48:00 2009
New Revision: 88905

URL: http://llvm.org/viewvc/llvm-project?rev=88905&view=rev
Log:
Use the CommonClass object of stack values to know their types.


Modified:
    vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp
    vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.h
    vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp

Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp?rev=88905&r1=88904&r2=88905&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp Mon Nov 16 03:48:00 2009
@@ -1453,37 +1453,25 @@
 
 void JavaJIT::addFakePHINodes(BasicBlock* dest, BasicBlock* insert) {
   if(dest->empty()) {
-    for (std::vector<StackTypeInfo>::iterator i = stack.begin(),
+    for (std::vector<CommonClass*>::iterator i = stack.begin(),
          e = stack.end(); i!= e; ++i) {
-      switch (*i) {
-        case Int : {
-          PHINode* node = PHINode::Create(Type::getInt32Ty(getGlobalContext()), "", dest);
-          node->addIncoming(Constant::getNullValue(Type::getInt32Ty(getGlobalContext())), insert);
-          break;
-        }
-        case Float : {
-          PHINode* node = PHINode::Create(Type::getFloatTy(getGlobalContext()), "", dest);
-          node->addIncoming(Constant::getNullValue(Type::getFloatTy(getGlobalContext())), insert);
-          break;
-        }
-        case Double : {
-          PHINode* node = PHINode::Create(Type::getDoubleTy(getGlobalContext()), "", dest);
-          node->addIncoming(Constant::getNullValue(Type::getDoubleTy(getGlobalContext())), insert);
-          break;
-        }
-        case Long : {
-          PHINode* node = PHINode::Create(Type::getInt64Ty(getGlobalContext()), "", dest);
-          node->addIncoming(Constant::getNullValue(Type::getInt64Ty(getGlobalContext())), insert);
-          break;
-        }
-        case Object : {
-          PHINode* node = PHINode::Create(module->JavaObjectType, "", dest);
-          node->addIncoming(Constant::getNullValue(module->JavaObjectType),
-                            insert);
-          break;
-        }
-        default :
-          abort();
+      CommonClass* cl = *i;
+      if (cl == upcalls->OfInt) {
+        PHINode* node = PHINode::Create(Type::getInt32Ty(getGlobalContext()), "", dest);
+        node->addIncoming(Constant::getNullValue(Type::getInt32Ty(getGlobalContext())), insert);
+      } else if (cl == upcalls->OfFloat) {
+        PHINode* node = PHINode::Create(Type::getFloatTy(getGlobalContext()), "", dest);
+        node->addIncoming(Constant::getNullValue(Type::getFloatTy(getGlobalContext())), insert);
+      } else if (cl == upcalls->OfDouble) {
+        PHINode* node = PHINode::Create(Type::getDoubleTy(getGlobalContext()), "", dest);
+        node->addIncoming(Constant::getNullValue(Type::getDoubleTy(getGlobalContext())), insert);
+      } else if (cl == upcalls->OfLong) {
+        PHINode* node = PHINode::Create(Type::getInt64Ty(getGlobalContext()), "", dest);
+        node->addIncoming(Constant::getNullValue(Type::getInt64Ty(getGlobalContext())), insert);
+      } else {
+        PHINode* node = PHINode::Create(module->JavaObjectType, "", dest);
+        node->addIncoming(Constant::getNullValue(module->JavaObjectType),
+                          insert);
       }
     }
   } else {

Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.h?rev=88905&r1=88904&r2=88905&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.h (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.h Mon Nov 16 03:48:00 2009
@@ -23,6 +23,7 @@
 #include "types.h"
 
 #include "JavaClass.h"
+#include "JavaUpcalls.h"
 #include "jnjvm/JnjvmModule.h"
 
 namespace jnjvm {
@@ -51,6 +52,9 @@
   ///
   bool handler;
 
+  /// stack - The stack at this location if there is a new block
+  ///
+  std::vector<CommonClass*> stack;
 };
 
 
@@ -65,6 +69,7 @@
     nbEnveloppes = 0;
     compilingMethod = meth;
     compilingClass = meth->classDef;
+    upcalls = compilingClass->classLoader->bootstrapLoader->upcalls;
     TheCompiler = C;
     module = TheCompiler->getIntrinsics();
     llvmFunction = func;
@@ -89,6 +94,9 @@
   /// compilingMethod - The method being compiled.
   JavaMethod* compilingMethod;
 
+  /// upcalls - Upcalls used tp type the stack and locals.
+  Classpath* upcalls;
+
   /// llvmFunction - The LLVM representation of the method.
   llvm::Function* llvmFunction;
 
@@ -187,17 +195,8 @@
 
 //===------------------------- Stack manipulation -------------------------===//
 
-  typedef enum {
-    Int = 0,
-    Float,
-    Double,
-    Long,
-    Object
-  } StackTypeInfo;
-
-
   /// stack - The compiler stack.
-  std::vector<StackTypeInfo> stack;
+  std::vector<CommonClass*> stack;
   uint32 currentStackIndex;
   std::vector<llvm::AllocaInst*> objectStack;
   std::vector<llvm::AllocaInst*> intStack;
@@ -206,41 +205,41 @@
   std::vector<llvm::AllocaInst*> doubleStack;
 
   /// push - Push a new value in the stack.
-  void push(llvm::Value* val, bool unsign) {
+  void push(llvm::Value* val, bool unsign, CommonClass* cl = 0) {
     const llvm::Type* type = val->getType();
     if (unsign) {
       val = new llvm::ZExtInst(val, llvm::Type::getInt32Ty(*llvmContext), "", currentBlock);
       new llvm::StoreInst(val, intStack[currentStackIndex++], false,
                           currentBlock);
-      stack.push_back(Int);
+      stack.push_back(upcalls->OfInt);
     } else if (type == llvm::Type::getInt8Ty(*llvmContext) ||
                type == llvm::Type::getInt16Ty(*llvmContext)) {
       val = new llvm::SExtInst(val, llvm::Type::getInt32Ty(*llvmContext), "",
                                currentBlock);
       new llvm::StoreInst(val, intStack[currentStackIndex++], false,
                           currentBlock);
-      stack.push_back(Int);
+      stack.push_back(upcalls->OfInt);
     } else if (type == llvm::Type::getInt32Ty(*llvmContext)) {
       new llvm::StoreInst(val, intStack[currentStackIndex++], false,
                           currentBlock);
-      stack.push_back(Int);
+      stack.push_back(upcalls->OfInt);
     } else if (type == llvm::Type::getInt64Ty(*llvmContext)) {
       new llvm::StoreInst(val, longStack[currentStackIndex++], false,
                           currentBlock);
-      stack.push_back(Long);
+      stack.push_back(upcalls->OfLong);
     } else if (type == llvm::Type::getFloatTy(*llvmContext)) {
       new llvm::StoreInst(val, floatStack[currentStackIndex++], false,
                           currentBlock);
-      stack.push_back(Float);
+      stack.push_back(upcalls->OfFloat);
     } else if (type == llvm::Type::getDoubleTy(*llvmContext)) {
       new llvm::StoreInst(val, doubleStack[currentStackIndex++], false,
                           currentBlock);
-      stack.push_back(Double);
+      stack.push_back(upcalls->OfDouble);
     } else {
       assert(type == module->JavaObjectType && "Can't handle this type");
       new llvm::StoreInst(val, objectStack[currentStackIndex++], false,
                           currentBlock);
-      stack.push_back(Object);
+      stack.push_back(cl ? cl : upcalls->OfObject);
     }
   }
 
@@ -254,32 +253,26 @@
 
   /// top - Return the value on top of the stack.
   llvm::Value* top() {
-    StackTypeInfo STI = stack.back();
-    switch (STI) {
-      case Int:
-        return new llvm::LoadInst(intStack[currentStackIndex - 1], false,
-                                  currentBlock);
-      case Float:
-        return new llvm::LoadInst(floatStack[currentStackIndex - 1], false,
-                                  currentBlock);
-      case Double:
-        return new llvm::LoadInst(doubleStack[currentStackIndex - 1], false,
-                                  currentBlock);
-      case Long:
-        return new llvm::LoadInst(longStack[currentStackIndex - 1], false,
-                                  currentBlock);
-      case Object:
-        return new llvm::LoadInst(objectStack[currentStackIndex - 1], false,
-                                  currentBlock);
-      default:
-        assert(0 && "Can not be here");
-    }
-    abort();
-    return 0;
+    CommonClass* cl = stack.back();
+    if (cl == upcalls->OfInt)
+      return new llvm::LoadInst(intStack[currentStackIndex - 1], false,
+                                currentBlock);
+    if (cl == upcalls->OfFloat)
+      return new llvm::LoadInst(floatStack[currentStackIndex - 1], false,
+                                currentBlock);
+    if (cl == upcalls->OfDouble)
+      return new llvm::LoadInst(doubleStack[currentStackIndex - 1], false,
+                                currentBlock);
+    if (cl == upcalls->OfLong)
+      return new llvm::LoadInst(longStack[currentStackIndex - 1], false,
+                                currentBlock);
+    
+    return new llvm::LoadInst(objectStack[currentStackIndex - 1], false,
+                              currentBlock);
   }
   
   /// topTypeInfo - Return the type of the value on top of the stack.
-  StackTypeInfo topTypeInfo() {
+  CommonClass* topTypeInfo() {
     return stack.back();
   }
  
@@ -339,16 +332,20 @@
  
   /// branch - Branch based on a boolean value. Update PHI nodes accordingly.
   void branch(llvm::Value* test, llvm::BasicBlock* ifTrue, 
-              llvm::BasicBlock* ifFalse, llvm::BasicBlock* insert) {
-    addFakePHINodes(ifTrue, insert);
-    addFakePHINodes(ifFalse, insert);
+              llvm::BasicBlock* ifFalse, llvm::BasicBlock* insert,
+              Opinfo& info) {
+    if (stackSize())
+      if (!info.stack.size())
+        info.stack = stack;
     llvm::BranchInst::Create(ifTrue, ifFalse, test, insert);
   }
 
   /// branch - Branch to a new block. Update PHI nodes accordingly.
-  void branch(llvm::BasicBlock* dest, llvm::BasicBlock* insert) {
-    addFakePHINodes(dest, insert);
-    llvm::BranchInst::Create(dest, insert);
+  void branch(Opinfo& info, llvm::BasicBlock* insert) {
+    if (stackSize())
+      if (!info.stack.size())
+        info.stack = stack;
+    llvm::BranchInst::Create(info.newBlock, insert);
   }
   
   /// testPHINodes - Update PHI nodes when branching to a new block.

Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp?rev=88905&r1=88904&r2=88905&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp Mon Nov 16 03:48:00 2009
@@ -138,41 +138,25 @@
     
     if (opinfo->newBlock) {
       if (currentBlock->getTerminator() == 0) {
-        branch(opinfo->newBlock, currentBlock);
+        branch(*opinfo, currentBlock);
       }
       
       currentBlock = opinfo->newBlock;
       
       stack.clear();
-      currentStackIndex = 0;
-      for (BasicBlock::iterator i = opinfo->newBlock->begin(),
-           e = opinfo->newBlock->end(); i != e; ++i) {
-        if (!(isa<PHINode>(i))) {
-          break;
-        } else {
-          ++currentStackIndex;
-          const Type* Ty = i->getType();
-          if (Ty == Type::getInt32Ty(*llvmContext)) {
-            stack.push_back(Int);
-          } else if (Ty == Type::getInt64Ty(*llvmContext)) {
-            stack.push_back(Long);
-          } else if (Ty == Type::getFloatTy(*llvmContext)) {
-            stack.push_back(Float);
-          } else if (Ty == Type::getDoubleTy(*llvmContext)) {
-            stack.push_back(Double);
-          } else if (Ty == module->JavaObjectType) {
-            stack.push_back(Object);
-            if (opinfo->handler) {
-              // If it's a handler, put the exception object in the stack.
-              new StoreInst(i, objectStack[currentStackIndex - 1], "",
-                            currentBlock);
-            }
-          } else {
-            abort();
-          }
-        }
+      if (opinfo->handler) {
+        Instruction* I = opinfo->newBlock->begin();
+        assert(isa<PHINode>(I) && "Handler marlformed");
+        // If it's a handler, put the exception object in the stack.
+        new StoreInst(I, objectStack[0], "", currentBlock);
+        stack.push_back(upcalls->OfObject);
+        currentStackIndex = 1;
+      } else {
+        stack = opinfo->stack;
+        currentStackIndex = stack.size();
       }
     }
+
     currentExceptionBlock = opinfo->exceptionBlock;
     
     // To prevent a gcj bug with useless goto
@@ -1545,7 +1529,8 @@
 
       case IFEQ : {
         uint32 tmp = i;
-        BasicBlock* ifTrue = opcodeInfos[tmp + readS2(bytecodes, i)].newBlock;
+        Opinfo& ifTrueInfo = opcodeInfos[tmp + readS2(bytecodes, i)];
+        BasicBlock* ifTrue = ifTrueInfo.newBlock;
 
         Value* op = pop();
         const Type* type = op->getType();
@@ -1553,14 +1538,15 @@
         llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, op,
                                          val, "");
         BasicBlock* ifFalse = createBasicBlock("false IFEQ");
-        branch(test, ifTrue, ifFalse, currentBlock);
+        branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo);
         currentBlock = ifFalse;
         break;
       }
 
       case IFNE : {
         uint32 tmp = i;
-        BasicBlock* ifTrue = opcodeInfos[tmp + readS2(bytecodes, i)].newBlock;
+        Opinfo& ifTrueInfo = opcodeInfos[tmp + readS2(bytecodes, i)];
+        BasicBlock* ifTrue = ifTrueInfo.newBlock;
         
         Value* op = pop();
         const Type* type = op->getType();
@@ -1568,63 +1554,67 @@
         llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE, op,
                                          val, "");
         BasicBlock* ifFalse = createBasicBlock("false IFNE");
-        branch(test, ifTrue, ifFalse, currentBlock);
+        branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo);
         currentBlock = ifFalse;
         break;
       }
 
       case IFLT : {
         uint32 tmp = i;
-        BasicBlock* ifTrue = opcodeInfos[tmp + readS2(bytecodes, i)].newBlock;
+        Opinfo& ifTrueInfo = opcodeInfos[tmp + readS2(bytecodes, i)];
+        BasicBlock* ifTrue = ifTrueInfo.newBlock;
         Value* op = pop();
         const Type* type = op->getType();
         Constant* val = Constant::getNullValue(type);
         llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_SLT, op,
                                          val, "");
         BasicBlock* ifFalse = createBasicBlock("false IFLT");
-        branch(test, ifTrue, ifFalse, currentBlock);
+        branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo);
         currentBlock = ifFalse;
         break;
       }
 
       case IFGE : {
         uint32 tmp = i;
-        BasicBlock* ifTrue = opcodeInfos[tmp + readS2(bytecodes, i)].newBlock;
+        Opinfo& ifTrueInfo = opcodeInfos[tmp + readS2(bytecodes, i)];
+        BasicBlock* ifTrue = ifTrueInfo.newBlock;
         Value* op = pop();
         const Type* type = op->getType();
         Constant* val = Constant::getNullValue(type);
         llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_SGE, op,
                                          val, "");
         BasicBlock* ifFalse = createBasicBlock("false IFGE");
-        branch(test, ifTrue, ifFalse, currentBlock);
+        branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo);
         currentBlock = ifFalse;
         break;
       }
 
       case IFGT : {
         uint32 tmp = i;
-        BasicBlock* ifTrue = opcodeInfos[tmp + readS2(bytecodes, i)].newBlock;
+        Opinfo& ifTrueInfo = opcodeInfos[tmp + readS2(bytecodes, i)];
+        BasicBlock* ifTrue = ifTrueInfo.newBlock;
         Value* op = pop();
         const Type* type = op->getType();
         Constant* val = Constant::getNullValue(type);
         llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_SGT, op,
                                          val, "");
         BasicBlock* ifFalse = createBasicBlock("false IFGT");
-        branch(test, ifTrue, ifFalse, currentBlock);
+        branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo);
         currentBlock = ifFalse;
         break;
       }
 
       case IFLE : {
         uint32 tmp = i;
-        BasicBlock* ifTrue = opcodeInfos[tmp + readS2(bytecodes, i)].newBlock;
+        Opinfo& ifTrueInfo = opcodeInfos[tmp + readS2(bytecodes, i)];
+        BasicBlock* ifTrue = ifTrueInfo.newBlock;
         Value* op = pop();
         const Type* type = op->getType();
         Constant* val = Constant::getNullValue(type);
         llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_SLE, op,
                                          val, "");
         BasicBlock* ifFalse = createBasicBlock("false IFLE");
-        branch(test, ifTrue, ifFalse, currentBlock);
+        branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo);
         currentBlock = ifFalse;
         break;
       }
@@ -1633,11 +1623,12 @@
         Value *val2 = popAsInt();
         Value *val1 = popAsInt();
         uint32 tmp = i;
-        BasicBlock* ifTrue = opcodeInfos[tmp + readS2(bytecodes, i)].newBlock;
+        Opinfo& ifTrueInfo = opcodeInfos[tmp + readS2(bytecodes, i)];
+        BasicBlock* ifTrue = ifTrueInfo.newBlock;
         llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val1,
                                          val2, "");
         BasicBlock* ifFalse = createBasicBlock("false IF_ICMPEQ");
-        branch(test, ifTrue, ifFalse, currentBlock);
+        branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo);
         currentBlock = ifFalse;
         break;
       }
@@ -1646,11 +1637,12 @@
         Value *val2 = popAsInt();
         Value *val1 = popAsInt();
         uint32 tmp = i;
-        BasicBlock* ifTrue = opcodeInfos[tmp + readS2(bytecodes, i)].newBlock;
+        Opinfo& ifTrueInfo = opcodeInfos[tmp + readS2(bytecodes, i)];
+        BasicBlock* ifTrue = ifTrueInfo.newBlock;
         llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE, val1,
                                          val2, "");
         BasicBlock* ifFalse = createBasicBlock("false IF_ICMPNE");
-        branch(test, ifTrue, ifFalse, currentBlock);
+        branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo);
         currentBlock = ifFalse;
         break;
       }
@@ -1659,11 +1651,12 @@
         Value *val2 = popAsInt();
         Value *val1 = popAsInt();
         uint32 tmp = i;
-        BasicBlock* ifTrue = opcodeInfos[tmp + readS2(bytecodes, i)].newBlock;
+        Opinfo& ifTrueInfo = opcodeInfos[tmp + readS2(bytecodes, i)];
+        BasicBlock* ifTrue = ifTrueInfo.newBlock;
         llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_SLT,
                                          val1, val2, "");
         BasicBlock* ifFalse = createBasicBlock("false IF_IFCMPLT");
-        branch(test, ifTrue, ifFalse, currentBlock);
+        branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo);
         currentBlock = ifFalse;
         break;
       }
@@ -1672,11 +1665,12 @@
         Value *val2 = popAsInt();
         Value *val1 = popAsInt();
         uint32 tmp = i;
-        BasicBlock* ifTrue = opcodeInfos[tmp + readS2(bytecodes, i)].newBlock;
+        Opinfo& ifTrueInfo = opcodeInfos[tmp + readS2(bytecodes, i)];
+        BasicBlock* ifTrue = ifTrueInfo.newBlock;
         llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_SGE,
                                          val1, val2, "");
         BasicBlock* ifFalse = createBasicBlock("false IF_ICMPGE");
-        branch(test, ifTrue, ifFalse, currentBlock);
+        branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo);
         currentBlock = ifFalse;
         break;
       }
@@ -1685,11 +1679,12 @@
         Value *val2 = popAsInt();
         Value *val1 = popAsInt();
         uint32 tmp = i;
-        BasicBlock* ifTrue = opcodeInfos[tmp + readS2(bytecodes, i)].newBlock;
+        Opinfo& ifTrueInfo = opcodeInfos[tmp + readS2(bytecodes, i)];
+        BasicBlock* ifTrue = ifTrueInfo.newBlock;
         llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_SGT,
                                          val1, val2, "");
         BasicBlock* ifFalse = createBasicBlock("false IF_ICMPGT");
-        branch(test, ifTrue, ifFalse, currentBlock);
+        branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo);
         currentBlock = ifFalse;
         break;
       }
@@ -1698,11 +1693,12 @@
         Value *val2 = popAsInt();
         Value *val1 = popAsInt();
         uint32 tmp = i;
-        BasicBlock* ifTrue = opcodeInfos[tmp + readS2(bytecodes, i)].newBlock;
+        Opinfo& ifTrueInfo = opcodeInfos[tmp + readS2(bytecodes, i)];
+        BasicBlock* ifTrue = ifTrueInfo.newBlock;
         llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_SLE,
                                          val1, val2, "");
         BasicBlock* ifFalse = createBasicBlock("false IF_ICMPLE");
-        branch(test, ifTrue, ifFalse, currentBlock);
+        branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo);
         currentBlock = ifFalse;
         break;
       }
@@ -1711,11 +1707,12 @@
         Value *val2 = pop();
         Value *val1 = pop();
         uint32 tmp = i;
-        BasicBlock* ifTrue = opcodeInfos[tmp + readS2(bytecodes, i)].newBlock;
+        Opinfo& ifTrueInfo = opcodeInfos[tmp + readS2(bytecodes, i)];
+        BasicBlock* ifTrue = ifTrueInfo.newBlock;
         llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ,
                                          val1, val2, "");
         BasicBlock* ifFalse = createBasicBlock("false IF_ACMPEQ");
-        branch(test, ifTrue, ifFalse, currentBlock);
+        branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo);
         currentBlock = ifFalse;
         break;
       }
@@ -1724,18 +1721,19 @@
         Value *val2 = pop();
         Value *val1 = pop();
         uint32 tmp = i;
-        BasicBlock* ifTrue = opcodeInfos[tmp + readS2(bytecodes, i)].newBlock;
+        Opinfo& ifTrueInfo = opcodeInfos[tmp + readS2(bytecodes, i)];
+        BasicBlock* ifTrue = ifTrueInfo.newBlock;
         llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE,
                                          val1, val2, "");
         BasicBlock* ifFalse = createBasicBlock("false IF_ACMPNE");
-        branch(test, ifTrue, ifFalse, currentBlock);
+        branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo);
         currentBlock = ifFalse;
         break;
       }
 
       case GOTO : {
         uint32 tmp = i;
-        branch(opcodeInfos[tmp + readS2(bytecodes, i)].newBlock,
+        branch(opcodeInfos[tmp + readS2(bytecodes, i)],
                currentBlock);
         break;
       }
@@ -1749,7 +1747,7 @@
                                                      uint64_t (index)),
                                     module->JavaObjectType);
         push(expr, false);
-        branch(opcodeInfos[tmp + readS2(bytecodes, i)].newBlock,
+        branch(opcodeInfos[tmp + readS2(bytecodes, i)],
                currentBlock);
         break;
       }
@@ -1775,7 +1773,7 @@
         uint32 reste = (i + 1) & 3;
         uint32 filled = reste ?  (4 - reste) : 0;
         i += filled;
-        BasicBlock* def = opcodeInfos[tmp + readU4(bytecodes, i)].newBlock;
+        Opinfo& def = opcodeInfos[tmp + readU4(bytecodes, i)];
 
         sint32 low = readS4(bytecodes, i);
         sint32 high = readS4(bytecodes, i) + 1;
@@ -1787,8 +1785,8 @@
           Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ,
                                     ConstantInt::get(type, cur), index, "");
           BasicBlock* falseBlock = createBasicBlock("continue tableswitch");
-          branch(cmp, opcodeInfos[tmp + readU4(bytecodes, i)].newBlock,
-                 falseBlock, currentBlock);
+          Opinfo& info = opcodeInfos[tmp + readU4(bytecodes, i)];
+          branch(cmp, info.newBlock, falseBlock, currentBlock, info);
           currentBlock = falseBlock;
         }
        
@@ -1803,7 +1801,7 @@
         uint32 tmp = i;
         uint32 filled = (3 - i) & 3;
         i += filled;
-        BasicBlock* def = opcodeInfos[tmp + readU4(bytecodes, i)].newBlock;
+        Opinfo& def = opcodeInfos[tmp + readU4(bytecodes, i)];
         uint32 nbs = readU4(bytecodes, i);
         
         bool unsign = topIsUnsigned();
@@ -1819,8 +1817,8 @@
           Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val, key,
                                     "");
           BasicBlock* falseBlock = createBasicBlock("continue lookupswitch");
-          branch(cmp, opcodeInfos[tmp + readU4(bytecodes, i)].newBlock,
-                 falseBlock, currentBlock);
+          Opinfo& info = opcodeInfos[tmp + readU4(bytecodes, i)];
+          branch(cmp, info.newBlock, falseBlock, currentBlock, info);
           currentBlock = falseBlock;
         }
         branch(def, currentBlock);
@@ -2202,8 +2200,9 @@
         llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, val,
                                          nil, "");
         BasicBlock* ifFalse = createBasicBlock("true IFNULL");
-        BasicBlock* ifTrue = opcodeInfos[readS2(bytecodes, i) + tmp].newBlock;
-        branch(test, ifTrue, ifFalse, currentBlock);
+        Opinfo& ifTrueInfo = opcodeInfos[tmp + readS2(bytecodes, i)];
+        BasicBlock* ifTrue = ifTrueInfo.newBlock;
+        branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo);
         currentBlock = ifFalse;
         break;
       }
@@ -2215,8 +2214,9 @@
         llvm::Value* test = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE, val,
                                          nil, "");
         BasicBlock* ifFalse = createBasicBlock("false IFNONNULL");
-        BasicBlock* ifTrue = opcodeInfos[readS2(bytecodes, i) + tmp].newBlock;
-        branch(test, ifTrue, ifFalse, currentBlock);
+        Opinfo& ifTrueInfo = opcodeInfos[tmp + readS2(bytecodes, i)];
+        BasicBlock* ifTrue = ifTrueInfo.newBlock;
+        branch(test, ifTrue, ifFalse, currentBlock, ifTrueInfo);
         currentBlock = ifFalse;
         break;
       }





More information about the vmkit-commits mailing list