[vmkit-commits] [vmkit] r71164 - /vmkit/trunk/lib/JnJVM/Compiler/ExceptionsCheck.inc
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Thu May 7 10:10:28 PDT 2009
Author: geoffray
Date: Thu May 7 12:10:25 2009
New Revision: 71164
URL: http://llvm.org/viewvc/llvm-project?rev=71164&view=rev
Log:
Do a volatile load of an exception after calling a readnon function,
to prevent merging the load with another load.
Modified:
vmkit/trunk/lib/JnJVM/Compiler/ExceptionsCheck.inc
Modified: vmkit/trunk/lib/JnJVM/Compiler/ExceptionsCheck.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/ExceptionsCheck.inc?rev=71164&r1=71163&r2=71164&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/ExceptionsCheck.inc (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/ExceptionsCheck.inc Thu May 7 12:10:25 2009
@@ -15,7 +15,7 @@
currentBlock);
// Get the Java exception.
- Value* obj = new LoadInst(javaExceptionPtr, "", currentBlock);
+ Value* obj = 0;
BasicBlock* ifNormal = createBasicBlock("no exception block");
@@ -29,11 +29,16 @@
F == module->GetConstantPoolAtFunction ||
F == module->GetArrayClassFunction ||
F == module->GetClassDelegateeFunction) {
+ // Make the load volatile to force the instruction after the call.
+ // Otherwise, LLVM will merge the load with a previous load because
+ // the function is readnone.
+ obj = new LoadInst(javaExceptionPtr, "", true, currentBlock);
test = new BitCastInst(res, module->JavaObjectType, "", currentBlock);
test = new ICmpInst(ICmpInst::ICMP_EQ, test, obj, "", currentBlock);
Value* T = new ICmpInst(ICmpInst::ICMP_NE, obj, zero, "", currentBlock);
test = BinaryOperator::CreateAnd(test, T, "", currentBlock);
} else {
+ obj = new LoadInst(javaExceptionPtr, "", currentBlock);
test = new ICmpInst(ICmpInst::ICMP_NE, obj, zero, "", currentBlock);
}
@@ -67,7 +72,7 @@
currentBlock);
// Get the Java exception.
- Value* obj = new LoadInst(javaExceptionPtr, "", currentBlock);
+ Value* obj = 0;
BasicBlock* ifNormal = createBasicBlock("no exception block");
@@ -77,11 +82,13 @@
F == module->GetConstantPoolAtFunction ||
F == module->GetArrayClassFunction ||
F == module->GetClassDelegateeFunction) {
+ obj = new LoadInst(javaExceptionPtr, "", true, currentBlock);
test = new BitCastInst(res, module->JavaObjectType, "", currentBlock);
test = new ICmpInst(ICmpInst::ICMP_EQ, test, obj, "", currentBlock);
Value* T = new ICmpInst(ICmpInst::ICMP_NE, obj, zero, "", currentBlock);
test = BinaryOperator::CreateAnd(test, T, "", currentBlock);
} else {
+ obj = new LoadInst(javaExceptionPtr, "", currentBlock);
test = new ICmpInst(ICmpInst::ICMP_NE, obj, zero, "", currentBlock);
}
@@ -116,7 +123,7 @@
currentBlock);
// Get the Java exception.
- Value* obj = new LoadInst(javaExceptionPtr, "", currentBlock);
+ Value* obj = 0;
BasicBlock* ifNormal = createBasicBlock("no exception block");
@@ -126,11 +133,13 @@
F == module->GetConstantPoolAtFunction ||
F == module->GetArrayClassFunction ||
F == module->GetClassDelegateeFunction) {
+ obj = new LoadInst(javaExceptionPtr, "", true, currentBlock);
test = new BitCastInst(res, module->JavaObjectType, "", currentBlock);
test = new ICmpInst(ICmpInst::ICMP_EQ, test, obj, "", currentBlock);
Value* T = new ICmpInst(ICmpInst::ICMP_NE, obj, zero, "", currentBlock);
test = BinaryOperator::CreateAnd(test, T, "", currentBlock);
} else {
+ obj = new LoadInst(javaExceptionPtr, "", currentBlock);
test = new ICmpInst(ICmpInst::ICMP_NE, obj, zero, "", currentBlock);
}
@@ -162,7 +171,7 @@
currentBlock);
// Get the Java exception.
- Value* obj = new LoadInst(javaExceptionPtr, "", currentBlock);
+ Value* obj = 0;
BasicBlock* ifNormal = createBasicBlock("no exception block");
@@ -172,11 +181,13 @@
F == module->GetConstantPoolAtFunction ||
F == module->GetArrayClassFunction ||
F == module->GetClassDelegateeFunction) {
+ obj = new LoadInst(javaExceptionPtr, "", true, currentBlock);
test = new BitCastInst(res, module->JavaObjectType, "", currentBlock);
test = new ICmpInst(ICmpInst::ICMP_EQ, test, obj, "", currentBlock);
Value* T = new ICmpInst(ICmpInst::ICMP_NE, obj, zero, "", currentBlock);
test = BinaryOperator::CreateAnd(test, T, "", currentBlock);
} else {
+ obj = new LoadInst(javaExceptionPtr, "", currentBlock);
test = new ICmpInst(ICmpInst::ICMP_NE, obj, zero, "", currentBlock);
}
More information about the vmkit-commits
mailing list