[vmkit-commits] [vmkit] r85313 - /vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue Oct 27 14:25:09 PDT 2009


Author: geoffray
Date: Tue Oct 27 16:25:09 2009
New Revision: 85313

URL: http://llvm.org/viewvc/llvm-project?rev=85313&view=rev
Log:
Put correct masks in JIT-generated monitorEnter/monitorExit
implementations.


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

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp Tue Oct 27 16:25:09 2009
@@ -510,12 +510,13 @@
   Value* threadId = getCurrentThread(module->MutatorThreadType);
   threadId = new PtrToIntInst(threadId, module->pointerSizeType, "",
                               currentBlock);
-  threadId = BinaryOperator::CreateOr(threadId, lock, "", currentBlock);
+  Value* newValMask = BinaryOperator::CreateOr(threadId, lock, "",
+                                               currentBlock);
 
   std::vector<Value*> atomicArgs;
   atomicArgs.push_back(lockPtr);
   atomicArgs.push_back(lock);
-  atomicArgs.push_back(threadId);
+  atomicArgs.push_back(newValMask);
 
   // Do the atomic compare and swap.
   Value* atomic = CallInst::Create(module->llvm_atomic_lcs_ptr,
@@ -597,13 +598,16 @@
                             PointerType::getUnqual(module->pointerSizeType),
                             "", currentBlock);
   Value* lock = new LoadInst(lockPtr, "", currentBlock);
+  Value* GCMask = ConstantInt::get(module->pointerSizeType, ~mvm::GCMask);
+
+  Value* lockedMask = BinaryOperator::CreateAnd(lock, GCMask, "", currentBlock);
   
   Value* threadId = getCurrentThread(module->MutatorThreadType);
   threadId = new PtrToIntInst(threadId, module->pointerSizeType, "",
                               currentBlock);
   
-  Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, lock, threadId,
-                            "");
+  Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, lockedMask,
+                            threadId, "");
   
   
   BasicBlock* EndUnlock = createBasicBlock("end unlock");
@@ -617,7 +621,9 @@
   
   // Locked once, set zero
   currentBlock = LockedOnceBB;
-  new StoreInst(module->constantPtrZero, lockPtr, false, currentBlock);
+  GCMask = ConstantInt::get(module->pointerSizeType, mvm::GCMask);
+  lockedMask = BinaryOperator::CreateAnd(lock, GCMask, "", currentBlock);
+  new StoreInst(lockedMask, lockPtr, false, currentBlock);
   BranchInst::Create(EndUnlock, currentBlock);
 
   currentBlock = NotLockedOnceBB;





More information about the vmkit-commits mailing list