[PATCH] Fix atomic libcall.
Logan Chien
tzuhsiang.chien at gmail.com
Tue Mar 11 07:28:38 PDT 2014
Ping
On Mon, Mar 10, 2014 at 11:55 PM, Logan Chien <tzuhsiang.chien at gmail.com>wrote:
> Revise the test case for no assertion build.
>
> http://llvm-reviews.chandlerc.com/D3006
>
> CHANGE SINCE LAST DIFF
> http://llvm-reviews.chandlerc.com/D3006?vs=7642&id=7700#toc
>
> Files:
> lib/CodeGen/CGAtomic.cpp
> test/CodeGen/atomic-ops-libcall.c
>
> Index: lib/CodeGen/CGAtomic.cpp
> ===================================================================
> --- lib/CodeGen/CGAtomic.cpp
> +++ lib/CodeGen/CGAtomic.cpp
> @@ -476,6 +476,8 @@
> Args.add(RValue::get(EmitCastToVoidPtr(Ptr)), getContext().VoidPtrTy);
>
> std::string LibCallName;
> + QualType LoweredMemTy =
> + MemTy->isPointerType() ? getContext().getIntPtrType() : MemTy;
> QualType RetTy;
> bool HaveRetTy = false;
> switch (E->getOp()) {
> @@ -531,7 +533,7 @@
> case AtomicExpr::AO__c11_atomic_fetch_add:
> case AtomicExpr::AO__atomic_fetch_add:
> LibCallName = "__atomic_fetch_add";
> - AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy,
> + AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1,
> LoweredMemTy,
> E->getExprLoc());
> break;
> // T __atomic_fetch_and_N(T *mem, T val, int order)
> @@ -552,7 +554,7 @@
> case AtomicExpr::AO__c11_atomic_fetch_sub:
> case AtomicExpr::AO__atomic_fetch_sub:
> LibCallName = "__atomic_fetch_sub";
> - AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1, MemTy,
> + AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1,
> LoweredMemTy,
> E->getExprLoc());
> break;
> // T __atomic_fetch_xor_N(T *mem, T val, int order)
> Index: test/CodeGen/atomic-ops-libcall.c
> ===================================================================
> --- /dev/null
> +++ test/CodeGen/atomic-ops-libcall.c
> @@ -0,0 +1,37 @@
> +// RUN: %clang_cc1 < %s -triple armv5e-none-linux-gnueabi -emit-llvm -O1
> | FileCheck %s
> +
> +enum memory_order {
> + memory_order_relaxed, memory_order_consume, memory_order_acquire,
> + memory_order_release, memory_order_acq_rel, memory_order_seq_cst
> +};
> +
> +int *test_c11_atomic_fetch_add_int_ptr(_Atomic(int *) *p) {
> + // CHECK: test_c11_atomic_fetch_add_int_ptr
> + // CHECK: {{%[^ ]*}} = tail call i32* @__atomic_fetch_add_4(i8*
> {{%[0-9]+}}, i32 12, i32 5)
> + return __c11_atomic_fetch_add(p, 3, memory_order_seq_cst);
> +}
> +
> +int *test_c11_atomic_fetch_sub_int_ptr(_Atomic(int *) *p) {
> + // CHECK: test_c11_atomic_fetch_sub_int_ptr
> + // CHECK: {{%[^ ]*}} = tail call i32* @__atomic_fetch_sub_4(i8*
> {{%[0-9]+}}, i32 20, i32 5)
> + return __c11_atomic_fetch_sub(p, 5, memory_order_seq_cst);
> +}
> +
> +int test_c11_atomic_fetch_add_int(_Atomic(int) *p) {
> + // CHECK: test_c11_atomic_fetch_add_int
> + // CHECK: {{%[^ ]*}} = tail call i32 bitcast (i32* (i8*, i32, i32)*
> @__atomic_fetch_add_4 to i32 (i8*, i32, i32)*)(i8* {{%[0-9]+}}, i32 3, i32
> 5)
> + return __c11_atomic_fetch_add(p, 3, memory_order_seq_cst);
> +}
> +
> +int test_c11_atomic_fetch_sub_int(_Atomic(int) *p) {
> + // CHECK: test_c11_atomic_fetch_sub_int
> + // CHECK: {{%[^ ]*}} = tail call i32 bitcast (i32* (i8*, i32, i32)*
> @__atomic_fetch_sub_4 to i32 (i8*, i32, i32)*)(i8* {{%[0-9]+}}, i32 5, i32
> 5)
> + return __c11_atomic_fetch_sub(p, 5, memory_order_seq_cst);
> +}
> +
> +int *fp2a(int **p) {
> + // CHECK: @fp2a
> + // CHECK: {{%[^ ]*}} = tail call i32* @__atomic_fetch_sub_4(i8*
> {{%[0-9]+}}, i32 4, i32 0)
> + // Note, the GNU builtins do not multiply by sizeof(T)!
> + return __atomic_fetch_sub(p, 4, memory_order_relaxed);
> +}
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140311/506e7644/attachment.html>
More information about the cfe-commits
mailing list