diff options
author | Tim Northover <tnorthover@apple.com> | 2014-06-13 14:24:59 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2014-06-13 14:24:59 +0000 |
commit | b49b04bbe01e23dc79bbe3011a1381c0cd7bdb4a (patch) | |
tree | e2efb30d5767b9b7e7cb17b31440f6fd837ab670 /clang/lib | |
parent | d7756c5a68c845f9613987c1a3f458d0bd0e737a (diff) | |
download | bcm5719-llvm-b49b04bbe01e23dc79bbe3011a1381c0cd7bdb4a.tar.gz bcm5719-llvm-b49b04bbe01e23dc79bbe3011a1381c0cd7bdb4a.zip |
IR-change: cmpxchg operations now return { iN, i1 }.
This is a minimal fix for clang. I'll soon add support for generating
weak variants when requested, but that's not really necessary for the
LLVM change in isolation.
llvm-svn: 210907
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/CodeGen/CGAtomic.cpp | 7 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 12 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGExprScalar.cpp | 10 |
3 files changed, 16 insertions, 13 deletions
diff --git a/clang/lib/CodeGen/CGAtomic.cpp b/clang/lib/CodeGen/CGAtomic.cpp index 18eb065226c..ad4ba88dc15 100644 --- a/clang/lib/CodeGen/CGAtomic.cpp +++ b/clang/lib/CodeGen/CGAtomic.cpp @@ -186,13 +186,14 @@ static void emitAtomicCmpXchg(CodeGenFunction &CGF, AtomicExpr *E, llvm::LoadInst *Desired = CGF.Builder.CreateLoad(Val2); Desired->setAlignment(Align); - llvm::AtomicCmpXchgInst *Old = CGF.Builder.CreateAtomicCmpXchg( + llvm::AtomicCmpXchgInst *Pair = CGF.Builder.CreateAtomicCmpXchg( Ptr, Expected, Desired, SuccessOrder, FailureOrder); - Old->setVolatile(E->isVolatile()); + Pair->setVolatile(E->isVolatile()); // Cmp holds the result of the compare-exchange operation: true on success, // false on failure. - llvm::Value *Cmp = CGF.Builder.CreateICmpEQ(Old, Expected); + llvm::Value *Old = CGF.Builder.CreateExtractValue(Pair, 0); + llvm::Value *Cmp = CGF.Builder.CreateExtractValue(Pair, 1); // This basic block is used to hold the store instruction if the operation // failed. diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index f705ed80c14..47245cf2d83 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -975,6 +975,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, Value *Result = Builder.CreateAtomicCmpXchg(Args[0], Args[1], Args[2], llvm::SequentiallyConsistent, llvm::SequentiallyConsistent); + Result = Builder.CreateExtractValue(Result, 0); Result = EmitFromInt(*this, Result, T, ValueType); return RValue::get(Result); } @@ -998,11 +999,10 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, Args[1] = EmitToInt(*this, EmitScalarExpr(E->getArg(1)), T, IntType); Args[2] = EmitToInt(*this, EmitScalarExpr(E->getArg(2)), T, IntType); - Value *OldVal = Args[1]; - Value *PrevVal = Builder.CreateAtomicCmpXchg(Args[0], Args[1], Args[2], - llvm::SequentiallyConsistent, - llvm::SequentiallyConsistent); - Value *Result = Builder.CreateICmpEQ(PrevVal, OldVal); + Value *Pair = Builder.CreateAtomicCmpXchg(Args[0], Args[1], Args[2], + llvm::SequentiallyConsistent, + llvm::SequentiallyConsistent); + Value *Result = Builder.CreateExtractValue(Pair, 1); // zext bool to int. Result = Builder.CreateZExt(Result, ConvertType(E->getType())); return RValue::get(Result); @@ -1524,7 +1524,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, SequentiallyConsistent, SequentiallyConsistent); CXI->setVolatile(true); - return RValue::get(CXI); + return RValue::get(Builder.CreateExtractValue(CXI, 0)); } case Builtin::BI_InterlockedIncrement: { AtomicRMWInst *RMWI = Builder.CreateAtomicRMW( diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index 4dfa1696158..14ef5b79826 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -1732,11 +1732,12 @@ 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( + llvm::Value *pair = Builder.CreateAtomicCmpXchg( LV.getAddress(), atomicPHI, CGF.EmitToMemory(value, type), llvm::SequentiallyConsistent, llvm::SequentiallyConsistent); + llvm::Value *old = Builder.CreateExtractValue(pair, 0); + llvm::Value *success = Builder.CreateExtractValue(pair, 1); atomicPHI->addIncoming(old, opBB); - llvm::Value *success = Builder.CreateICmpEQ(old, atomicPHI); Builder.CreateCondBr(success, contBB, opBB); Builder.SetInsertPoint(contBB); return isPre ? value : input; @@ -2075,11 +2076,12 @@ LValue ScalarExprEmitter::EmitCompoundAssignLValue( if (atomicPHI) { llvm::BasicBlock *opBB = Builder.GetInsertBlock(); llvm::BasicBlock *contBB = CGF.createBasicBlock("atomic_cont", CGF.CurFn); - llvm::Value *old = Builder.CreateAtomicCmpXchg( + llvm::Value *pair = Builder.CreateAtomicCmpXchg( LHSLV.getAddress(), atomicPHI, CGF.EmitToMemory(Result, LHSTy), llvm::SequentiallyConsistent, llvm::SequentiallyConsistent); + llvm::Value *old = Builder.CreateExtractValue(pair, 0); + llvm::Value *success = Builder.CreateExtractValue(pair, 1); atomicPHI->addIncoming(old, opBB); - llvm::Value *success = Builder.CreateICmpEQ(old, atomicPHI); Builder.CreateCondBr(success, contBB, opBB); Builder.SetInsertPoint(contBB); return LHSLV; |