1c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner// RUN: %clang_cc1 %s -emit-llvm -o - -triple=i686-apple-darwin9 | FileCheck %s
2c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner
3c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattnerint atomic(void) {
4eb4f81e174b11633f7b85f555ea5d2834d6dae8aDaniel Dunbar  // non-sensical test for sync functions
51ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  int old;
61ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  int val = 1;
75caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  char valc = 1;
8db4325b098eff5e9e660db19f0148423fb21f27fChandler Carruth  _Bool valb = 0;
91ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  unsigned int uval = 1;
101ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  int cmp = 0;
11ff993202abf6f5dc41c584c7103f5d39f248b3ddEli Friedman  int* ptrval;
121ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang
131ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  old = __sync_fetch_and_add(&val, 1);
14c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: atomicrmw add i32* %val, i32 1 seq_cst
15c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner
165caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  old = __sync_fetch_and_sub(&valc, 2);
17c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: atomicrmw sub i8* %valc, i8 2 seq_cst
18c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner
191ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  old = __sync_fetch_and_min(&val, 3);
20c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: atomicrmw min i32* %val, i32 3 seq_cst
21c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner
221ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  old = __sync_fetch_and_max(&val, 4);
23c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: atomicrmw max i32* %val, i32 4 seq_cst
24c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner
251ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  old = __sync_fetch_and_umin(&uval, 5u);
26c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: atomicrmw umin i32* %uval, i32 5 seq_cst
27c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner
281ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  old = __sync_fetch_and_umax(&uval, 6u);
29c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: atomicrmw umax i32* %uval, i32 6 seq_cst
30c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner
311ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  old = __sync_lock_test_and_set(&val, 7);
32c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: atomicrmw xchg i32* %val, i32 7 seq_cst
33c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner
3423aa9c8ca0bc441aab2a38a4c9fc7a1c9e9ac16aChris Lattner  old = __sync_swap(&val, 8);
35c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: atomicrmw xchg i32* %val, i32 8 seq_cst
3623aa9c8ca0bc441aab2a38a4c9fc7a1c9e9ac16aChris Lattner
371ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  old = __sync_val_compare_and_swap(&val, 4, 1976);
38c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: cmpxchg i32* %val, i32 4, i32 1976 seq_cst
39c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner
400002d23aaf10f307273dab5facda01c137283d22Daniel Dunbar  old = __sync_bool_compare_and_swap(&val, 4, 1976);
41c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: cmpxchg i32* %val, i32 4, i32 1976 seq_cst
42c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner
431ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  old = __sync_fetch_and_and(&val, 0x9);
44c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: atomicrmw and i32* %val, i32 9 seq_cst
45c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner
461ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  old = __sync_fetch_and_or(&val, 0xa);
47c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: atomicrmw or i32* %val, i32 10 seq_cst
480002d23aaf10f307273dab5facda01c137283d22Daniel Dunbar
49c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner  old = __sync_fetch_and_xor(&val, 0xb);
50c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: atomicrmw xor i32* %val, i32 11 seq_cst
51c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner
520002d23aaf10f307273dab5facda01c137283d22Daniel Dunbar  old = __sync_add_and_fetch(&val, 1);
53c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: atomicrmw add i32* %val, i32 1 seq_cst
54c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner
550002d23aaf10f307273dab5facda01c137283d22Daniel Dunbar  old = __sync_sub_and_fetch(&val, 2);
56c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: atomicrmw sub i32* %val, i32 2 seq_cst
57c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner
585caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  old = __sync_and_and_fetch(&valc, 3);
59c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: atomicrmw and i8* %valc, i8 3 seq_cst
60c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner
615caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  old = __sync_or_and_fetch(&valc, 4);
62c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: atomicrmw or i8* %valc, i8 4 seq_cst
630002d23aaf10f307273dab5facda01c137283d22Daniel Dunbar
64c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner  old = __sync_xor_and_fetch(&valc, 5);
65c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: atomicrmw xor i8* %valc, i8 5 seq_cst
66e7ac0a94f1dee3fae9292eb8372962b6d70b3e0dChris Lattner
67e7ac0a94f1dee3fae9292eb8372962b6d70b3e0dChris Lattner  __sync_val_compare_and_swap((void **)0, (void *)0, (void *)0);
68c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: cmpxchg i32* null, i32 0, i32 0 seq_cst
69c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner
70db4325b098eff5e9e660db19f0148423fb21f27fChandler Carruth  if ( __sync_val_compare_and_swap(&valb, 0, 1)) {
71c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman    // CHECK: cmpxchg i8* %valb, i8 0, i8 1 seq_cst
72db4325b098eff5e9e660db19f0148423fb21f27fChandler Carruth    old = 42;
73db4325b098eff5e9e660db19f0148423fb21f27fChandler Carruth  }
74c7f78c74e155ece8af24cbe8b949daa9d0ba1828Chris Lattner
758d13d221cf7c1657404c611efaadf3ac19d899b3Chandler Carruth  __sync_bool_compare_and_swap((void **)0, (void *)0, (void *)0);
76c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: cmpxchg i32* null, i32 0, i32 0 seq_cst
77f58cd9bca9c2e7373300fc8bb7c57cff7e4eda4fChris Lattner
78f58cd9bca9c2e7373300fc8bb7c57cff7e4eda4fChris Lattner  __sync_lock_release(&val);
79ff993202abf6f5dc41c584c7103f5d39f248b3ddEli Friedman  // CHECK: store atomic i32 0, {{.*}} release, align 4
80ff993202abf6f5dc41c584c7103f5d39f248b3ddEli Friedman
81ff993202abf6f5dc41c584c7103f5d39f248b3ddEli Friedman  __sync_lock_release(&ptrval);
82ff993202abf6f5dc41c584c7103f5d39f248b3ddEli Friedman  // CHECK: store atomic i32 0, {{.*}} release, align 4
83ff993202abf6f5dc41c584c7103f5d39f248b3ddEli Friedman
84f58cd9bca9c2e7373300fc8bb7c57cff7e4eda4fChris Lattner  __sync_synchronize ();
85c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: fence seq_cst
86f58cd9bca9c2e7373300fc8bb7c57cff7e4eda4fChris Lattner
871ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang  return old;
881ffe281890f3cd7728316b45a1f3dd4d3120af7bMon P Wang}
898d13d221cf7c1657404c611efaadf3ac19d899b3Chandler Carruth
90f2b95277be59f7d2a82cef8ea9f4cf6a36074593Chris Lattner// CHECK: @release_return
918d13d221cf7c1657404c611efaadf3ac19d899b3Chandler Carruthvoid release_return(int *lock) {
928d13d221cf7c1657404c611efaadf3ac19d899b3Chandler Carruth  // Ensure this is actually returning void all the way through.
938d13d221cf7c1657404c611efaadf3ac19d899b3Chandler Carruth  return __sync_lock_release(lock);
94eb43f4a8f133c2bc510ae136a556e92b68a6ff44Eli Friedman  // CHECK: store atomic {{.*}} release, align 4
958d13d221cf7c1657404c611efaadf3ac19d899b3Chandler Carruth}
96f2b95277be59f7d2a82cef8ea9f4cf6a36074593Chris Lattner
97f2b95277be59f7d2a82cef8ea9f4cf6a36074593Chris Lattner
984f209445c06a43283c6f72dda7c925538b1578e9Chris Lattner// rdar://8461279 - Atomics with address spaces.
99f2b95277be59f7d2a82cef8ea9f4cf6a36074593Chris Lattner// CHECK: @addrspace
100f2b95277be59f7d2a82cef8ea9f4cf6a36074593Chris Lattnervoid addrspace(int  __attribute__((address_space(256))) * P) {
101f2b95277be59f7d2a82cef8ea9f4cf6a36074593Chris Lattner  __sync_bool_compare_and_swap(P, 0, 1);
102c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: cmpxchg i32 addrspace(256)*{{.*}}, i32 0, i32 1 seq_cst
103c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman
104780a2eb227c3f395a390a143f61bba1724913817Chris Lattner  __sync_val_compare_and_swap(P, 0, 1);
105c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: cmpxchg i32 addrspace(256)*{{.*}}, i32 0, i32 1 seq_cst
106c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman
1074f209445c06a43283c6f72dda7c925538b1578e9Chris Lattner  __sync_xor_and_fetch(P, 123);
108c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  // CHECK: atomicrmw xor i32 addrspace(256)*{{.*}}, i32 123 seq_cst
109f2b95277be59f7d2a82cef8ea9f4cf6a36074593Chris Lattner}
110