blob: 1d36601c271ad0a2332144cc1e2392325943eb39 [file] [log] [blame]
David Chisnallfa35df62012-01-16 17:27:18 +00001// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s
Daniel Sanders933f0a02015-02-18 15:08:37 +00002// RUN: %clang_cc1 -triple mips-linux-gnu -emit-llvm %s -o - | FileCheck %s
David Chisnallfa35df62012-01-16 17:27:18 +00003
Eli Friedman93ee5ca2012-06-16 02:19:17 +00004void foo(int x)
David Chisnallfa35df62012-01-16 17:27:18 +00005{
6 _Atomic(int) i = 0;
Eli Friedman93ee5ca2012-06-16 02:19:17 +00007 _Atomic(short) j = 0;
David Chisnallfa35df62012-01-16 17:27:18 +00008 // Check that multiply / divides on atomics produce a cmpxchg loop
Eli Friedman93ee5ca2012-06-16 02:19:17 +00009 i *= 2;
10 // CHECK: mul nsw i32
Alexey Bataeva47ae902014-12-15 06:12:42 +000011 // CHECK: {{(cmpxchg i32*|i1 @__atomic_compare_exchange\(i32 4,)}}
Eli Friedman93ee5ca2012-06-16 02:19:17 +000012 i /= 2;
13 // CHECK: sdiv i32
Alexey Bataeva47ae902014-12-15 06:12:42 +000014 // CHECK: {{(cmpxchg i32*|i1 @__atomic_compare_exchange\(i32 4, )}}
Eli Friedman93ee5ca2012-06-16 02:19:17 +000015 j /= x;
16 // CHECK: sdiv i32
Alexey Bataeva47ae902014-12-15 06:12:42 +000017 // CHECK: {{(cmpxchg i16*|i1 @__atomic_compare_exchange\(i32 2, )}}
Eli Friedman93ee5ca2012-06-16 02:19:17 +000018
David Chisnallfa35df62012-01-16 17:27:18 +000019}
David Majnemer6866a3c2015-02-14 01:35:07 +000020
21extern _Atomic _Bool b;
22
23_Bool bar() {
24// CHECK-LABEL: @bar
David Blaikiea953f282015-02-27 21:19:58 +000025// CHECK: %[[load:.*]] = load atomic i8, i8* @b seq_cst
David Majnemer6866a3c2015-02-14 01:35:07 +000026// CHECK: %[[tobool:.*]] = trunc i8 %[[load]] to i1
27// CHECK: ret i1 %[[tobool]]
28 return b;
29}
David Majnemerce27e422015-02-14 01:48:17 +000030
31extern _Atomic(_Complex int) x;
32
33void baz(int y) {
34// CHECK-LABEL: @baz
Daniel Sanders933f0a02015-02-18 15:08:37 +000035// CHECK: {{store atomic|call void @__atomic_store}}
David Majnemerce27e422015-02-14 01:48:17 +000036 x += y;
37}