diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2014-11-22 10:44:12 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2014-11-22 10:44:12 +0000 |
| commit | d8cd8f7b6ea236d3fefec3e50738645cf470712b (patch) | |
| tree | 864d4f9bfef3bd53299fac93ccb6665064ac2596 /clang/lib/CodeGen | |
| parent | 5852b1f4c28fbaa42413a1b3ca7401ac314e4336 (diff) | |
| download | bcm5719-llvm-d8cd8f7b6ea236d3fefec3e50738645cf470712b.tar.gz bcm5719-llvm-d8cd8f7b6ea236d3fefec3e50738645cf470712b.zip | |
CodeGen: Make atomic operations play nice with address spaces
We were being a little sloppy with our pointer/address space casts.
This fixes PR21643.
llvm-svn: 222615
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/CGAtomic.cpp | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/clang/lib/CodeGen/CGAtomic.cpp b/clang/lib/CodeGen/CGAtomic.cpp index f4d90a6dfd4..c83ae13b682 100644 --- a/clang/lib/CodeGen/CGAtomic.cpp +++ b/clang/lib/CodeGen/CGAtomic.cpp @@ -765,13 +765,15 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E, llvm::Value *Dest) { E->getOp() == AtomicExpr::AO__atomic_load || E->getOp() == AtomicExpr::AO__atomic_load_n; - llvm::Type *IPtrTy = - llvm::IntegerType::get(getLLVMContext(), Size * 8)->getPointerTo(); + llvm::Type *ITy = + llvm::IntegerType::get(getLLVMContext(), Size * 8); llvm::Value *OrigDest = Dest; - Ptr = Builder.CreateBitCast(Ptr, IPtrTy); - if (Val1) Val1 = Builder.CreateBitCast(Val1, IPtrTy); - if (Val2) Val2 = Builder.CreateBitCast(Val2, IPtrTy); - if (Dest && !E->isCmpXChg()) Dest = Builder.CreateBitCast(Dest, IPtrTy); + Ptr = Builder.CreateBitCast( + Ptr, ITy->getPointerTo(Ptr->getType()->getPointerAddressSpace())); + if (Val1) Val1 = Builder.CreateBitCast(Val1, ITy->getPointerTo()); + if (Val2) Val2 = Builder.CreateBitCast(Val2, ITy->getPointerTo()); + if (Dest && !E->isCmpXChg()) + Dest = Builder.CreateBitCast(Dest, ITy->getPointerTo()); if (isa<llvm::ConstantInt>(Order)) { int ord = cast<llvm::ConstantInt>(Order)->getZExtValue(); |

