[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