[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