Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / X86 / Atomics-64.ll
blobb8b9a3525d3c9f8fea4bc22f3df8be9c5e68db33
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin8 > %t.x86-64
2 ; RUN: llc < %s -mtriple=i686-apple-darwin8 -mattr=cx16 > %t.x86
3 target 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"
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
16 define void @test_op_ignore() nounwind {
17 entry:
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
80 return:                                           ; preds = %entry
81   ret void
84 define void @test_fetch_and_op() nounwind {
85 entry:
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
208 return:                                           ; preds = %entry
209   ret void
212 define void @test_op_and_fetch() nounwind {
213 entry:
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
550 return:                                           ; preds = %entry
551   ret void
554 define void @test_compare_and_swap() nounwind {
555 entry:
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
760 return:                                           ; preds = %entry
761   ret void
764 define void @test_lock() nounwind {
765 entry:
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
799 return:                                           ; preds = %entry
800   ret void