1*67e74705SXin Li // XFAIL: hexagon,sparc 2*67e74705SXin Li // (due to not having native load atomic support) 3*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s 4*67e74705SXin Li // RUN: %clang_cc1 -triple mips-linux-gnu -emit-llvm %s -o - | FileCheck %s 5*67e74705SXin Li foo(int x)6*67e74705SXin Livoid foo(int x) 7*67e74705SXin Li { 8*67e74705SXin Li _Atomic(int) i = 0; 9*67e74705SXin Li _Atomic(short) j = 0; 10*67e74705SXin Li // Check that multiply / divides on atomics produce a cmpxchg loop 11*67e74705SXin Li i *= 2; 12*67e74705SXin Li // CHECK: mul nsw i32 13*67e74705SXin Li // CHECK: {{(cmpxchg i32*|i1 @__atomic_compare_exchange\(i32 4,)}} 14*67e74705SXin Li i /= 2; 15*67e74705SXin Li // CHECK: sdiv i32 16*67e74705SXin Li // CHECK: {{(cmpxchg i32*|i1 @__atomic_compare_exchange\(i32 4, )}} 17*67e74705SXin Li j /= x; 18*67e74705SXin Li // CHECK: sdiv i32 19*67e74705SXin Li // CHECK: {{(cmpxchg i16*|i1 @__atomic_compare_exchange\(i32 2, )}} 20*67e74705SXin Li 21*67e74705SXin Li } 22*67e74705SXin Li 23*67e74705SXin Li extern _Atomic _Bool b; 24*67e74705SXin Li bar()25*67e74705SXin Li_Bool bar() { 26*67e74705SXin Li // CHECK-LABEL: @bar 27*67e74705SXin Li // CHECK: %[[load:.*]] = load atomic i8, i8* @b seq_cst 28*67e74705SXin Li // CHECK: %[[tobool:.*]] = trunc i8 %[[load]] to i1 29*67e74705SXin Li // CHECK: ret i1 %[[tobool]] 30*67e74705SXin Li return b; 31*67e74705SXin Li } 32*67e74705SXin Li 33*67e74705SXin Li extern _Atomic(_Complex int) x; 34*67e74705SXin Li baz(int y)35*67e74705SXin Livoid baz(int y) { 36*67e74705SXin Li // CHECK-LABEL: @baz 37*67e74705SXin Li // CHECK: {{store atomic|call void @__atomic_store}} 38*67e74705SXin Li x += y; 39*67e74705SXin Li } 40