[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