[cfe-commits] r114503 - in /cfe/trunk: lib/CodeGen/CGBuiltin.cpp test/CodeGen/atomic.c
Chris Lattner
sabre at nondot.org
Tue Sep 21 16:40:48 PDT 2010
Author: lattner
Date: Tue Sep 21 18:40:48 2010
New Revision: 114503
URL: http://llvm.org/viewvc/llvm-project?rev=114503&view=rev
Log:
fix the rest of rdar://8461279 - clang miscompiles address-space qualified atomics
Modified:
cfe/trunk/lib/CodeGen/CGBuiltin.cpp
cfe/trunk/test/CodeGen/atomic.c
Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=114503&r1=114502&r2=114503&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Tue Sep 21 18:40:48 2010
@@ -85,15 +85,17 @@
/// and the expression node.
static RValue EmitBinaryAtomic(CodeGenFunction &CGF,
Intrinsic::ID Id, const CallExpr *E) {
+ llvm::Value *DestPtr = CGF.EmitScalarExpr(E->getArg(0));
+ unsigned AddrSpace =
+ cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
const llvm::Type *ValueType =
llvm::IntegerType::get(CGF.getLLVMContext(),
CGF.getContext().getTypeSize(E->getType()));
- const llvm::Type *PtrType = ValueType->getPointerTo();
+ const llvm::Type *PtrType = ValueType->getPointerTo(AddrSpace);
const llvm::Type *IntrinsicTypes[2] = { ValueType, PtrType };
Value *AtomF = CGF.CGM.getIntrinsic(Id, IntrinsicTypes, 2);
- Value *Args[2] = { CGF.Builder.CreateBitCast(CGF.EmitScalarExpr(E->getArg(0)),
- PtrType),
+ Value *Args[2] = { CGF.Builder.CreateBitCast(DestPtr, PtrType),
EmitCastToInt(CGF, ValueType,
CGF.EmitScalarExpr(E->getArg(1))) };
return RValue::get(EmitCastFromInt(CGF, E->getType(),
@@ -107,15 +109,18 @@
static RValue EmitBinaryAtomicPost(CodeGenFunction &CGF,
Intrinsic::ID Id, const CallExpr *E,
Instruction::BinaryOps Op) {
+ llvm::Value *DestPtr = CGF.EmitScalarExpr(E->getArg(0));
+ unsigned AddrSpace =
+ cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
+
const llvm::Type *ValueType =
llvm::IntegerType::get(CGF.getLLVMContext(),
CGF.getContext().getTypeSize(E->getType()));
- const llvm::Type *PtrType = ValueType->getPointerTo();
+ const llvm::Type *PtrType = ValueType->getPointerTo(AddrSpace);
const llvm::Type *IntrinsicTypes[2] = { ValueType, PtrType };
Value *AtomF = CGF.CGM.getIntrinsic(Id, IntrinsicTypes, 2);
- Value *Args[2] = { CGF.Builder.CreateBitCast(CGF.EmitScalarExpr(E->getArg(0)),
- PtrType),
+ Value *Args[2] = { CGF.Builder.CreateBitCast(DestPtr, PtrType),
EmitCastToInt(CGF, ValueType,
CGF.EmitScalarExpr(E->getArg(1))) };
Value *Result = EmitCallWithBarrier(CGF, AtomF, Args, Args + 2);
@@ -790,7 +795,7 @@
case Builtin::BI__sync_val_compare_and_swap_16: {
llvm::Value *DestPtr = CGF.EmitScalarExpr(E->getArg(0));
unsigned AddrSpace =
- cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();;
+ cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
const llvm::Type *ValueType =
llvm::IntegerType::get(CGF.getLLVMContext(),
CGF.getContext().getTypeSize(E->getType()));
@@ -816,7 +821,7 @@
case Builtin::BI__sync_bool_compare_and_swap_16: {
llvm::Value *DestPtr = CGF.EmitScalarExpr(E->getArg(0));
unsigned AddrSpace =
- cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();;
+ cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
const llvm::Type *ValueType =
llvm::IntegerType::get(CGF.getLLVMContext(),
CGF.getContext().getTypeSize(E->getArg(1)->getType()));
Modified: cfe/trunk/test/CodeGen/atomic.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/atomic.c?rev=114503&r1=114502&r2=114503&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/atomic.c (original)
+++ cfe/trunk/test/CodeGen/atomic.c Tue Sep 21 18:40:48 2010
@@ -130,6 +130,7 @@
}
+// rdar://8461279 - Atomics with address spaces.
// CHECK: @addrspace
void addrspace(int __attribute__((address_space(256))) * P) {
__sync_bool_compare_and_swap(P, 0, 1);
@@ -142,5 +143,12 @@
// CHECK: call void @llvm.memory.barrier(i1 true, i1 true, i1 true, i1 true, i1 true)
// CHECK: call i32 @llvm.atomic.cmp.swap.i32.p256i32(i32 addrspace(256)*{{.*}}, i32 0, i32 1)
// CHECK: call void @llvm.memory.barrier(i1 true, i1 true, i1 true, i1 true, i1 true)
+
+
+ __sync_xor_and_fetch(P, 123);
+ // CHECK: call void @llvm.memory.barrier(i1 true, i1 true, i1 true, i1 true, i1 true)
+ // CHECK: call i32 @llvm.atomic.load.xor.i32.p256i32(i32 addrspace(256)* {{.*}}, i32 123)
+ // CHECK: call void @llvm.memory.barrier(i1 true, i1 true, i1 true, i1 true, i1 true)
+
}
More information about the cfe-commits
mailing list