1 // Test frontend handling of __sync builtins. 2 // Modified from a gcc testcase. 3 // RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s 4 5 signed char sc; 6 unsigned char uc; 7 signed short ss; 8 unsigned short us; 9 signed int si; 10 unsigned int ui; 11 signed long long sll; 12 unsigned long long ull; 13 14 void test_op_ignore (void) // CHECK: define void @test_op_ignore 15 { 16 (void) __sync_fetch_and_add (&sc, 1); // CHECK: atomicrmw add i8 17 (void) __sync_fetch_and_add (&uc, 1); // CHECK: atomicrmw add i8 18 (void) __sync_fetch_and_add (&ss, 1); // CHECK: atomicrmw add i16 19 (void) __sync_fetch_and_add (&us, 1); // CHECK: atomicrmw add i16 20 (void) __sync_fetch_and_add (&si, 1); // CHECK: atomicrmw add i32 21 (void) __sync_fetch_and_add (&ui, 1); // CHECK: atomicrmw add i32 22 (void) __sync_fetch_and_add (&sll, 1); // CHECK: atomicrmw add i64 23 (void) __sync_fetch_and_add (&ull, 1); // CHECK: atomicrmw add i64 24 25 (void) __sync_fetch_and_sub (&sc, 1); // CHECK: atomicrmw sub i8 26 (void) __sync_fetch_and_sub (&uc, 1); // CHECK: atomicrmw sub i8 27 (void) __sync_fetch_and_sub (&ss, 1); // CHECK: atomicrmw sub i16 28 (void) __sync_fetch_and_sub (&us, 1); // CHECK: atomicrmw sub i16 29 (void) __sync_fetch_and_sub (&si, 1); // CHECK: atomicrmw sub i32 30 (void) __sync_fetch_and_sub (&ui, 1); // CHECK: atomicrmw sub i32 31 (void) __sync_fetch_and_sub (&sll, 1); // CHECK: atomicrmw sub i64 32 (void) __sync_fetch_and_sub (&ull, 1); // CHECK: atomicrmw sub i64 33 34 (void) __sync_fetch_and_or (&sc, 1); // CHECK: atomicrmw or i8 35 (void) __sync_fetch_and_or (&uc, 1); // CHECK: atomicrmw or i8 36 (void) __sync_fetch_and_or (&ss, 1); // CHECK: atomicrmw or i16 37 (void) __sync_fetch_and_or (&us, 1); // CHECK: atomicrmw or i16 38 (void) __sync_fetch_and_or (&si, 1); // CHECK: atomicrmw or i32 39 (void) __sync_fetch_and_or (&ui, 1); // CHECK: atomicrmw or i32 40 (void) __sync_fetch_and_or (&sll, 1); // CHECK: atomicrmw or i64 41 (void) __sync_fetch_and_or (&ull, 1); // CHECK: atomicrmw or i64 42 43 (void) __sync_fetch_and_xor (&sc, 1); // CHECK: atomicrmw xor i8 44 (void) __sync_fetch_and_xor (&uc, 1); // CHECK: atomicrmw xor i8 45 (void) __sync_fetch_and_xor (&ss, 1); // CHECK: atomicrmw xor i16 46 (void) __sync_fetch_and_xor (&us, 1); // CHECK: atomicrmw xor i16 47 (void) __sync_fetch_and_xor (&si, 1); // CHECK: atomicrmw xor i32 48 (void) __sync_fetch_and_xor (&ui, 1); // CHECK: atomicrmw xor i32 49 (void) __sync_fetch_and_xor (&sll, 1); // CHECK: atomicrmw xor i64 50 (void) __sync_fetch_and_xor (&ull, 1); // CHECK: atomicrmw xor i64 51 52 (void) __sync_fetch_and_and (&sc, 1); // CHECK: atomicrmw and i8 53 (void) __sync_fetch_and_and (&uc, 1); // CHECK: atomicrmw and i8 54 (void) __sync_fetch_and_and (&ss, 1); // CHECK: atomicrmw and i16 55 (void) __sync_fetch_and_and (&us, 1); // CHECK: atomicrmw and i16 56 (void) __sync_fetch_and_and (&si, 1); // CHECK: atomicrmw and i32 57 (void) __sync_fetch_and_and (&ui, 1); // CHECK: atomicrmw and i32 58 (void) __sync_fetch_and_and (&sll, 1); // CHECK: atomicrmw and i64 59 (void) __sync_fetch_and_and (&ull, 1); // CHECK: atomicrmw and i64 60 61 } 62 63 void test_fetch_and_op (void) // CHECK: define void @test_fetch_and_op 64 { 65 sc = __sync_fetch_and_add (&sc, 11); // CHECK: atomicrmw add 66 uc = __sync_fetch_and_add (&uc, 11); // CHECK: atomicrmw add 67 ss = __sync_fetch_and_add (&ss, 11); // CHECK: atomicrmw add 68 us = __sync_fetch_and_add (&us, 11); // CHECK: atomicrmw add 69 si = __sync_fetch_and_add (&si, 11); // CHECK: atomicrmw add 70 ui = __sync_fetch_and_add (&ui, 11); // CHECK: atomicrmw add 71 sll = __sync_fetch_and_add (&sll, 11); // CHECK: atomicrmw add 72 ull = __sync_fetch_and_add (&ull, 11); // CHECK: atomicrmw add 73 74 sc = __sync_fetch_and_sub (&sc, 11); // CHECK: atomicrmw sub 75 uc = __sync_fetch_and_sub (&uc, 11); // CHECK: atomicrmw sub 76 ss = __sync_fetch_and_sub (&ss, 11); // CHECK: atomicrmw sub 77 us = __sync_fetch_and_sub (&us, 11); // CHECK: atomicrmw sub 78 si = __sync_fetch_and_sub (&si, 11); // CHECK: atomicrmw sub 79 ui = __sync_fetch_and_sub (&ui, 11); // CHECK: atomicrmw sub 80 sll = __sync_fetch_and_sub (&sll, 11); // CHECK: atomicrmw sub 81 ull = __sync_fetch_and_sub (&ull, 11); // CHECK: atomicrmw sub 82 83 sc = __sync_fetch_and_or (&sc, 11); // CHECK: atomicrmw or 84 uc = __sync_fetch_and_or (&uc, 11); // CHECK: atomicrmw or 85 ss = __sync_fetch_and_or (&ss, 11); // CHECK: atomicrmw or 86 us = __sync_fetch_and_or (&us, 11); // CHECK: atomicrmw or 87 si = __sync_fetch_and_or (&si, 11); // CHECK: atomicrmw or 88 ui = __sync_fetch_and_or (&ui, 11); // CHECK: atomicrmw or 89 sll = __sync_fetch_and_or (&sll, 11); // CHECK: atomicrmw or 90 ull = __sync_fetch_and_or (&ull, 11); // CHECK: atomicrmw or 91 92 sc = __sync_fetch_and_xor (&sc, 11); // CHECK: atomicrmw xor 93 uc = __sync_fetch_and_xor (&uc, 11); // CHECK: atomicrmw xor 94 ss = __sync_fetch_and_xor (&ss, 11); // CHECK: atomicrmw xor 95 us = __sync_fetch_and_xor (&us, 11); // CHECK: atomicrmw xor 96 si = __sync_fetch_and_xor (&si, 11); // CHECK: atomicrmw xor 97 ui = __sync_fetch_and_xor (&ui, 11); // CHECK: atomicrmw xor 98 sll = __sync_fetch_and_xor (&sll, 11); // CHECK: atomicrmw xor 99 ull = __sync_fetch_and_xor (&ull, 11); // CHECK: atomicrmw xor 100 101 sc = __sync_fetch_and_and (&sc, 11); // CHECK: atomicrmw and 102 uc = __sync_fetch_and_and (&uc, 11); // CHECK: atomicrmw and 103 ss = __sync_fetch_and_and (&ss, 11); // CHECK: atomicrmw and 104 us = __sync_fetch_and_and (&us, 11); // CHECK: atomicrmw and 105 si = __sync_fetch_and_and (&si, 11); // CHECK: atomicrmw and 106 ui = __sync_fetch_and_and (&ui, 11); // CHECK: atomicrmw and 107 sll = __sync_fetch_and_and (&sll, 11); // CHECK: atomicrmw and 108 ull = __sync_fetch_and_and (&ull, 11); // CHECK: atomicrmw and 109 110 } 111 112 void test_op_and_fetch (void) 113 { 114 sc = __sync_add_and_fetch (&sc, uc); // CHECK: atomicrmw add 115 uc = __sync_add_and_fetch (&uc, uc); // CHECK: atomicrmw add 116 ss = __sync_add_and_fetch (&ss, uc); // CHECK: atomicrmw add 117 us = __sync_add_and_fetch (&us, uc); // CHECK: atomicrmw add 118 si = __sync_add_and_fetch (&si, uc); // CHECK: atomicrmw add 119 ui = __sync_add_and_fetch (&ui, uc); // CHECK: atomicrmw add 120 sll = __sync_add_and_fetch (&sll, uc); // CHECK: atomicrmw add 121 ull = __sync_add_and_fetch (&ull, uc); // CHECK: atomicrmw add 122 123 sc = __sync_sub_and_fetch (&sc, uc); // CHECK: atomicrmw sub 124 uc = __sync_sub_and_fetch (&uc, uc); // CHECK: atomicrmw sub 125 ss = __sync_sub_and_fetch (&ss, uc); // CHECK: atomicrmw sub 126 us = __sync_sub_and_fetch (&us, uc); // CHECK: atomicrmw sub 127 si = __sync_sub_and_fetch (&si, uc); // CHECK: atomicrmw sub 128 ui = __sync_sub_and_fetch (&ui, uc); // CHECK: atomicrmw sub 129 sll = __sync_sub_and_fetch (&sll, uc); // CHECK: atomicrmw sub 130 ull = __sync_sub_and_fetch (&ull, uc); // CHECK: atomicrmw sub 131 132 sc = __sync_or_and_fetch (&sc, uc); // CHECK: atomicrmw or 133 uc = __sync_or_and_fetch (&uc, uc); // CHECK: atomicrmw or 134 ss = __sync_or_and_fetch (&ss, uc); // CHECK: atomicrmw or 135 us = __sync_or_and_fetch (&us, uc); // CHECK: atomicrmw or 136 si = __sync_or_and_fetch (&si, uc); // CHECK: atomicrmw or 137 ui = __sync_or_and_fetch (&ui, uc); // CHECK: atomicrmw or 138 sll = __sync_or_and_fetch (&sll, uc); // CHECK: atomicrmw or 139 ull = __sync_or_and_fetch (&ull, uc); // CHECK: atomicrmw or 140 141 sc = __sync_xor_and_fetch (&sc, uc); // CHECK: atomicrmw xor 142 uc = __sync_xor_and_fetch (&uc, uc); // CHECK: atomicrmw xor 143 ss = __sync_xor_and_fetch (&ss, uc); // CHECK: atomicrmw xor 144 us = __sync_xor_and_fetch (&us, uc); // CHECK: atomicrmw xor 145 si = __sync_xor_and_fetch (&si, uc); // CHECK: atomicrmw xor 146 ui = __sync_xor_and_fetch (&ui, uc); // CHECK: atomicrmw xor 147 sll = __sync_xor_and_fetch (&sll, uc); // CHECK: atomicrmw xor 148 ull = __sync_xor_and_fetch (&ull, uc); // CHECK: atomicrmw xor 149 150 sc = __sync_and_and_fetch (&sc, uc); // CHECK: atomicrmw and 151 uc = __sync_and_and_fetch (&uc, uc); // CHECK: atomicrmw and 152 ss = __sync_and_and_fetch (&ss, uc); // CHECK: atomicrmw and 153 us = __sync_and_and_fetch (&us, uc); // CHECK: atomicrmw and 154 si = __sync_and_and_fetch (&si, uc); // CHECK: atomicrmw and 155 ui = __sync_and_and_fetch (&ui, uc); // CHECK: atomicrmw and 156 sll = __sync_and_and_fetch (&sll, uc); // CHECK: atomicrmw and 157 ull = __sync_and_and_fetch (&ull, uc); // CHECK: atomicrmw and 158 159 } 160 161 void test_compare_and_swap (void) 162 { 163 sc = __sync_val_compare_and_swap (&sc, uc, sc); // CHECK: cmpxchg i8 164 uc = __sync_val_compare_and_swap (&uc, uc, sc); // CHECK: cmpxchg i8 165 ss = __sync_val_compare_and_swap (&ss, uc, sc); // CHECK: cmpxchg i16 166 us = __sync_val_compare_and_swap (&us, uc, sc); // CHECK: cmpxchg i16 167 si = __sync_val_compare_and_swap (&si, uc, sc); // CHECK: cmpxchg i32 168 ui = __sync_val_compare_and_swap (&ui, uc, sc); // CHECK: cmpxchg i32 169 sll = __sync_val_compare_and_swap (&sll, uc, sc); // CHECK: cmpxchg i64 170 ull = __sync_val_compare_and_swap (&ull, uc, sc); // CHECK: cmpxchg i64 171 172 ui = __sync_bool_compare_and_swap (&sc, uc, sc); // CHECK: cmpxchg 173 ui = __sync_bool_compare_and_swap (&uc, uc, sc); // CHECK: cmpxchg 174 ui = __sync_bool_compare_and_swap (&ss, uc, sc); // CHECK: cmpxchg 175 ui = __sync_bool_compare_and_swap (&us, uc, sc); // CHECK: cmpxchg 176 ui = __sync_bool_compare_and_swap (&si, uc, sc); // CHECK: cmpxchg 177 ui = __sync_bool_compare_and_swap (&ui, uc, sc); // CHECK: cmpxchg 178 ui = __sync_bool_compare_and_swap (&sll, uc, sc); // CHECK: cmpxchg 179 ui = __sync_bool_compare_and_swap (&ull, uc, sc); // CHECK: cmpxchg 180 } 181 182 void test_lock (void) 183 { 184 sc = __sync_lock_test_and_set (&sc, 1); // CHECK: atomicrmw xchg i8 185 uc = __sync_lock_test_and_set (&uc, 1); // CHECK: atomicrmw xchg i8 186 ss = __sync_lock_test_and_set (&ss, 1); // CHECK: atomicrmw xchg i16 187 us = __sync_lock_test_and_set (&us, 1); // CHECK: atomicrmw xchg i16 188 si = __sync_lock_test_and_set (&si, 1); // CHECK: atomicrmw xchg i32 189 ui = __sync_lock_test_and_set (&ui, 1); // CHECK: atomicrmw xchg i32 190 sll = __sync_lock_test_and_set (&sll, 1); // CHECK: atomicrmw xchg i64 191 ull = __sync_lock_test_and_set (&ull, 1); // CHECK: atomicrmw xchg i64 192 193 __sync_synchronize (); // CHECK: fence seq_cst 194 195 __sync_lock_release (&sc); // CHECK: store atomic {{.*}} release, align 1 196 __sync_lock_release (&uc); // CHECK: store atomic {{.*}} release, align 1 197 __sync_lock_release (&ss); // CHECK: store atomic {{.*}} release, align 2 198 __sync_lock_release (&us); /// CHECK: store atomic {{.*}} release, align 2 199 __sync_lock_release (&si); // CHECK: store atomic {{.*}} release, align 4 200 __sync_lock_release (&ui); // CHECK: store atomic {{.*}} release, align 4 201 __sync_lock_release (&sll); // CHECK: store atomic {{.*}} release, align 8 202 __sync_lock_release (&ull); // CHECK: store atomic {{.*}} release, align 8 203 } 204