1; RUN: llc < %s -mtriple=x86_64-apple-darwin8 > %t.x86-64
2; RUN: llc < %s -mtriple=i686-apple-darwin8 -mattr=cx16 > %t.x86
3target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
4
5@sc = common global i8 0
6@uc = common global i8 0
7@ss = common global i16 0
8@us = common global i16 0
9@si = common global i32 0
10@ui = common global i32 0
11@sl = common global i64 0
12@ul = common global i64 0
13@sll = common global i64 0
14@ull = common global i64 0
15
16define void @test_op_ignore() nounwind {
17entry:
18  %0 = atomicrmw add i8* @sc, i8 1 monotonic
19  %1 = atomicrmw add i8* @uc, i8 1 monotonic
20  %2 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
21  %3 = atomicrmw add i16* %2, i16 1 monotonic
22  %4 = bitcast i8* bitcast (i16* @us to i8*) to i16*
23  %5 = atomicrmw add i16* %4, i16 1 monotonic
24  %6 = bitcast i8* bitcast (i32* @si to i8*) to i32*
25  %7 = atomicrmw add i32* %6, i32 1 monotonic
26  %8 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
27  %9 = atomicrmw add i32* %8, i32 1 monotonic
28  %10 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
29  %11 = atomicrmw add i64* %10, i64 1 monotonic
30  %12 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
31  %13 = atomicrmw add i64* %12, i64 1 monotonic
32  %14 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
33  %15 = atomicrmw add i64* %14, i64 1 monotonic
34  %16 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
35  %17 = atomicrmw add i64* %16, i64 1 monotonic
36  %18 = atomicrmw sub i8* @sc, i8 1 monotonic
37  %19 = atomicrmw sub i8* @uc, i8 1 monotonic
38  %20 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
39  %21 = atomicrmw sub i16* %20, i16 1 monotonic
40  %22 = bitcast i8* bitcast (i16* @us to i8*) to i16*
41  %23 = atomicrmw sub i16* %22, i16 1 monotonic
42  %24 = bitcast i8* bitcast (i32* @si to i8*) to i32*
43  %25 = atomicrmw sub i32* %24, i32 1 monotonic
44  %26 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
45  %27 = atomicrmw sub i32* %26, i32 1 monotonic
46  %28 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
47  %29 = atomicrmw sub i64* %28, i64 1 monotonic
48  %30 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
49  %31 = atomicrmw sub i64* %30, i64 1 monotonic
50  %32 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
51  %33 = atomicrmw sub i64* %32, i64 1 monotonic
52  %34 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
53  %35 = atomicrmw sub i64* %34, i64 1 monotonic
54  %36 = atomicrmw or i8* @sc, i8 1 monotonic
55  %37 = atomicrmw or i8* @uc, i8 1 monotonic
56  %38 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
57  %39 = atomicrmw or i16* %38, i16 1 monotonic
58  %40 = bitcast i8* bitcast (i16* @us to i8*) to i16*
59  %41 = atomicrmw or i16* %40, i16 1 monotonic
60  %42 = bitcast i8* bitcast (i32* @si to i8*) to i32*
61  %43 = atomicrmw or i32* %42, i32 1 monotonic
62  %44 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
63  %45 = atomicrmw or i32* %44, i32 1 monotonic
64  %46 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
65  %47 = atomicrmw or i64* %46, i64 1 monotonic
66  %48 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
67  %49 = atomicrmw or i64* %48, i64 1 monotonic
68  %50 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
69  %51 = atomicrmw or i64* %50, i64 1 monotonic
70  %52 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
71  %53 = atomicrmw or i64* %52, i64 1 monotonic
72  %54 = atomicrmw xor i8* @sc, i8 1 monotonic
73  %55 = atomicrmw xor i8* @uc, i8 1 monotonic
74  %56 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
75  %57 = atomicrmw xor i16* %56, i16 1 monotonic
76  %58 = bitcast i8* bitcast (i16* @us to i8*) to i16*
77  %59 = atomicrmw xor i16* %58, i16 1 monotonic
78  %60 = bitcast i8* bitcast (i32* @si to i8*) to i32*
79  %61 = atomicrmw xor i32* %60, i32 1 monotonic
80  %62 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
81  %63 = atomicrmw xor i32* %62, i32 1 monotonic
82  %64 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
83  %65 = atomicrmw xor i64* %64, i64 1 monotonic
84  %66 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
85  %67 = atomicrmw xor i64* %66, i64 1 monotonic
86  %68 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
87  %69 = atomicrmw xor i64* %68, i64 1 monotonic
88  %70 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
89  %71 = atomicrmw xor i64* %70, i64 1 monotonic
90  %72 = atomicrmw and i8* @sc, i8 1 monotonic
91  %73 = atomicrmw and i8* @uc, i8 1 monotonic
92  %74 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
93  %75 = atomicrmw and i16* %74, i16 1 monotonic
94  %76 = bitcast i8* bitcast (i16* @us to i8*) to i16*
95  %77 = atomicrmw and i16* %76, i16 1 monotonic
96  %78 = bitcast i8* bitcast (i32* @si to i8*) to i32*
97  %79 = atomicrmw and i32* %78, i32 1 monotonic
98  %80 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
99  %81 = atomicrmw and i32* %80, i32 1 monotonic
100  %82 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
101  %83 = atomicrmw and i64* %82, i64 1 monotonic
102  %84 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
103  %85 = atomicrmw and i64* %84, i64 1 monotonic
104  %86 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
105  %87 = atomicrmw and i64* %86, i64 1 monotonic
106  %88 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
107  %89 = atomicrmw and i64* %88, i64 1 monotonic
108  %90 = atomicrmw nand i8* @sc, i8 1 monotonic
109  %91 = atomicrmw nand i8* @uc, i8 1 monotonic
110  %92 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
111  %93 = atomicrmw nand i16* %92, i16 1 monotonic
112  %94 = bitcast i8* bitcast (i16* @us to i8*) to i16*
113  %95 = atomicrmw nand i16* %94, i16 1 monotonic
114  %96 = bitcast i8* bitcast (i32* @si to i8*) to i32*
115  %97 = atomicrmw nand i32* %96, i32 1 monotonic
116  %98 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
117  %99 = atomicrmw nand i32* %98, i32 1 monotonic
118  %100 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
119  %101 = atomicrmw nand i64* %100, i64 1 monotonic
120  %102 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
121  %103 = atomicrmw nand i64* %102, i64 1 monotonic
122  %104 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
123  %105 = atomicrmw nand i64* %104, i64 1 monotonic
124  %106 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
125  %107 = atomicrmw nand i64* %106, i64 1 monotonic
126  br label %return
127
128return:                                           ; preds = %entry
129  ret void
130}
131
132define void @test_fetch_and_op() nounwind {
133entry:
134  %0 = atomicrmw add i8* @sc, i8 11 monotonic
135  store i8 %0, i8* @sc, align 1
136  %1 = atomicrmw add i8* @uc, i8 11 monotonic
137  store i8 %1, i8* @uc, align 1
138  %2 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
139  %3 = atomicrmw add i16* %2, i16 11 monotonic
140  store i16 %3, i16* @ss, align 2
141  %4 = bitcast i8* bitcast (i16* @us to i8*) to i16*
142  %5 = atomicrmw add i16* %4, i16 11 monotonic
143  store i16 %5, i16* @us, align 2
144  %6 = bitcast i8* bitcast (i32* @si to i8*) to i32*
145  %7 = atomicrmw add i32* %6, i32 11 monotonic
146  store i32 %7, i32* @si, align 4
147  %8 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
148  %9 = atomicrmw add i32* %8, i32 11 monotonic
149  store i32 %9, i32* @ui, align 4
150  %10 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
151  %11 = atomicrmw add i64* %10, i64 11 monotonic
152  store i64 %11, i64* @sl, align 8
153  %12 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
154  %13 = atomicrmw add i64* %12, i64 11 monotonic
155  store i64 %13, i64* @ul, align 8
156  %14 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
157  %15 = atomicrmw add i64* %14, i64 11 monotonic
158  store i64 %15, i64* @sll, align 8
159  %16 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
160  %17 = atomicrmw add i64* %16, i64 11 monotonic
161  store i64 %17, i64* @ull, align 8
162  %18 = atomicrmw sub i8* @sc, i8 11 monotonic
163  store i8 %18, i8* @sc, align 1
164  %19 = atomicrmw sub i8* @uc, i8 11 monotonic
165  store i8 %19, i8* @uc, align 1
166  %20 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
167  %21 = atomicrmw sub i16* %20, i16 11 monotonic
168  store i16 %21, i16* @ss, align 2
169  %22 = bitcast i8* bitcast (i16* @us to i8*) to i16*
170  %23 = atomicrmw sub i16* %22, i16 11 monotonic
171  store i16 %23, i16* @us, align 2
172  %24 = bitcast i8* bitcast (i32* @si to i8*) to i32*
173  %25 = atomicrmw sub i32* %24, i32 11 monotonic
174  store i32 %25, i32* @si, align 4
175  %26 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
176  %27 = atomicrmw sub i32* %26, i32 11 monotonic
177  store i32 %27, i32* @ui, align 4
178  %28 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
179  %29 = atomicrmw sub i64* %28, i64 11 monotonic
180  store i64 %29, i64* @sl, align 8
181  %30 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
182  %31 = atomicrmw sub i64* %30, i64 11 monotonic
183  store i64 %31, i64* @ul, align 8
184  %32 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
185  %33 = atomicrmw sub i64* %32, i64 11 monotonic
186  store i64 %33, i64* @sll, align 8
187  %34 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
188  %35 = atomicrmw sub i64* %34, i64 11 monotonic
189  store i64 %35, i64* @ull, align 8
190  %36 = atomicrmw or i8* @sc, i8 11 monotonic
191  store i8 %36, i8* @sc, align 1
192  %37 = atomicrmw or i8* @uc, i8 11 monotonic
193  store i8 %37, i8* @uc, align 1
194  %38 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
195  %39 = atomicrmw or i16* %38, i16 11 monotonic
196  store i16 %39, i16* @ss, align 2
197  %40 = bitcast i8* bitcast (i16* @us to i8*) to i16*
198  %41 = atomicrmw or i16* %40, i16 11 monotonic
199  store i16 %41, i16* @us, align 2
200  %42 = bitcast i8* bitcast (i32* @si to i8*) to i32*
201  %43 = atomicrmw or i32* %42, i32 11 monotonic
202  store i32 %43, i32* @si, align 4
203  %44 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
204  %45 = atomicrmw or i32* %44, i32 11 monotonic
205  store i32 %45, i32* @ui, align 4
206  %46 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
207  %47 = atomicrmw or i64* %46, i64 11 monotonic
208  store i64 %47, i64* @sl, align 8
209  %48 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
210  %49 = atomicrmw or i64* %48, i64 11 monotonic
211  store i64 %49, i64* @ul, align 8
212  %50 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
213  %51 = atomicrmw or i64* %50, i64 11 monotonic
214  store i64 %51, i64* @sll, align 8
215  %52 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
216  %53 = atomicrmw or i64* %52, i64 11 monotonic
217  store i64 %53, i64* @ull, align 8
218  %54 = atomicrmw xor i8* @sc, i8 11 monotonic
219  store i8 %54, i8* @sc, align 1
220  %55 = atomicrmw xor i8* @uc, i8 11 monotonic
221  store i8 %55, i8* @uc, align 1
222  %56 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
223  %57 = atomicrmw xor i16* %56, i16 11 monotonic
224  store i16 %57, i16* @ss, align 2
225  %58 = bitcast i8* bitcast (i16* @us to i8*) to i16*
226  %59 = atomicrmw xor i16* %58, i16 11 monotonic
227  store i16 %59, i16* @us, align 2
228  %60 = bitcast i8* bitcast (i32* @si to i8*) to i32*
229  %61 = atomicrmw xor i32* %60, i32 11 monotonic
230  store i32 %61, i32* @si, align 4
231  %62 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
232  %63 = atomicrmw xor i32* %62, i32 11 monotonic
233  store i32 %63, i32* @ui, align 4
234  %64 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
235  %65 = atomicrmw xor i64* %64, i64 11 monotonic
236  store i64 %65, i64* @sl, align 8
237  %66 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
238  %67 = atomicrmw xor i64* %66, i64 11 monotonic
239  store i64 %67, i64* @ul, align 8
240  %68 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
241  %69 = atomicrmw xor i64* %68, i64 11 monotonic
242  store i64 %69, i64* @sll, align 8
243  %70 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
244  %71 = atomicrmw xor i64* %70, i64 11 monotonic
245  store i64 %71, i64* @ull, align 8
246  %72 = atomicrmw and i8* @sc, i8 11 monotonic
247  store i8 %72, i8* @sc, align 1
248  %73 = atomicrmw and i8* @uc, i8 11 monotonic
249  store i8 %73, i8* @uc, align 1
250  %74 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
251  %75 = atomicrmw and i16* %74, i16 11 monotonic
252  store i16 %75, i16* @ss, align 2
253  %76 = bitcast i8* bitcast (i16* @us to i8*) to i16*
254  %77 = atomicrmw and i16* %76, i16 11 monotonic
255  store i16 %77, i16* @us, align 2
256  %78 = bitcast i8* bitcast (i32* @si to i8*) to i32*
257  %79 = atomicrmw and i32* %78, i32 11 monotonic
258  store i32 %79, i32* @si, align 4
259  %80 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
260  %81 = atomicrmw and i32* %80, i32 11 monotonic
261  store i32 %81, i32* @ui, align 4
262  %82 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
263  %83 = atomicrmw and i64* %82, i64 11 monotonic
264  store i64 %83, i64* @sl, align 8
265  %84 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
266  %85 = atomicrmw and i64* %84, i64 11 monotonic
267  store i64 %85, i64* @ul, align 8
268  %86 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
269  %87 = atomicrmw and i64* %86, i64 11 monotonic
270  store i64 %87, i64* @sll, align 8
271  %88 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
272  %89 = atomicrmw and i64* %88, i64 11 monotonic
273  store i64 %89, i64* @ull, align 8
274  %90 = atomicrmw nand i8* @sc, i8 11 monotonic
275  store i8 %90, i8* @sc, align 1
276  %91 = atomicrmw nand i8* @uc, i8 11 monotonic
277  store i8 %91, i8* @uc, align 1
278  %92 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
279  %93 = atomicrmw nand i16* %92, i16 11 monotonic
280  store i16 %93, i16* @ss, align 2
281  %94 = bitcast i8* bitcast (i16* @us to i8*) to i16*
282  %95 = atomicrmw nand i16* %94, i16 11 monotonic
283  store i16 %95, i16* @us, align 2
284  %96 = bitcast i8* bitcast (i32* @si to i8*) to i32*
285  %97 = atomicrmw nand i32* %96, i32 11 monotonic
286  store i32 %97, i32* @si, align 4
287  %98 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
288  %99 = atomicrmw nand i32* %98, i32 11 monotonic
289  store i32 %99, i32* @ui, align 4
290  %100 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
291  %101 = atomicrmw nand i64* %100, i64 11 monotonic
292  store i64 %101, i64* @sl, align 8
293  %102 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
294  %103 = atomicrmw nand i64* %102, i64 11 monotonic
295  store i64 %103, i64* @ul, align 8
296  %104 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
297  %105 = atomicrmw nand i64* %104, i64 11 monotonic
298  store i64 %105, i64* @sll, align 8
299  %106 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
300  %107 = atomicrmw nand i64* %106, i64 11 monotonic
301  store i64 %107, i64* @ull, align 8
302  br label %return
303
304return:                                           ; preds = %entry
305  ret void
306}
307
308define void @test_op_and_fetch() nounwind {
309entry:
310  %0 = load i8, i8* @uc, align 1
311  %1 = zext i8 %0 to i32
312  %2 = trunc i32 %1 to i8
313  %3 = atomicrmw add i8* @sc, i8 %2 monotonic
314  %4 = add i8 %3, %2
315  store i8 %4, i8* @sc, align 1
316  %5 = load i8, i8* @uc, align 1
317  %6 = zext i8 %5 to i32
318  %7 = trunc i32 %6 to i8
319  %8 = atomicrmw add i8* @uc, i8 %7 monotonic
320  %9 = add i8 %8, %7
321  store i8 %9, i8* @uc, align 1
322  %10 = load i8, i8* @uc, align 1
323  %11 = zext i8 %10 to i32
324  %12 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
325  %13 = trunc i32 %11 to i16
326  %14 = atomicrmw add i16* %12, i16 %13 monotonic
327  %15 = add i16 %14, %13
328  store i16 %15, i16* @ss, align 2
329  %16 = load i8, i8* @uc, align 1
330  %17 = zext i8 %16 to i32
331  %18 = bitcast i8* bitcast (i16* @us to i8*) to i16*
332  %19 = trunc i32 %17 to i16
333  %20 = atomicrmw add i16* %18, i16 %19 monotonic
334  %21 = add i16 %20, %19
335  store i16 %21, i16* @us, align 2
336  %22 = load i8, i8* @uc, align 1
337  %23 = zext i8 %22 to i32
338  %24 = bitcast i8* bitcast (i32* @si to i8*) to i32*
339  %25 = atomicrmw add i32* %24, i32 %23 monotonic
340  %26 = add i32 %25, %23
341  store i32 %26, i32* @si, align 4
342  %27 = load i8, i8* @uc, align 1
343  %28 = zext i8 %27 to i32
344  %29 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
345  %30 = atomicrmw add i32* %29, i32 %28 monotonic
346  %31 = add i32 %30, %28
347  store i32 %31, i32* @ui, align 4
348  %32 = load i8, i8* @uc, align 1
349  %33 = zext i8 %32 to i64
350  %34 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
351  %35 = atomicrmw add i64* %34, i64 %33 monotonic
352  %36 = add i64 %35, %33
353  store i64 %36, i64* @sl, align 8
354  %37 = load i8, i8* @uc, align 1
355  %38 = zext i8 %37 to i64
356  %39 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
357  %40 = atomicrmw add i64* %39, i64 %38 monotonic
358  %41 = add i64 %40, %38
359  store i64 %41, i64* @ul, align 8
360  %42 = load i8, i8* @uc, align 1
361  %43 = zext i8 %42 to i64
362  %44 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
363  %45 = atomicrmw add i64* %44, i64 %43 monotonic
364  %46 = add i64 %45, %43
365  store i64 %46, i64* @sll, align 8
366  %47 = load i8, i8* @uc, align 1
367  %48 = zext i8 %47 to i64
368  %49 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
369  %50 = atomicrmw add i64* %49, i64 %48 monotonic
370  %51 = add i64 %50, %48
371  store i64 %51, i64* @ull, align 8
372  %52 = load i8, i8* @uc, align 1
373  %53 = zext i8 %52 to i32
374  %54 = trunc i32 %53 to i8
375  %55 = atomicrmw sub i8* @sc, i8 %54 monotonic
376  %56 = sub i8 %55, %54
377  store i8 %56, i8* @sc, align 1
378  %57 = load i8, i8* @uc, align 1
379  %58 = zext i8 %57 to i32
380  %59 = trunc i32 %58 to i8
381  %60 = atomicrmw sub i8* @uc, i8 %59 monotonic
382  %61 = sub i8 %60, %59
383  store i8 %61, i8* @uc, align 1
384  %62 = load i8, i8* @uc, align 1
385  %63 = zext i8 %62 to i32
386  %64 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
387  %65 = trunc i32 %63 to i16
388  %66 = atomicrmw sub i16* %64, i16 %65 monotonic
389  %67 = sub i16 %66, %65
390  store i16 %67, i16* @ss, align 2
391  %68 = load i8, i8* @uc, align 1
392  %69 = zext i8 %68 to i32
393  %70 = bitcast i8* bitcast (i16* @us to i8*) to i16*
394  %71 = trunc i32 %69 to i16
395  %72 = atomicrmw sub i16* %70, i16 %71 monotonic
396  %73 = sub i16 %72, %71
397  store i16 %73, i16* @us, align 2
398  %74 = load i8, i8* @uc, align 1
399  %75 = zext i8 %74 to i32
400  %76 = bitcast i8* bitcast (i32* @si to i8*) to i32*
401  %77 = atomicrmw sub i32* %76, i32 %75 monotonic
402  %78 = sub i32 %77, %75
403  store i32 %78, i32* @si, align 4
404  %79 = load i8, i8* @uc, align 1
405  %80 = zext i8 %79 to i32
406  %81 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
407  %82 = atomicrmw sub i32* %81, i32 %80 monotonic
408  %83 = sub i32 %82, %80
409  store i32 %83, i32* @ui, align 4
410  %84 = load i8, i8* @uc, align 1
411  %85 = zext i8 %84 to i64
412  %86 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
413  %87 = atomicrmw sub i64* %86, i64 %85 monotonic
414  %88 = sub i64 %87, %85
415  store i64 %88, i64* @sl, align 8
416  %89 = load i8, i8* @uc, align 1
417  %90 = zext i8 %89 to i64
418  %91 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
419  %92 = atomicrmw sub i64* %91, i64 %90 monotonic
420  %93 = sub i64 %92, %90
421  store i64 %93, i64* @ul, align 8
422  %94 = load i8, i8* @uc, align 1
423  %95 = zext i8 %94 to i64
424  %96 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
425  %97 = atomicrmw sub i64* %96, i64 %95 monotonic
426  %98 = sub i64 %97, %95
427  store i64 %98, i64* @sll, align 8
428  %99 = load i8, i8* @uc, align 1
429  %100 = zext i8 %99 to i64
430  %101 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
431  %102 = atomicrmw sub i64* %101, i64 %100 monotonic
432  %103 = sub i64 %102, %100
433  store i64 %103, i64* @ull, align 8
434  %104 = load i8, i8* @uc, align 1
435  %105 = zext i8 %104 to i32
436  %106 = trunc i32 %105 to i8
437  %107 = atomicrmw or i8* @sc, i8 %106 monotonic
438  %108 = or i8 %107, %106
439  store i8 %108, i8* @sc, align 1
440  %109 = load i8, i8* @uc, align 1
441  %110 = zext i8 %109 to i32
442  %111 = trunc i32 %110 to i8
443  %112 = atomicrmw or i8* @uc, i8 %111 monotonic
444  %113 = or i8 %112, %111
445  store i8 %113, i8* @uc, align 1
446  %114 = load i8, i8* @uc, align 1
447  %115 = zext i8 %114 to i32
448  %116 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
449  %117 = trunc i32 %115 to i16
450  %118 = atomicrmw or i16* %116, i16 %117 monotonic
451  %119 = or i16 %118, %117
452  store i16 %119, i16* @ss, align 2
453  %120 = load i8, i8* @uc, align 1
454  %121 = zext i8 %120 to i32
455  %122 = bitcast i8* bitcast (i16* @us to i8*) to i16*
456  %123 = trunc i32 %121 to i16
457  %124 = atomicrmw or i16* %122, i16 %123 monotonic
458  %125 = or i16 %124, %123
459  store i16 %125, i16* @us, align 2
460  %126 = load i8, i8* @uc, align 1
461  %127 = zext i8 %126 to i32
462  %128 = bitcast i8* bitcast (i32* @si to i8*) to i32*
463  %129 = atomicrmw or i32* %128, i32 %127 monotonic
464  %130 = or i32 %129, %127
465  store i32 %130, i32* @si, align 4
466  %131 = load i8, i8* @uc, align 1
467  %132 = zext i8 %131 to i32
468  %133 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
469  %134 = atomicrmw or i32* %133, i32 %132 monotonic
470  %135 = or i32 %134, %132
471  store i32 %135, i32* @ui, align 4
472  %136 = load i8, i8* @uc, align 1
473  %137 = zext i8 %136 to i64
474  %138 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
475  %139 = atomicrmw or i64* %138, i64 %137 monotonic
476  %140 = or i64 %139, %137
477  store i64 %140, i64* @sl, align 8
478  %141 = load i8, i8* @uc, align 1
479  %142 = zext i8 %141 to i64
480  %143 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
481  %144 = atomicrmw or i64* %143, i64 %142 monotonic
482  %145 = or i64 %144, %142
483  store i64 %145, i64* @ul, align 8
484  %146 = load i8, i8* @uc, align 1
485  %147 = zext i8 %146 to i64
486  %148 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
487  %149 = atomicrmw or i64* %148, i64 %147 monotonic
488  %150 = or i64 %149, %147
489  store i64 %150, i64* @sll, align 8
490  %151 = load i8, i8* @uc, align 1
491  %152 = zext i8 %151 to i64
492  %153 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
493  %154 = atomicrmw or i64* %153, i64 %152 monotonic
494  %155 = or i64 %154, %152
495  store i64 %155, i64* @ull, align 8
496  %156 = load i8, i8* @uc, align 1
497  %157 = zext i8 %156 to i32
498  %158 = trunc i32 %157 to i8
499  %159 = atomicrmw xor i8* @sc, i8 %158 monotonic
500  %160 = xor i8 %159, %158
501  store i8 %160, i8* @sc, align 1
502  %161 = load i8, i8* @uc, align 1
503  %162 = zext i8 %161 to i32
504  %163 = trunc i32 %162 to i8
505  %164 = atomicrmw xor i8* @uc, i8 %163 monotonic
506  %165 = xor i8 %164, %163
507  store i8 %165, i8* @uc, align 1
508  %166 = load i8, i8* @uc, align 1
509  %167 = zext i8 %166 to i32
510  %168 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
511  %169 = trunc i32 %167 to i16
512  %170 = atomicrmw xor i16* %168, i16 %169 monotonic
513  %171 = xor i16 %170, %169
514  store i16 %171, i16* @ss, align 2
515  %172 = load i8, i8* @uc, align 1
516  %173 = zext i8 %172 to i32
517  %174 = bitcast i8* bitcast (i16* @us to i8*) to i16*
518  %175 = trunc i32 %173 to i16
519  %176 = atomicrmw xor i16* %174, i16 %175 monotonic
520  %177 = xor i16 %176, %175
521  store i16 %177, i16* @us, align 2
522  %178 = load i8, i8* @uc, align 1
523  %179 = zext i8 %178 to i32
524  %180 = bitcast i8* bitcast (i32* @si to i8*) to i32*
525  %181 = atomicrmw xor i32* %180, i32 %179 monotonic
526  %182 = xor i32 %181, %179
527  store i32 %182, i32* @si, align 4
528  %183 = load i8, i8* @uc, align 1
529  %184 = zext i8 %183 to i32
530  %185 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
531  %186 = atomicrmw xor i32* %185, i32 %184 monotonic
532  %187 = xor i32 %186, %184
533  store i32 %187, i32* @ui, align 4
534  %188 = load i8, i8* @uc, align 1
535  %189 = zext i8 %188 to i64
536  %190 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
537  %191 = atomicrmw xor i64* %190, i64 %189 monotonic
538  %192 = xor i64 %191, %189
539  store i64 %192, i64* @sl, align 8
540  %193 = load i8, i8* @uc, align 1
541  %194 = zext i8 %193 to i64
542  %195 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
543  %196 = atomicrmw xor i64* %195, i64 %194 monotonic
544  %197 = xor i64 %196, %194
545  store i64 %197, i64* @ul, align 8
546  %198 = load i8, i8* @uc, align 1
547  %199 = zext i8 %198 to i64
548  %200 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
549  %201 = atomicrmw xor i64* %200, i64 %199 monotonic
550  %202 = xor i64 %201, %199
551  store i64 %202, i64* @sll, align 8
552  %203 = load i8, i8* @uc, align 1
553  %204 = zext i8 %203 to i64
554  %205 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
555  %206 = atomicrmw xor i64* %205, i64 %204 monotonic
556  %207 = xor i64 %206, %204
557  store i64 %207, i64* @ull, align 8
558  %208 = load i8, i8* @uc, align 1
559  %209 = zext i8 %208 to i32
560  %210 = trunc i32 %209 to i8
561  %211 = atomicrmw and i8* @sc, i8 %210 monotonic
562  %212 = and i8 %211, %210
563  store i8 %212, i8* @sc, align 1
564  %213 = load i8, i8* @uc, align 1
565  %214 = zext i8 %213 to i32
566  %215 = trunc i32 %214 to i8
567  %216 = atomicrmw and i8* @uc, i8 %215 monotonic
568  %217 = and i8 %216, %215
569  store i8 %217, i8* @uc, align 1
570  %218 = load i8, i8* @uc, align 1
571  %219 = zext i8 %218 to i32
572  %220 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
573  %221 = trunc i32 %219 to i16
574  %222 = atomicrmw and i16* %220, i16 %221 monotonic
575  %223 = and i16 %222, %221
576  store i16 %223, i16* @ss, align 2
577  %224 = load i8, i8* @uc, align 1
578  %225 = zext i8 %224 to i32
579  %226 = bitcast i8* bitcast (i16* @us to i8*) to i16*
580  %227 = trunc i32 %225 to i16
581  %228 = atomicrmw and i16* %226, i16 %227 monotonic
582  %229 = and i16 %228, %227
583  store i16 %229, i16* @us, align 2
584  %230 = load i8, i8* @uc, align 1
585  %231 = zext i8 %230 to i32
586  %232 = bitcast i8* bitcast (i32* @si to i8*) to i32*
587  %233 = atomicrmw and i32* %232, i32 %231 monotonic
588  %234 = and i32 %233, %231
589  store i32 %234, i32* @si, align 4
590  %235 = load i8, i8* @uc, align 1
591  %236 = zext i8 %235 to i32
592  %237 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
593  %238 = atomicrmw and i32* %237, i32 %236 monotonic
594  %239 = and i32 %238, %236
595  store i32 %239, i32* @ui, align 4
596  %240 = load i8, i8* @uc, align 1
597  %241 = zext i8 %240 to i64
598  %242 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
599  %243 = atomicrmw and i64* %242, i64 %241 monotonic
600  %244 = and i64 %243, %241
601  store i64 %244, i64* @sl, align 8
602  %245 = load i8, i8* @uc, align 1
603  %246 = zext i8 %245 to i64
604  %247 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
605  %248 = atomicrmw and i64* %247, i64 %246 monotonic
606  %249 = and i64 %248, %246
607  store i64 %249, i64* @ul, align 8
608  %250 = load i8, i8* @uc, align 1
609  %251 = zext i8 %250 to i64
610  %252 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
611  %253 = atomicrmw and i64* %252, i64 %251 monotonic
612  %254 = and i64 %253, %251
613  store i64 %254, i64* @sll, align 8
614  %255 = load i8, i8* @uc, align 1
615  %256 = zext i8 %255 to i64
616  %257 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
617  %258 = atomicrmw and i64* %257, i64 %256 monotonic
618  %259 = and i64 %258, %256
619  store i64 %259, i64* @ull, align 8
620  %260 = load i8, i8* @uc, align 1
621  %261 = zext i8 %260 to i32
622  %262 = trunc i32 %261 to i8
623  %263 = atomicrmw nand i8* @sc, i8 %262 monotonic
624  %264 = xor i8 %263, -1
625  %265 = and i8 %264, %262
626  store i8 %265, i8* @sc, align 1
627  %266 = load i8, i8* @uc, align 1
628  %267 = zext i8 %266 to i32
629  %268 = trunc i32 %267 to i8
630  %269 = atomicrmw nand i8* @uc, i8 %268 monotonic
631  %270 = xor i8 %269, -1
632  %271 = and i8 %270, %268
633  store i8 %271, i8* @uc, align 1
634  %272 = load i8, i8* @uc, align 1
635  %273 = zext i8 %272 to i32
636  %274 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
637  %275 = trunc i32 %273 to i16
638  %276 = atomicrmw nand i16* %274, i16 %275 monotonic
639  %277 = xor i16 %276, -1
640  %278 = and i16 %277, %275
641  store i16 %278, i16* @ss, align 2
642  %279 = load i8, i8* @uc, align 1
643  %280 = zext i8 %279 to i32
644  %281 = bitcast i8* bitcast (i16* @us to i8*) to i16*
645  %282 = trunc i32 %280 to i16
646  %283 = atomicrmw nand i16* %281, i16 %282 monotonic
647  %284 = xor i16 %283, -1
648  %285 = and i16 %284, %282
649  store i16 %285, i16* @us, align 2
650  %286 = load i8, i8* @uc, align 1
651  %287 = zext i8 %286 to i32
652  %288 = bitcast i8* bitcast (i32* @si to i8*) to i32*
653  %289 = atomicrmw nand i32* %288, i32 %287 monotonic
654  %290 = xor i32 %289, -1
655  %291 = and i32 %290, %287
656  store i32 %291, i32* @si, align 4
657  %292 = load i8, i8* @uc, align 1
658  %293 = zext i8 %292 to i32
659  %294 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
660  %295 = atomicrmw nand i32* %294, i32 %293 monotonic
661  %296 = xor i32 %295, -1
662  %297 = and i32 %296, %293
663  store i32 %297, i32* @ui, align 4
664  %298 = load i8, i8* @uc, align 1
665  %299 = zext i8 %298 to i64
666  %300 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
667  %301 = atomicrmw nand i64* %300, i64 %299 monotonic
668  %302 = xor i64 %301, -1
669  %303 = and i64 %302, %299
670  store i64 %303, i64* @sl, align 8
671  %304 = load i8, i8* @uc, align 1
672  %305 = zext i8 %304 to i64
673  %306 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
674  %307 = atomicrmw nand i64* %306, i64 %305 monotonic
675  %308 = xor i64 %307, -1
676  %309 = and i64 %308, %305
677  store i64 %309, i64* @ul, align 8
678  %310 = load i8, i8* @uc, align 1
679  %311 = zext i8 %310 to i64
680  %312 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
681  %313 = atomicrmw nand i64* %312, i64 %311 monotonic
682  %314 = xor i64 %313, -1
683  %315 = and i64 %314, %311
684  store i64 %315, i64* @sll, align 8
685  %316 = load i8, i8* @uc, align 1
686  %317 = zext i8 %316 to i64
687  %318 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
688  %319 = atomicrmw nand i64* %318, i64 %317 monotonic
689  %320 = xor i64 %319, -1
690  %321 = and i64 %320, %317
691  store i64 %321, i64* @ull, align 8
692  br label %return
693
694return:                                           ; preds = %entry
695  ret void
696}
697
698define void @test_compare_and_swap() nounwind {
699entry:
700  %0 = load i8, i8* @sc, align 1
701  %1 = zext i8 %0 to i32
702  %2 = load i8, i8* @uc, align 1
703  %3 = zext i8 %2 to i32
704  %4 = trunc i32 %3 to i8
705  %5 = trunc i32 %1 to i8
706  %pair6 = cmpxchg i8* @sc, i8 %4, i8 %5 monotonic monotonic
707  %6 = extractvalue { i8, i1 } %pair6, 0
708  store i8 %6, i8* @sc, align 1
709  %7 = load i8, i8* @sc, align 1
710  %8 = zext i8 %7 to i32
711  %9 = load i8, i8* @uc, align 1
712  %10 = zext i8 %9 to i32
713  %11 = trunc i32 %10 to i8
714  %12 = trunc i32 %8 to i8
715  %pair13 = cmpxchg i8* @uc, i8 %11, i8 %12 monotonic monotonic
716  %13 = extractvalue { i8, i1 } %pair13, 0
717  store i8 %13, i8* @uc, align 1
718  %14 = load i8, i8* @sc, align 1
719  %15 = sext i8 %14 to i16
720  %16 = zext i16 %15 to i32
721  %17 = load i8, i8* @uc, align 1
722  %18 = zext i8 %17 to i32
723  %19 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
724  %20 = trunc i32 %18 to i16
725  %21 = trunc i32 %16 to i16
726  %pair22 = cmpxchg i16* %19, i16 %20, i16 %21 monotonic monotonic
727  %22 = extractvalue { i16, i1 } %pair22, 0
728  store i16 %22, i16* @ss, align 2
729  %23 = load i8, i8* @sc, align 1
730  %24 = sext i8 %23 to i16
731  %25 = zext i16 %24 to i32
732  %26 = load i8, i8* @uc, align 1
733  %27 = zext i8 %26 to i32
734  %28 = bitcast i8* bitcast (i16* @us to i8*) to i16*
735  %29 = trunc i32 %27 to i16
736  %30 = trunc i32 %25 to i16
737  %pair31 = cmpxchg i16* %28, i16 %29, i16 %30 monotonic monotonic
738  %31 = extractvalue { i16, i1 } %pair31, 0
739  store i16 %31, i16* @us, align 2
740  %32 = load i8, i8* @sc, align 1
741  %33 = sext i8 %32 to i32
742  %34 = load i8, i8* @uc, align 1
743  %35 = zext i8 %34 to i32
744  %36 = bitcast i8* bitcast (i32* @si to i8*) to i32*
745  %pair37 = cmpxchg i32* %36, i32 %35, i32 %33 monotonic monotonic
746  %37 = extractvalue { i32, i1 } %pair37, 0
747  store i32 %37, i32* @si, align 4
748  %38 = load i8, i8* @sc, align 1
749  %39 = sext i8 %38 to i32
750  %40 = load i8, i8* @uc, align 1
751  %41 = zext i8 %40 to i32
752  %42 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
753  %pair43 = cmpxchg i32* %42, i32 %41, i32 %39 monotonic monotonic
754  %43 = extractvalue { i32, i1 } %pair43, 0
755  store i32 %43, i32* @ui, align 4
756  %44 = load i8, i8* @sc, align 1
757  %45 = sext i8 %44 to i64
758  %46 = load i8, i8* @uc, align 1
759  %47 = zext i8 %46 to i64
760  %48 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
761  %pair49 = cmpxchg i64* %48, i64 %47, i64 %45 monotonic monotonic
762  %49 = extractvalue { i64, i1 } %pair49, 0
763  store i64 %49, i64* @sl, align 8
764  %50 = load i8, i8* @sc, align 1
765  %51 = sext i8 %50 to i64
766  %52 = load i8, i8* @uc, align 1
767  %53 = zext i8 %52 to i64
768  %54 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
769  %pair55 = cmpxchg i64* %54, i64 %53, i64 %51 monotonic monotonic
770  %55 = extractvalue { i64, i1 } %pair55, 0
771  store i64 %55, i64* @ul, align 8
772  %56 = load i8, i8* @sc, align 1
773  %57 = sext i8 %56 to i64
774  %58 = load i8, i8* @uc, align 1
775  %59 = zext i8 %58 to i64
776  %60 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
777  %pair61 = cmpxchg i64* %60, i64 %59, i64 %57 monotonic monotonic
778  %61 = extractvalue { i64, i1 } %pair61, 0
779  store i64 %61, i64* @sll, align 8
780  %62 = load i8, i8* @sc, align 1
781  %63 = sext i8 %62 to i64
782  %64 = load i8, i8* @uc, align 1
783  %65 = zext i8 %64 to i64
784  %66 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
785  %pair67 = cmpxchg i64* %66, i64 %65, i64 %63 monotonic monotonic
786  %67 = extractvalue { i64, i1 } %pair67, 0
787  store i64 %67, i64* @ull, align 8
788  %68 = load i8, i8* @sc, align 1
789  %69 = zext i8 %68 to i32
790  %70 = load i8, i8* @uc, align 1
791  %71 = zext i8 %70 to i32
792  %72 = trunc i32 %71 to i8
793  %73 = trunc i32 %69 to i8
794  %pair74 = cmpxchg i8* @sc, i8 %72, i8 %73 monotonic monotonic
795  %74 = extractvalue { i8, i1 } %pair74, 0
796  %75 = icmp eq i8 %74, %72
797  %76 = zext i1 %75 to i8
798  %77 = zext i8 %76 to i32
799  store i32 %77, i32* @ui, align 4
800  %78 = load i8, i8* @sc, align 1
801  %79 = zext i8 %78 to i32
802  %80 = load i8, i8* @uc, align 1
803  %81 = zext i8 %80 to i32
804  %82 = trunc i32 %81 to i8
805  %83 = trunc i32 %79 to i8
806  %pair84 = cmpxchg i8* @uc, i8 %82, i8 %83 monotonic monotonic
807  %84 = extractvalue { i8, i1 } %pair84, 0
808  %85 = icmp eq i8 %84, %82
809  %86 = zext i1 %85 to i8
810  %87 = zext i8 %86 to i32
811  store i32 %87, i32* @ui, align 4
812  %88 = load i8, i8* @sc, align 1
813  %89 = sext i8 %88 to i16
814  %90 = zext i16 %89 to i32
815  %91 = load i8, i8* @uc, align 1
816  %92 = zext i8 %91 to i32
817  %93 = trunc i32 %92 to i8
818  %94 = trunc i32 %90 to i8
819  %pair95 = cmpxchg i8* bitcast (i16* @ss to i8*), i8 %93, i8 %94 monotonic monotonic
820  %95 = extractvalue { i8, i1 } %pair95, 0
821  %96 = icmp eq i8 %95, %93
822  %97 = zext i1 %96 to i8
823  %98 = zext i8 %97 to i32
824  store i32 %98, i32* @ui, align 4
825  %99 = load i8, i8* @sc, align 1
826  %100 = sext i8 %99 to i16
827  %101 = zext i16 %100 to i32
828  %102 = load i8, i8* @uc, align 1
829  %103 = zext i8 %102 to i32
830  %104 = trunc i32 %103 to i8
831  %105 = trunc i32 %101 to i8
832  %pair106 = cmpxchg i8* bitcast (i16* @us to i8*), i8 %104, i8 %105 monotonic monotonic
833  %106 = extractvalue { i8, i1 } %pair106, 0
834  %107 = icmp eq i8 %106, %104
835  %108 = zext i1 %107 to i8
836  %109 = zext i8 %108 to i32
837  store i32 %109, i32* @ui, align 4
838  %110 = load i8, i8* @sc, align 1
839  %111 = sext i8 %110 to i32
840  %112 = load i8, i8* @uc, align 1
841  %113 = zext i8 %112 to i32
842  %114 = trunc i32 %113 to i8
843  %115 = trunc i32 %111 to i8
844  %pair116 = cmpxchg i8* bitcast (i32* @si to i8*), i8 %114, i8 %115 monotonic monotonic
845  %116 = extractvalue { i8, i1 } %pair116, 0
846  %117 = icmp eq i8 %116, %114
847  %118 = zext i1 %117 to i8
848  %119 = zext i8 %118 to i32
849  store i32 %119, i32* @ui, align 4
850  %120 = load i8, i8* @sc, align 1
851  %121 = sext i8 %120 to i32
852  %122 = load i8, i8* @uc, align 1
853  %123 = zext i8 %122 to i32
854  %124 = trunc i32 %123 to i8
855  %125 = trunc i32 %121 to i8
856  %pair126 = cmpxchg i8* bitcast (i32* @ui to i8*), i8 %124, i8 %125 monotonic monotonic
857  %126 = extractvalue { i8, i1 } %pair126, 0
858  %127 = icmp eq i8 %126, %124
859  %128 = zext i1 %127 to i8
860  %129 = zext i8 %128 to i32
861  store i32 %129, i32* @ui, align 4
862  %130 = load i8, i8* @sc, align 1
863  %131 = sext i8 %130 to i64
864  %132 = load i8, i8* @uc, align 1
865  %133 = zext i8 %132 to i64
866  %134 = trunc i64 %133 to i8
867  %135 = trunc i64 %131 to i8
868  %pair136 = cmpxchg i8* bitcast (i64* @sl to i8*), i8 %134, i8 %135 monotonic monotonic
869  %136 = extractvalue { i8, i1 } %pair136, 0
870  %137 = icmp eq i8 %136, %134
871  %138 = zext i1 %137 to i8
872  %139 = zext i8 %138 to i32
873  store i32 %139, i32* @ui, align 4
874  %140 = load i8, i8* @sc, align 1
875  %141 = sext i8 %140 to i64
876  %142 = load i8, i8* @uc, align 1
877  %143 = zext i8 %142 to i64
878  %144 = trunc i64 %143 to i8
879  %145 = trunc i64 %141 to i8
880  %pair146 = cmpxchg i8* bitcast (i64* @ul to i8*), i8 %144, i8 %145 monotonic monotonic
881  %146 = extractvalue { i8, i1 } %pair146, 0
882  %147 = icmp eq i8 %146, %144
883  %148 = zext i1 %147 to i8
884  %149 = zext i8 %148 to i32
885  store i32 %149, i32* @ui, align 4
886  %150 = load i8, i8* @sc, align 1
887  %151 = sext i8 %150 to i64
888  %152 = load i8, i8* @uc, align 1
889  %153 = zext i8 %152 to i64
890  %154 = trunc i64 %153 to i8
891  %155 = trunc i64 %151 to i8
892  %pair156 = cmpxchg i8* bitcast (i64* @sll to i8*), i8 %154, i8 %155 monotonic monotonic
893  %156 = extractvalue { i8, i1 } %pair156, 0
894  %157 = icmp eq i8 %156, %154
895  %158 = zext i1 %157 to i8
896  %159 = zext i8 %158 to i32
897  store i32 %159, i32* @ui, align 4
898  %160 = load i8, i8* @sc, align 1
899  %161 = sext i8 %160 to i64
900  %162 = load i8, i8* @uc, align 1
901  %163 = zext i8 %162 to i64
902  %164 = trunc i64 %163 to i8
903  %165 = trunc i64 %161 to i8
904  %pair166 = cmpxchg i8* bitcast (i64* @ull to i8*), i8 %164, i8 %165 monotonic monotonic
905  %166 = extractvalue { i8, i1 } %pair166, 0
906  %167 = icmp eq i8 %166, %164
907  %168 = zext i1 %167 to i8
908  %169 = zext i8 %168 to i32
909  store i32 %169, i32* @ui, align 4
910  br label %return
911
912return:                                           ; preds = %entry
913  ret void
914}
915
916define void @test_lock() nounwind {
917entry:
918  %0 = atomicrmw xchg i8* @sc, i8 1 monotonic
919  store i8 %0, i8* @sc, align 1
920  %1 = atomicrmw xchg i8* @uc, i8 1 monotonic
921  store i8 %1, i8* @uc, align 1
922  %2 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
923  %3 = atomicrmw xchg i16* %2, i16 1 monotonic
924  store i16 %3, i16* @ss, align 2
925  %4 = bitcast i8* bitcast (i16* @us to i8*) to i16*
926  %5 = atomicrmw xchg i16* %4, i16 1 monotonic
927  store i16 %5, i16* @us, align 2
928  %6 = bitcast i8* bitcast (i32* @si to i8*) to i32*
929  %7 = atomicrmw xchg i32* %6, i32 1 monotonic
930  store i32 %7, i32* @si, align 4
931  %8 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
932  %9 = atomicrmw xchg i32* %8, i32 1 monotonic
933  store i32 %9, i32* @ui, align 4
934  %10 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
935  %11 = atomicrmw xchg i64* %10, i64 1 monotonic
936  store i64 %11, i64* @sl, align 8
937  %12 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
938  %13 = atomicrmw xchg i64* %12, i64 1 monotonic
939  store i64 %13, i64* @ul, align 8
940  %14 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
941  %15 = atomicrmw xchg i64* %14, i64 1 monotonic
942  store i64 %15, i64* @sll, align 8
943  %16 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
944  %17 = atomicrmw xchg i64* %16, i64 1 monotonic
945  store i64 %17, i64* @ull, align 8
946  fence seq_cst
947  store volatile i8 0, i8* @sc, align 1
948  store volatile i8 0, i8* @uc, align 1
949  %18 = bitcast i8* bitcast (i16* @ss to i8*) to i16*
950  store volatile i16 0, i16* %18, align 2
951  %19 = bitcast i8* bitcast (i16* @us to i8*) to i16*
952  store volatile i16 0, i16* %19, align 2
953  %20 = bitcast i8* bitcast (i32* @si to i8*) to i32*
954  store volatile i32 0, i32* %20, align 4
955  %21 = bitcast i8* bitcast (i32* @ui to i8*) to i32*
956  store volatile i32 0, i32* %21, align 4
957  %22 = bitcast i8* bitcast (i64* @sl to i8*) to i64*
958  store volatile i64 0, i64* %22, align 8
959  %23 = bitcast i8* bitcast (i64* @ul to i8*) to i64*
960  store volatile i64 0, i64* %23, align 8
961  %24 = bitcast i8* bitcast (i64* @sll to i8*) to i64*
962  store volatile i64 0, i64* %24, align 8
963  %25 = bitcast i8* bitcast (i64* @ull to i8*) to i64*
964  store volatile i64 0, i64* %25, align 8
965  br label %return
966
967return:                                           ; preds = %entry
968  ret void
969}
970