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