зеркало из https://github.com/microsoft/clang-1.git
fix the rest of rdar://8461279 - clang miscompiles address-space qualified atomics
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@114503 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
780a2eb227
Коммит
4f209445c0
|
@ -85,15 +85,17 @@ static Value *EmitCallWithBarrier(CodeGenFunction &CGF, Value *Fn,
|
|||
/// 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 EmitBinaryAtomic(CodeGenFunction &CGF,
|
|||
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 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
|
|||
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 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
|
|||
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()));
|
||||
|
|
|
@ -130,6 +130,7 @@ void release_return(int *lock) {
|
|||
}
|
||||
|
||||
|
||||
// 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 @@ void addrspace(int __attribute__((address_space(256))) * P) {
|
|||
// 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)
|
||||
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче