]> granicus.if.org Git - clang/commitdiff
Update for IR: add a second AtomicOrdering to cmpxchg insts.
authorTim Northover <tnorthover@apple.com>
Tue, 11 Mar 2014 10:49:03 +0000 (10:49 +0000)
committerTim Northover <tnorthover@apple.com>
Tue, 11 Mar 2014 10:49:03 +0000 (10:49 +0000)
rdar://problem/15996804

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203560 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGAtomic.cpp
lib/CodeGen/CGBuiltin.cpp
lib/CodeGen/CGExprScalar.cpp

index 88655774044c77e022390f62337884f479bf186f..b5a494e2879f87289c3c0623543f12e5a394180b 100644 (file)
@@ -201,13 +201,14 @@ EmitAtomicOp(CodeGenFunction &CGF, AtomicExpr *E, llvm::Value *Dest,
   case AtomicExpr::AO__atomic_compare_exchange_n: {
     // Note that cmpxchg only supports specifying one ordering and
     // doesn't support weak cmpxchg, at least at the moment.
-
     llvm::LoadInst *Expected = CGF.Builder.CreateLoad(Val1);
     Expected->setAlignment(Align);
     llvm::LoadInst *Desired = CGF.Builder.CreateLoad(Val2);
     Desired->setAlignment(Align);
-    llvm::AtomicCmpXchgInst *Old =
-        CGF.Builder.CreateAtomicCmpXchg(Ptr, Expected, Desired, Order);
+    llvm::AtomicOrdering FailureOrder =
+        llvm::AtomicCmpXchgInst::getStrongestFailureOrdering(Order);
+    llvm::AtomicCmpXchgInst *Old = CGF.Builder.CreateAtomicCmpXchg(
+        Ptr, Expected, Desired, Order, FailureOrder);
     Old->setVolatile(E->isVolatile());
 
     // Cmp holds the result of the compare-exchange operation: true on success,
index 396641920811006b6dbfe68f2f3d6723591c22a3..76493254e719b6f4f83ab7f797c10c5e3c28cf8e 100644 (file)
@@ -964,6 +964,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
     Args[2] = EmitToInt(*this, EmitScalarExpr(E->getArg(2)), T, IntType);
 
     Value *Result = Builder.CreateAtomicCmpXchg(Args[0], Args[1], Args[2],
+                                                llvm::SequentiallyConsistent,
                                                 llvm::SequentiallyConsistent);
     Result = EmitFromInt(*this, Result, T, ValueType);
     return RValue::get(Result);
@@ -990,6 +991,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
 
     Value *OldVal = Args[1];
     Value *PrevVal = Builder.CreateAtomicCmpXchg(Args[0], Args[1], Args[2],
+                                                 llvm::SequentiallyConsistent,
                                                  llvm::SequentiallyConsistent);
     Value *Result = Builder.CreateICmpEQ(PrevVal, OldVal);
     // zext bool to int.
@@ -1504,6 +1506,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
         EmitScalarExpr(E->getArg(0)),
         EmitScalarExpr(E->getArg(2)),
         EmitScalarExpr(E->getArg(1)),
+        SequentiallyConsistent,
         SequentiallyConsistent);
       CXI->setVolatile(true);
       return RValue::get(CXI);
index 580cb15028c4c40bf91b5041186aada63f521b8d..5f932b08b55bee878bdd772be4c9697bc9f8ef04 100644 (file)
@@ -1735,8 +1735,9 @@ ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
   if (atomicPHI) {
     llvm::BasicBlock *opBB = Builder.GetInsertBlock();
     llvm::BasicBlock *contBB = CGF.createBasicBlock("atomic_cont", CGF.CurFn);
-    llvm::Value *old = Builder.CreateAtomicCmpXchg(LV.getAddress(), atomicPHI,
-        CGF.EmitToMemory(value, type), llvm::SequentiallyConsistent);
+    llvm::Value *old = Builder.CreateAtomicCmpXchg(
+        LV.getAddress(), atomicPHI, CGF.EmitToMemory(value, type),
+        llvm::SequentiallyConsistent, llvm::SequentiallyConsistent);
     atomicPHI->addIncoming(old, opBB);
     llvm::Value *success = Builder.CreateICmpEQ(old, atomicPHI);
     Builder.CreateCondBr(success, contBB, opBB);
@@ -2077,8 +2078,9 @@ LValue ScalarExprEmitter::EmitCompoundAssignLValue(
   if (atomicPHI) {
     llvm::BasicBlock *opBB = Builder.GetInsertBlock();
     llvm::BasicBlock *contBB = CGF.createBasicBlock("atomic_cont", CGF.CurFn);
-    llvm::Value *old = Builder.CreateAtomicCmpXchg(LHSLV.getAddress(), atomicPHI,
-        CGF.EmitToMemory(Result, LHSTy), llvm::SequentiallyConsistent);
+    llvm::Value *old = Builder.CreateAtomicCmpXchg(
+        LHSLV.getAddress(), atomicPHI, CGF.EmitToMemory(Result, LHSTy),
+        llvm::SequentiallyConsistent, llvm::SequentiallyConsistent);
     atomicPHI->addIncoming(old, opBB);
     llvm::Value *success = Builder.CreateICmpEQ(old, atomicPHI);
     Builder.CreateCondBr(success, contBB, opBB);