[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / Atomics-64.ll
blobb5748730548e3dd911d496dc588d57aa57917d5e
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 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
128 return:                                           ; preds = %entry
129   ret void
132 define void @test_fetch_and_op() nounwind {
133 entry:
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
304 return:                                           ; preds = %entry
305   ret void
308 define void @test_op_and_fetch() nounwind {
309 entry:
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
694 return:                                           ; preds = %entry
695   ret void
698 define void @test_compare_and_swap() nounwind {
699 entry:
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
912 return:                                           ; preds = %entry
913   ret void
916 define void @test_lock() nounwind {
917 entry:
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
967 return:                                           ; preds = %entry
968   ret void