1*67e74705SXin Li // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -x c -emit-llvm %s -o - | FileCheck %s
2*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -emit-pch -o %t %s
3*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
4*67e74705SXin Li // expected-no-diagnostics
5*67e74705SXin Li // REQUIRES: x86-registered-target
6*67e74705SXin Li #ifndef HEADER
7*67e74705SXin Li #define HEADER
8*67e74705SXin Li
9*67e74705SXin Li _Bool bv, bx;
10*67e74705SXin Li char cv, cx;
11*67e74705SXin Li unsigned char ucv, ucx;
12*67e74705SXin Li short sv, sx;
13*67e74705SXin Li unsigned short usv, usx;
14*67e74705SXin Li int iv, ix;
15*67e74705SXin Li unsigned int uiv, uix;
16*67e74705SXin Li long lv, lx;
17*67e74705SXin Li unsigned long ulv, ulx;
18*67e74705SXin Li long long llv, llx;
19*67e74705SXin Li unsigned long long ullv, ullx;
20*67e74705SXin Li float fv, fx;
21*67e74705SXin Li double dv, dx;
22*67e74705SXin Li long double ldv, ldx;
23*67e74705SXin Li _Complex int civ, cix;
24*67e74705SXin Li _Complex float cfv, cfx;
25*67e74705SXin Li _Complex double cdv, cdx;
26*67e74705SXin Li
27*67e74705SXin Li typedef int int4 __attribute__((__vector_size__(16)));
28*67e74705SXin Li int4 int4x;
29*67e74705SXin Li
30*67e74705SXin Li struct BitFields {
31*67e74705SXin Li int : 32;
32*67e74705SXin Li int a : 31;
33*67e74705SXin Li } bfx;
34*67e74705SXin Li
35*67e74705SXin Li struct BitFields_packed {
36*67e74705SXin Li int : 32;
37*67e74705SXin Li int a : 31;
38*67e74705SXin Li } __attribute__ ((__packed__)) bfx_packed;
39*67e74705SXin Li
40*67e74705SXin Li struct BitFields2 {
41*67e74705SXin Li int : 31;
42*67e74705SXin Li int a : 1;
43*67e74705SXin Li } bfx2;
44*67e74705SXin Li
45*67e74705SXin Li struct BitFields2_packed {
46*67e74705SXin Li int : 31;
47*67e74705SXin Li int a : 1;
48*67e74705SXin Li } __attribute__ ((__packed__)) bfx2_packed;
49*67e74705SXin Li
50*67e74705SXin Li struct BitFields3 {
51*67e74705SXin Li int : 11;
52*67e74705SXin Li int a : 14;
53*67e74705SXin Li } bfx3;
54*67e74705SXin Li
55*67e74705SXin Li struct BitFields3_packed {
56*67e74705SXin Li int : 11;
57*67e74705SXin Li int a : 14;
58*67e74705SXin Li } __attribute__ ((__packed__)) bfx3_packed;
59*67e74705SXin Li
60*67e74705SXin Li struct BitFields4 {
61*67e74705SXin Li short : 16;
62*67e74705SXin Li int a: 1;
63*67e74705SXin Li long b : 7;
64*67e74705SXin Li } bfx4;
65*67e74705SXin Li
66*67e74705SXin Li struct BitFields4_packed {
67*67e74705SXin Li short : 16;
68*67e74705SXin Li int a: 1;
69*67e74705SXin Li long b : 7;
70*67e74705SXin Li } __attribute__ ((__packed__)) bfx4_packed;
71*67e74705SXin Li
72*67e74705SXin Li typedef float float2 __attribute__((ext_vector_type(2)));
73*67e74705SXin Li float2 float2x;
74*67e74705SXin Li
75*67e74705SXin Li // Register "0" is currently an invalid register for global register variables.
76*67e74705SXin Li // Use "esp" instead of "0".
77*67e74705SXin Li // register int rix __asm__("0");
78*67e74705SXin Li register int rix __asm__("esp");
79*67e74705SXin Li
main()80*67e74705SXin Li int main() {
81*67e74705SXin Li // CHECK-NOT: atomicrmw
82*67e74705SXin Li #pragma omp atomic
83*67e74705SXin Li ++dv;
84*67e74705SXin Li // CHECK: atomicrmw add i8* @{{.+}}, i8 1 monotonic
85*67e74705SXin Li #pragma omp atomic
86*67e74705SXin Li bx++;
87*67e74705SXin Li // CHECK: atomicrmw add i8* @{{.+}}, i8 1 monotonic
88*67e74705SXin Li #pragma omp atomic update
89*67e74705SXin Li ++cx;
90*67e74705SXin Li // CHECK: atomicrmw sub i8* @{{.+}}, i8 1 monotonic
91*67e74705SXin Li #pragma omp atomic
92*67e74705SXin Li ucx--;
93*67e74705SXin Li // CHECK: atomicrmw sub i16* @{{.+}}, i16 1 monotonic
94*67e74705SXin Li #pragma omp atomic update
95*67e74705SXin Li --sx;
96*67e74705SXin Li // CHECK: [[USV:%.+]] = load i16, i16* @{{.+}},
97*67e74705SXin Li // CHECK: [[EXPR:%.+]] = zext i16 [[USV]] to i32
98*67e74705SXin Li // CHECK: [[X:%.+]] = load atomic i16, i16* [[X_ADDR:@.+]] monotonic
99*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
100*67e74705SXin Li // CHECK: [[CONT]]
101*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i16 [ [[X]], %{{.+}} ], [ [[OLD_X:%.+]], %[[CONT]] ]
102*67e74705SXin Li // CHECK: [[CONV:%.+]] = zext i16 [[EXPECTED]] to i32
103*67e74705SXin Li // CHECK: [[ADD:%.+]] = add nsw i32 [[CONV]], [[EXPR]]
104*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = trunc i32 [[ADD]] to i16
105*67e74705SXin Li // CHECK: store i16 [[DESIRED]], i16* [[TEMP:%.+]],
106*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i16, i16* [[TEMP]],
107*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i16* [[X_ADDR]], i16 [[EXPECTED]], i16 [[DESIRED]] monotonic monotonic
108*67e74705SXin Li // CHECK: [[OLD_X]] = extractvalue { i16, i1 } [[RES]], 0
109*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i16, i1 } [[RES]], 1
110*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
111*67e74705SXin Li // CHECK: [[EXIT]]
112*67e74705SXin Li #pragma omp atomic
113*67e74705SXin Li usx += usv;
114*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load i32, i32* @{{.+}},
115*67e74705SXin Li // CHECK: [[X:%.+]] = load atomic i32, i32* [[X_ADDR:@.+]] monotonic
116*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
117*67e74705SXin Li // CHECK: [[CONT]]
118*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i32 [ [[X]], %{{.+}} ], [ [[OLD_X:%.+]], %[[CONT]] ]
119*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = mul nsw i32 [[EXPECTED]], [[EXPR]]
120*67e74705SXin Li // CHECK: store i32 [[DESIRED]], i32* [[TEMP:%.+]],
121*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i32, i32* [[TEMP]],
122*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i32* [[X_ADDR]], i32 [[EXPECTED]], i32 [[DESIRED]] monotonic monotonic
123*67e74705SXin Li // CHECK: [[OLD_X]] = extractvalue { i32, i1 } [[RES]], 0
124*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i32, i1 } [[RES]], 1
125*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
126*67e74705SXin Li // CHECK: [[EXIT]]
127*67e74705SXin Li #pragma omp atomic update
128*67e74705SXin Li ix *= iv;
129*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load i32, i32* @{{.+}},
130*67e74705SXin Li // CHECK: atomicrmw sub i32* @{{.+}}, i32 [[EXPR]] monotonic
131*67e74705SXin Li #pragma omp atomic
132*67e74705SXin Li uix -= uiv;
133*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load i32, i32* @{{.+}},
134*67e74705SXin Li // CHECK: [[X:%.+]] = load atomic i32, i32* [[X_ADDR:@.+]] monotonic
135*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
136*67e74705SXin Li // CHECK: [[CONT]]
137*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i32 [ [[X]], %{{.+}} ], [ [[OLD_X:%.+]], %[[CONT]] ]
138*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = shl i32 [[EXPECTED]], [[EXPR]]
139*67e74705SXin Li // CHECK: store i32 [[DESIRED]], i32* [[TEMP:%.+]],
140*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i32, i32* [[TEMP]],
141*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i32* [[X_ADDR]], i32 [[EXPECTED]], i32 [[DESIRED]] monotonic monotonic
142*67e74705SXin Li // CHECK: [[OLD_X]] = extractvalue { i32, i1 } [[RES]], 0
143*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i32, i1 } [[RES]], 1
144*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
145*67e74705SXin Li // CHECK: [[EXIT]]
146*67e74705SXin Li #pragma omp atomic update
147*67e74705SXin Li ix <<= iv;
148*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load i32, i32* @{{.+}},
149*67e74705SXin Li // CHECK: [[X:%.+]] = load atomic i32, i32* [[X_ADDR:@.+]] monotonic
150*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
151*67e74705SXin Li // CHECK: [[CONT]]
152*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i32 [ [[X]], %{{.+}} ], [ [[OLD_X:%.+]], %[[CONT]] ]
153*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = lshr i32 [[EXPECTED]], [[EXPR]]
154*67e74705SXin Li // CHECK: store i32 [[DESIRED]], i32* [[TEMP:%.+]],
155*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i32, i32* [[TEMP]],
156*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i32* [[X_ADDR]], i32 [[EXPECTED]], i32 [[DESIRED]] monotonic monotonic
157*67e74705SXin Li // CHECK: [[OLD_X]] = extractvalue { i32, i1 } [[RES]], 0
158*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i32, i1 } [[RES]], 1
159*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
160*67e74705SXin Li // CHECK: [[EXIT]]
161*67e74705SXin Li #pragma omp atomic
162*67e74705SXin Li uix >>= uiv;
163*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load i64, i64* @{{.+}},
164*67e74705SXin Li // CHECK: [[X:%.+]] = load atomic i64, i64* [[X_ADDR:@.+]] monotonic
165*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
166*67e74705SXin Li // CHECK: [[CONT]]
167*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i64 [ [[X]], %{{.+}} ], [ [[OLD_X:%.+]], %[[CONT]] ]
168*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = sdiv i64 [[EXPECTED]], [[EXPR]]
169*67e74705SXin Li // CHECK: store i64 [[DESIRED]], i64* [[TEMP:%.+]],
170*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i64, i64* [[TEMP]],
171*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i64* [[X_ADDR]], i64 [[EXPECTED]], i64 [[DESIRED]] monotonic monotonic
172*67e74705SXin Li // CHECK: [[OLD_X]] = extractvalue { i64, i1 } [[RES]], 0
173*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i64, i1 } [[RES]], 1
174*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
175*67e74705SXin Li // CHECK: [[EXIT]]
176*67e74705SXin Li #pragma omp atomic update
177*67e74705SXin Li lx /= lv;
178*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load i64, i64* @{{.+}},
179*67e74705SXin Li // CHECK: atomicrmw and i64* @{{.+}}, i64 [[EXPR]] monotonic
180*67e74705SXin Li #pragma omp atomic
181*67e74705SXin Li ulx &= ulv;
182*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load i64, i64* @{{.+}},
183*67e74705SXin Li // CHECK: atomicrmw xor i64* @{{.+}}, i64 [[EXPR]] monotonic
184*67e74705SXin Li #pragma omp atomic update
185*67e74705SXin Li llx ^= llv;
186*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load i64, i64* @{{.+}},
187*67e74705SXin Li // CHECK: atomicrmw or i64* @{{.+}}, i64 [[EXPR]] monotonic
188*67e74705SXin Li #pragma omp atomic
189*67e74705SXin Li ullx |= ullv;
190*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load float, float* @{{.+}},
191*67e74705SXin Li // CHECK: [[OLD:%.+]] = load atomic i32, i32* bitcast (float* [[X_ADDR:@.+]] to i32*) monotonic
192*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
193*67e74705SXin Li // CHECK: [[CONT]]
194*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i32 [ [[OLD]], %{{.+}} ], [ [[PREV:%.+]], %[[CONT]] ]
195*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast float* [[TEMP:%.+]] to i32*
196*67e74705SXin Li // CHECK: [[OLD:%.+]] = bitcast i32 [[EXPECTED]] to float
197*67e74705SXin Li // CHECK: [[ADD:%.+]] = fadd float [[OLD]], [[EXPR]]
198*67e74705SXin Li // CHECK: store float [[ADD]], float* [[TEMP]],
199*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i32, i32* [[BITCAST]],
200*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i32* bitcast (float* [[X_ADDR]] to i32*), i32 [[EXPECTED]], i32 [[DESIRED]] monotonic monotonic
201*67e74705SXin Li // CHECK: [[PREV:%.+]] = extractvalue { i32, i1 } [[RES]], 0
202*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i32, i1 } [[RES]], 1
203*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
204*67e74705SXin Li // CHECK: [[EXIT]]
205*67e74705SXin Li #pragma omp atomic update
206*67e74705SXin Li fx = fx + fv;
207*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load double, double* @{{.+}},
208*67e74705SXin Li // CHECK: [[OLD:%.+]] = load atomic i64, i64* bitcast (double* [[X_ADDR:@.+]] to i64*) monotonic
209*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
210*67e74705SXin Li // CHECK: [[CONT]]
211*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i64 [ [[OLD]], %{{.+}} ], [ [[PREV:%.+]], %[[CONT]] ]
212*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast double* [[TEMP:%.+]] to i64*
213*67e74705SXin Li // CHECK: [[OLD:%.+]] = bitcast i64 [[EXPECTED]] to double
214*67e74705SXin Li // CHECK: [[SUB:%.+]] = fsub double [[EXPR]], [[OLD]]
215*67e74705SXin Li // CHECK: store double [[SUB]], double* [[TEMP]],
216*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i64, i64* [[BITCAST]],
217*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i64* bitcast (double* [[X_ADDR]] to i64*), i64 [[EXPECTED]], i64 [[DESIRED]] monotonic monotonic
218*67e74705SXin Li // CHECK: [[PREV:%.+]] = extractvalue { i64, i1 } [[RES]], 0
219*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i64, i1 } [[RES]], 1
220*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
221*67e74705SXin Li // CHECK: [[EXIT]]
222*67e74705SXin Li #pragma omp atomic
223*67e74705SXin Li dx = dv - dx;
224*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load x86_fp80, x86_fp80* @{{.+}},
225*67e74705SXin Li // CHECK: [[OLD:%.+]] = load atomic i128, i128* bitcast (x86_fp80* [[X_ADDR:@.+]] to i128*) monotonic
226*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
227*67e74705SXin Li // CHECK: [[CONT]]
228*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i128 [ [[OLD]], %{{.+}} ], [ [[PREV:%.+]], %[[CONT]] ]
229*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast x86_fp80* [[TEMP:%.+]] to i128*
230*67e74705SXin Li // CHECK: store i128 [[EXPECTED]], i128* [[BITCAST]],
231*67e74705SXin Li // CHECK: [[BITCAST1:%.+]] = bitcast x86_fp80* [[TEMP1:%.+]] to i128*
232*67e74705SXin Li // CHECK: store i128 [[EXPECTED]], i128* [[BITCAST1]],
233*67e74705SXin Li // CHECK: [[OLD:%.+]] = load x86_fp80, x86_fp80* [[TEMP1]]
234*67e74705SXin Li // CHECK: [[MUL:%.+]] = fmul x86_fp80 [[OLD]], [[EXPR]]
235*67e74705SXin Li // CHECK: store x86_fp80 [[MUL]], x86_fp80* [[TEMP]]
236*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i128, i128* [[BITCAST]]
237*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i128* bitcast (x86_fp80* [[X_ADDR]] to i128*), i128 [[EXPECTED]], i128 [[DESIRED]] monotonic monotonic
238*67e74705SXin Li // CHECK: [[PREV:%.+]] = extractvalue { i128, i1 } [[RES]], 0
239*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i128, i1 } [[RES]], 1
240*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
241*67e74705SXin Li // CHECK: [[EXIT]]
242*67e74705SXin Li #pragma omp atomic update
243*67e74705SXin Li ldx = ldx * ldv;
244*67e74705SXin Li // CHECK: [[EXPR_RE:%.+]] = load i32, i32* getelementptr inbounds ({ i32, i32 }, { i32, i32 }* @{{.+}}, i32 0, i32 0)
245*67e74705SXin Li // CHECK: [[EXPR_IM:%.+]] = load i32, i32* getelementptr inbounds ({ i32, i32 }, { i32, i32 }* @{{.+}}, i32 0, i32 1)
246*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast { i32, i32 }* [[EXPECTED_ADDR:%.+]] to i8*
247*67e74705SXin Li // CHECK: call void @__atomic_load(i64 8, i8* bitcast ({ i32, i32 }* [[X_ADDR:@.+]] to i8*), i8* [[BITCAST]], i32 0)
248*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
249*67e74705SXin Li // CHECK: [[CONT]]
250*67e74705SXin Li // CHECK: [[X_RE_ADDR:%.+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* [[EXPECTED_ADDR]], i32 0, i32 0
251*67e74705SXin Li // CHECK: [[X_RE:%.+]] = load i32, i32* [[X_RE_ADDR]]
252*67e74705SXin Li // CHECK: [[X_IM_ADDR:%.+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* [[EXPECTED_ADDR]], i32 0, i32 1
253*67e74705SXin Li // CHECK: [[X_IM:%.+]] = load i32, i32* [[X_IM_ADDR]]
254*67e74705SXin Li // <Skip checks for complex calculations>
255*67e74705SXin Li // CHECK: [[X_RE_ADDR:%.+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* [[DESIRED_ADDR:%.+]], i32 0, i32 0
256*67e74705SXin Li // CHECK: [[X_IM_ADDR:%.+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* [[DESIRED_ADDR]], i32 0, i32 1
257*67e74705SXin Li // CHECK: store i32 %{{.+}}, i32* [[X_RE_ADDR]]
258*67e74705SXin Li // CHECK: store i32 %{{.+}}, i32* [[X_IM_ADDR]]
259*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = bitcast { i32, i32 }* [[EXPECTED_ADDR]] to i8*
260*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = bitcast { i32, i32 }* [[DESIRED_ADDR]] to i8*
261*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = call zeroext i1 @__atomic_compare_exchange(i64 8, i8* bitcast ({ i32, i32 }* [[X_ADDR]] to i8*), i8* [[EXPECTED]], i8* [[DESIRED]], i32 0, i32 0)
262*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
263*67e74705SXin Li // CHECK: [[EXIT]]
264*67e74705SXin Li #pragma omp atomic
265*67e74705SXin Li cix = civ / cix;
266*67e74705SXin Li // CHECK: [[EXPR_RE:%.+]] = load float, float* getelementptr inbounds ({ float, float }, { float, float }* @{{.+}}, i32 0, i32 0)
267*67e74705SXin Li // CHECK: [[EXPR_IM:%.+]] = load float, float* getelementptr inbounds ({ float, float }, { float, float }* @{{.+}}, i32 0, i32 1)
268*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast { float, float }* [[EXPECTED_ADDR:%.+]] to i8*
269*67e74705SXin Li // CHECK: call void @__atomic_load(i64 8, i8* bitcast ({ float, float }* [[X_ADDR:@.+]] to i8*), i8* [[BITCAST]], i32 0)
270*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
271*67e74705SXin Li // CHECK: [[CONT]]
272*67e74705SXin Li // CHECK: [[X_RE_ADDR:%.+]] = getelementptr inbounds { float, float }, { float, float }* [[EXPECTED_ADDR]], i32 0, i32 0
273*67e74705SXin Li // CHECK: [[X_RE:%.+]] = load float, float* [[X_RE_ADDR]]
274*67e74705SXin Li // CHECK: [[X_IM_ADDR:%.+]] = getelementptr inbounds { float, float }, { float, float }* [[EXPECTED_ADDR]], i32 0, i32 1
275*67e74705SXin Li // CHECK: [[X_IM:%.+]] = load float, float* [[X_IM_ADDR]]
276*67e74705SXin Li // <Skip checks for complex calculations>
277*67e74705SXin Li // CHECK: [[X_RE_ADDR:%.+]] = getelementptr inbounds { float, float }, { float, float }* [[DESIRED_ADDR:%.+]], i32 0, i32 0
278*67e74705SXin Li // CHECK: [[X_IM_ADDR:%.+]] = getelementptr inbounds { float, float }, { float, float }* [[DESIRED_ADDR]], i32 0, i32 1
279*67e74705SXin Li // CHECK: store float %{{.+}}, float* [[X_RE_ADDR]]
280*67e74705SXin Li // CHECK: store float %{{.+}}, float* [[X_IM_ADDR]]
281*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = bitcast { float, float }* [[EXPECTED_ADDR]] to i8*
282*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = bitcast { float, float }* [[DESIRED_ADDR]] to i8*
283*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = call zeroext i1 @__atomic_compare_exchange(i64 8, i8* bitcast ({ float, float }* [[X_ADDR]] to i8*), i8* [[EXPECTED]], i8* [[DESIRED]], i32 0, i32 0)
284*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
285*67e74705SXin Li // CHECK: [[EXIT]]
286*67e74705SXin Li #pragma omp atomic update
287*67e74705SXin Li cfx = cfv + cfx;
288*67e74705SXin Li // CHECK: [[EXPR_RE:%.+]] = load double, double* getelementptr inbounds ({ double, double }, { double, double }* @{{.+}}, i32 0, i32 0)
289*67e74705SXin Li // CHECK: [[EXPR_IM:%.+]] = load double, double* getelementptr inbounds ({ double, double }, { double, double }* @{{.+}}, i32 0, i32 1)
290*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast { double, double }* [[EXPECTED_ADDR:%.+]] to i8*
291*67e74705SXin Li // CHECK: call void @__atomic_load(i64 16, i8* bitcast ({ double, double }* [[X_ADDR:@.+]] to i8*), i8* [[BITCAST]], i32 5)
292*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
293*67e74705SXin Li // CHECK: [[CONT]]
294*67e74705SXin Li // CHECK: [[X_RE_ADDR:%.+]] = getelementptr inbounds { double, double }, { double, double }* [[EXPECTED_ADDR]], i32 0, i32 0
295*67e74705SXin Li // CHECK: [[X_RE:%.+]] = load double, double* [[X_RE_ADDR]]
296*67e74705SXin Li // CHECK: [[X_IM_ADDR:%.+]] = getelementptr inbounds { double, double }, { double, double }* [[EXPECTED_ADDR]], i32 0, i32 1
297*67e74705SXin Li // CHECK: [[X_IM:%.+]] = load double, double* [[X_IM_ADDR]]
298*67e74705SXin Li // <Skip checks for complex calculations>
299*67e74705SXin Li // CHECK: [[X_RE_ADDR:%.+]] = getelementptr inbounds { double, double }, { double, double }* [[DESIRED_ADDR:%.+]], i32 0, i32 0
300*67e74705SXin Li // CHECK: [[X_IM_ADDR:%.+]] = getelementptr inbounds { double, double }, { double, double }* [[DESIRED_ADDR]], i32 0, i32 1
301*67e74705SXin Li // CHECK: store double %{{.+}}, double* [[X_RE_ADDR]]
302*67e74705SXin Li // CHECK: store double %{{.+}}, double* [[X_IM_ADDR]]
303*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = bitcast { double, double }* [[EXPECTED_ADDR]] to i8*
304*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = bitcast { double, double }* [[DESIRED_ADDR]] to i8*
305*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = call zeroext i1 @__atomic_compare_exchange(i64 16, i8* bitcast ({ double, double }* [[X_ADDR]] to i8*), i8* [[EXPECTED]], i8* [[DESIRED]], i32 5, i32 5)
306*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
307*67e74705SXin Li // CHECK: [[EXIT]]
308*67e74705SXin Li // CHECK: call{{.*}} @__kmpc_flush(
309*67e74705SXin Li #pragma omp atomic seq_cst
310*67e74705SXin Li cdx = cdx - cdv;
311*67e74705SXin Li // CHECK: [[BV:%.+]] = load i8, i8* @{{.+}}
312*67e74705SXin Li // CHECK: [[BOOL:%.+]] = trunc i8 [[BV]] to i1
313*67e74705SXin Li // CHECK: [[EXPR:%.+]] = zext i1 [[BOOL]] to i64
314*67e74705SXin Li // CHECK: atomicrmw and i64* @{{.+}}, i64 [[EXPR]] monotonic
315*67e74705SXin Li #pragma omp atomic update
316*67e74705SXin Li ulx = ulx & bv;
317*67e74705SXin Li // CHECK: [[CV:%.+]] = load i8, i8* @{{.+}}, align 1
318*67e74705SXin Li // CHECK: [[EXPR:%.+]] = sext i8 [[CV]] to i32
319*67e74705SXin Li // CHECK: [[BX:%.+]] = load atomic i8, i8* [[BX_ADDR:@.+]] monotonic
320*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
321*67e74705SXin Li // CHECK: [[CONT]]
322*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i8 [ [[BX]], %{{.+}} ], [ [[OLD_X:%.+]], %[[CONT]] ]
323*67e74705SXin Li // CHECK: [[OLD:%.+]] = trunc i8 [[EXPECTED]] to i1
324*67e74705SXin Li // CHECK: [[X_RVAL:%.+]] = zext i1 [[OLD]] to i32
325*67e74705SXin Li // CHECK: [[AND:%.+]] = and i32 [[EXPR]], [[X_RVAL]]
326*67e74705SXin Li // CHECK: [[CAST:%.+]] = icmp ne i32 [[AND]], 0
327*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = zext i1 [[CAST]] to i8
328*67e74705SXin Li // CHECK: store i8 [[DESIRED]], i8* [[TEMP:%.+]],
329*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i8, i8* [[TEMP]],
330*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i8* [[BX_ADDR]], i8 [[EXPECTED]], i8 [[DESIRED]] monotonic monotonic
331*67e74705SXin Li // CHECK: [[OLD_X:%.+]] = extractvalue { i8, i1 } [[RES]], 0
332*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i8, i1 } [[RES]], 1
333*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
334*67e74705SXin Li // CHECK: [[EXIT]]
335*67e74705SXin Li #pragma omp atomic
336*67e74705SXin Li bx = cv & bx;
337*67e74705SXin Li // CHECK: [[UCV:%.+]] = load i8, i8* @{{.+}},
338*67e74705SXin Li // CHECK: [[EXPR:%.+]] = zext i8 [[UCV]] to i32
339*67e74705SXin Li // CHECK: [[X:%.+]] = load atomic i8, i8* [[CX_ADDR:@.+]] seq_cst
340*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
341*67e74705SXin Li // CHECK: [[CONT]]
342*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i8 [ [[X]], %{{.+}} ], [ [[OLD_X:%.+]], %[[CONT]] ]
343*67e74705SXin Li // CHECK: [[X_RVAL:%.+]] = sext i8 [[EXPECTED]] to i32
344*67e74705SXin Li // CHECK: [[ASHR:%.+]] = ashr i32 [[X_RVAL]], [[EXPR]]
345*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = trunc i32 [[ASHR]] to i8
346*67e74705SXin Li // CHECK: store i8 [[DESIRED]], i8* [[TEMP:%.+]],
347*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i8, i8* [[TEMP]],
348*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i8* [[CX_ADDR]], i8 [[EXPECTED]], i8 [[DESIRED]] seq_cst seq_cst
349*67e74705SXin Li // CHECK: [[OLD_X:%.+]] = extractvalue { i8, i1 } [[RES]], 0
350*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i8, i1 } [[RES]], 1
351*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
352*67e74705SXin Li // CHECK: [[EXIT]]
353*67e74705SXin Li // CHECK: call{{.*}} @__kmpc_flush(
354*67e74705SXin Li #pragma omp atomic update, seq_cst
355*67e74705SXin Li cx = cx >> ucv;
356*67e74705SXin Li // CHECK: [[SV:%.+]] = load i16, i16* @{{.+}},
357*67e74705SXin Li // CHECK: [[EXPR:%.+]] = sext i16 [[SV]] to i32
358*67e74705SXin Li // CHECK: [[X:%.+]] = load atomic i64, i64* [[ULX_ADDR:@.+]] monotonic
359*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
360*67e74705SXin Li // CHECK: [[CONT]]
361*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i64 [ [[X]], %{{.+}} ], [ [[OLD_X:%.+]], %[[CONT]] ]
362*67e74705SXin Li // CHECK: [[X_RVAL:%.+]] = trunc i64 [[EXPECTED]] to i32
363*67e74705SXin Li // CHECK: [[SHL:%.+]] = shl i32 [[EXPR]], [[X_RVAL]]
364*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = sext i32 [[SHL]] to i64
365*67e74705SXin Li // CHECK: store i64 [[DESIRED]], i64* [[TEMP:%.+]],
366*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i64, i64* [[TEMP]],
367*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i64* [[ULX_ADDR]], i64 [[EXPECTED]], i64 [[DESIRED]] monotonic monotonic
368*67e74705SXin Li // CHECK: [[OLD_X:%.+]] = extractvalue { i64, i1 } [[RES]], 0
369*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i64, i1 } [[RES]], 1
370*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
371*67e74705SXin Li // CHECK: [[EXIT]]
372*67e74705SXin Li #pragma omp atomic update
373*67e74705SXin Li ulx = sv << ulx;
374*67e74705SXin Li // CHECK: [[USV:%.+]] = load i16, i16* @{{.+}},
375*67e74705SXin Li // CHECK: [[EXPR:%.+]] = zext i16 [[USV]] to i64
376*67e74705SXin Li // CHECK: [[X:%.+]] = load atomic i64, i64* [[LX_ADDR:@.+]] monotonic
377*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
378*67e74705SXin Li // CHECK: [[CONT]]
379*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i64 [ [[X]], %{{.+}} ], [ [[OLD_X:%.+]], %[[CONT]] ]
380*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = srem i64 [[EXPECTED]], [[EXPR]]
381*67e74705SXin Li // CHECK: store i64 [[DESIRED]], i64* [[TEMP:%.+]],
382*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i64, i64* [[TEMP]],
383*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i64* [[LX_ADDR]], i64 [[EXPECTED]], i64 [[DESIRED]] monotonic monotonic
384*67e74705SXin Li // CHECK: [[OLD_X:%.+]] = extractvalue { i64, i1 } [[RES]], 0
385*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i64, i1 } [[RES]], 1
386*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
387*67e74705SXin Li // CHECK: [[EXIT]]
388*67e74705SXin Li #pragma omp atomic
389*67e74705SXin Li lx = lx % usv;
390*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load i32, i32* @{{.+}}
391*67e74705SXin Li // CHECK: atomicrmw or i32* @{{.+}}, i32 [[EXPR]] seq_cst
392*67e74705SXin Li // CHECK: call{{.*}} @__kmpc_flush(
393*67e74705SXin Li #pragma omp atomic seq_cst, update
394*67e74705SXin Li uix = iv | uix;
395*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load i32, i32* @{{.+}}
396*67e74705SXin Li // CHECK: atomicrmw and i32* @{{.+}}, i32 [[EXPR]] monotonic
397*67e74705SXin Li #pragma omp atomic
398*67e74705SXin Li ix = ix & uiv;
399*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load i64, i64* @{{.+}},
400*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast { i32, i32 }* [[EXPECTED_ADDR:%.+]] to i8*
401*67e74705SXin Li // CHECK: call void @__atomic_load(i64 8, i8* bitcast ({ i32, i32 }* [[X_ADDR:@.+]] to i8*), i8* [[BITCAST]], i32 0)
402*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
403*67e74705SXin Li // CHECK: [[CONT]]
404*67e74705SXin Li // CHECK: [[X_RE_ADDR:%.+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* [[EXPECTED_ADDR]], i32 0, i32 0
405*67e74705SXin Li // CHECK: [[X_RE:%.+]] = load i32, i32* [[X_RE_ADDR]]
406*67e74705SXin Li // CHECK: [[X_IM_ADDR:%.+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* [[EXPECTED_ADDR]], i32 0, i32 1
407*67e74705SXin Li // CHECK: [[X_IM:%.+]] = load i32, i32* [[X_IM_ADDR]]
408*67e74705SXin Li // <Skip checks for complex calculations>
409*67e74705SXin Li // CHECK: [[X_RE_ADDR:%.+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* [[DESIRED_ADDR:%.+]], i32 0, i32 0
410*67e74705SXin Li // CHECK: [[X_IM_ADDR:%.+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* [[DESIRED_ADDR]], i32 0, i32 1
411*67e74705SXin Li // CHECK: store i32 %{{.+}}, i32* [[X_RE_ADDR]]
412*67e74705SXin Li // CHECK: store i32 %{{.+}}, i32* [[X_IM_ADDR]]
413*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = bitcast { i32, i32 }* [[EXPECTED_ADDR]] to i8*
414*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = bitcast { i32, i32 }* [[DESIRED_ADDR]] to i8*
415*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = call zeroext i1 @__atomic_compare_exchange(i64 8, i8* bitcast ({ i32, i32 }* [[X_ADDR]] to i8*), i8* [[EXPECTED]], i8* [[DESIRED]], i32 0, i32 0)
416*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
417*67e74705SXin Li // CHECK: [[EXIT]]
418*67e74705SXin Li #pragma omp atomic update
419*67e74705SXin Li cix = lv + cix;
420*67e74705SXin Li // CHECK: [[ULV:%.+]] = load i64, i64* @{{.+}},
421*67e74705SXin Li // CHECK: [[EXPR:%.+]] = uitofp i64 [[ULV]] to float
422*67e74705SXin Li // CHECK: [[OLD:%.+]] = load atomic i32, i32* bitcast (float* [[X_ADDR:@.+]] to i32*) monotonic
423*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
424*67e74705SXin Li // CHECK: [[CONT]]
425*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i32 [ [[OLD]], %{{.+}} ], [ [[PREV:%.+]], %[[CONT]] ]
426*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast float* [[TEMP:%.+]] to i32*
427*67e74705SXin Li // CHECK: [[OLD:%.+]] = bitcast i32 [[EXPECTED]] to float
428*67e74705SXin Li // CHECK: [[MUL:%.+]] = fmul float [[OLD]], [[EXPR]]
429*67e74705SXin Li // CHECK: store float [[MUL]], float* [[TEMP]],
430*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i32, i32* [[BITCAST]],
431*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i32* bitcast (float* [[X_ADDR]] to i32*), i32 [[EXPECTED]], i32 [[DESIRED]] monotonic monotonic
432*67e74705SXin Li // CHECK: [[PREV:%.+]] = extractvalue { i32, i1 } [[RES]], 0
433*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i32, i1 } [[RES]], 1
434*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
435*67e74705SXin Li // CHECK: [[EXIT]]
436*67e74705SXin Li #pragma omp atomic
437*67e74705SXin Li fx = fx * ulv;
438*67e74705SXin Li // CHECK: [[LLV:%.+]] = load i64, i64* @{{.+}},
439*67e74705SXin Li // CHECK: [[EXPR:%.+]] = sitofp i64 [[LLV]] to double
440*67e74705SXin Li // CHECK: [[OLD:%.+]] = load atomic i64, i64* bitcast (double* [[X_ADDR:@.+]] to i64*) monotonic
441*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
442*67e74705SXin Li // CHECK: [[CONT]]
443*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i64 [ [[OLD]], %{{.+}} ], [ [[PREV:%.+]], %[[CONT]] ]
444*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast double* [[TEMP:%.+]] to i64*
445*67e74705SXin Li // CHECK: [[OLD:%.+]] = bitcast i64 [[EXPECTED]] to double
446*67e74705SXin Li // CHECK: [[DIV:%.+]] = fdiv double [[OLD]], [[EXPR]]
447*67e74705SXin Li // CHECK: store double [[DIV]], double* [[TEMP]],
448*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i64, i64* [[BITCAST]],
449*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i64* bitcast (double* [[X_ADDR]] to i64*), i64 [[EXPECTED]], i64 [[DESIRED]] monotonic monotonic
450*67e74705SXin Li // CHECK: [[PREV:%.+]] = extractvalue { i64, i1 } [[RES]], 0
451*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i64, i1 } [[RES]], 1
452*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
453*67e74705SXin Li // CHECK: [[EXIT]]
454*67e74705SXin Li #pragma omp atomic update
455*67e74705SXin Li dx /= llv;
456*67e74705SXin Li // CHECK: [[ULLV:%.+]] = load i64, i64* @{{.+}},
457*67e74705SXin Li // CHECK: [[EXPR:%.+]] = uitofp i64 [[ULLV]] to x86_fp80
458*67e74705SXin Li // CHECK: [[OLD:%.+]] = load atomic i128, i128* bitcast (x86_fp80* [[X_ADDR:@.+]] to i128*) monotonic
459*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
460*67e74705SXin Li // CHECK: [[CONT]]
461*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i128 [ [[OLD]], %{{.+}} ], [ [[PREV:%.+]], %[[CONT]] ]
462*67e74705SXin Li // CHECK: [[BITCAST1:%.+]] = bitcast x86_fp80* [[TEMP1:%.+]] to i128*
463*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast x86_fp80* [[TEMP:%.+]] to i128*
464*67e74705SXin Li // CHECK: store i128 [[EXPECTED]], i128* [[BITCAST]]
465*67e74705SXin Li // CHECK: [[OLD:%.+]] = load x86_fp80, x86_fp80* [[TEMP]]
466*67e74705SXin Li // CHECK: [[SUB:%.+]] = fsub x86_fp80 [[OLD]], [[EXPR]]
467*67e74705SXin Li // CHECK: store x86_fp80 [[SUB]], x86_fp80* [[TEMP1]]
468*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i128, i128* [[BITCAST1]]
469*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i128* bitcast (x86_fp80* [[X_ADDR]] to i128*), i128 [[EXPECTED]], i128 [[DESIRED]] monotonic monotonic
470*67e74705SXin Li // CHECK: [[PREV:%.+]] = extractvalue { i128, i1 } [[RES]], 0
471*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i128, i1 } [[RES]], 1
472*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
473*67e74705SXin Li // CHECK: [[EXIT]]
474*67e74705SXin Li #pragma omp atomic
475*67e74705SXin Li ldx -= ullv;
476*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load float, float* @{{.+}},
477*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast { i32, i32 }* [[EXPECTED_ADDR:%.+]] to i8*
478*67e74705SXin Li // CHECK: call void @__atomic_load(i64 8, i8* bitcast ({ i32, i32 }* [[X_ADDR:@.+]] to i8*), i8* [[BITCAST]], i32 0)
479*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
480*67e74705SXin Li // CHECK: [[CONT]]
481*67e74705SXin Li // CHECK: [[X_RE_ADDR:%.+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* [[EXPECTED_ADDR]], i32 0, i32 0
482*67e74705SXin Li // CHECK: [[X_RE:%.+]] = load i32, i32* [[X_RE_ADDR]]
483*67e74705SXin Li // CHECK: [[X_IM_ADDR:%.+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* [[EXPECTED_ADDR]], i32 0, i32 1
484*67e74705SXin Li // CHECK: [[X_IM:%.+]] = load i32, i32* [[X_IM_ADDR]]
485*67e74705SXin Li // <Skip checks for complex calculations>
486*67e74705SXin Li // CHECK: [[X_RE_ADDR:%.+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* [[DESIRED_ADDR:%.+]], i32 0, i32 0
487*67e74705SXin Li // CHECK: [[X_IM_ADDR:%.+]] = getelementptr inbounds { i32, i32 }, { i32, i32 }* [[DESIRED_ADDR]], i32 0, i32 1
488*67e74705SXin Li // CHECK: store i32 %{{.+}}, i32* [[X_RE_ADDR]]
489*67e74705SXin Li // CHECK: store i32 %{{.+}}, i32* [[X_IM_ADDR]]
490*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = bitcast { i32, i32 }* [[EXPECTED_ADDR]] to i8*
491*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = bitcast { i32, i32 }* [[DESIRED_ADDR]] to i8*
492*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = call zeroext i1 @__atomic_compare_exchange(i64 8, i8* bitcast ({ i32, i32 }* [[X_ADDR]] to i8*), i8* [[EXPECTED]], i8* [[DESIRED]], i32 0, i32 0)
493*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
494*67e74705SXin Li // CHECK: [[EXIT]]
495*67e74705SXin Li #pragma omp atomic update
496*67e74705SXin Li cix = fv / cix;
497*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load double, double* @{{.+}},
498*67e74705SXin Li // CHECK: [[X:%.+]] = load atomic i16, i16* [[X_ADDR:@.+]] monotonic
499*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
500*67e74705SXin Li // CHECK: [[CONT]]
501*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i16 [ [[X]], %{{.+}} ], [ [[OLD_X:%.+]], %[[CONT]] ]
502*67e74705SXin Li // CHECK: [[CONV:%.+]] = sext i16 [[EXPECTED]] to i32
503*67e74705SXin Li // CHECK: [[X_RVAL:%.+]] = sitofp i32 [[CONV]] to double
504*67e74705SXin Li // CHECK: [[ADD:%.+]] = fadd double [[X_RVAL]], [[EXPR]]
505*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = fptosi double [[ADD]] to i16
506*67e74705SXin Li // CHECK: store i16 [[DESIRED]], i16* [[TEMP:%.+]]
507*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i16, i16* [[TEMP]]
508*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i16* [[X_ADDR]], i16 [[EXPECTED]], i16 [[DESIRED]] monotonic monotonic
509*67e74705SXin Li // CHECK: [[OLD_X]] = extractvalue { i16, i1 } [[RES]], 0
510*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i16, i1 } [[RES]], 1
511*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
512*67e74705SXin Li // CHECK: [[EXIT]]
513*67e74705SXin Li #pragma omp atomic
514*67e74705SXin Li sx = sx + dv;
515*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load x86_fp80, x86_fp80* @{{.+}},
516*67e74705SXin Li // CHECK: [[XI8:%.+]] = load atomic i8, i8* [[X_ADDR:@.+]] monotonic
517*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
518*67e74705SXin Li // CHECK: [[CONT]]
519*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i8 [ [[XI8]], %{{.+}} ], [ [[OLD_XI8:%.+]], %[[CONT]] ]
520*67e74705SXin Li // CHECK: [[BOOL_EXPECTED:%.+]] = trunc i8 [[EXPECTED]] to i1
521*67e74705SXin Li // CHECK: [[CONV:%.+]] = zext i1 [[BOOL_EXPECTED]] to i32
522*67e74705SXin Li // CHECK: [[X_RVAL:%.+]] = sitofp i32 [[CONV]] to x86_fp80
523*67e74705SXin Li // CHECK: [[MUL:%.+]] = fmul x86_fp80 [[EXPR]], [[X_RVAL]]
524*67e74705SXin Li // CHECK: [[BOOL_DESIRED:%.+]] = fcmp une x86_fp80 [[MUL]], 0xK00000000000000000000
525*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = zext i1 [[BOOL_DESIRED]] to i8
526*67e74705SXin Li // CHECK: store i8 [[DESIRED]], i8* [[TEMP:%.+]]
527*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i8, i8* [[TEMP]]
528*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i8* [[X_ADDR]], i8 [[EXPECTED]], i8 [[DESIRED]] monotonic monotonic
529*67e74705SXin Li // CHECK: [[OLD_XI8:%.+]] = extractvalue { i8, i1 } [[RES]], 0
530*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i8, i1 } [[RES]], 1
531*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
532*67e74705SXin Li // CHECK: [[EXIT]]
533*67e74705SXin Li #pragma omp atomic update
534*67e74705SXin Li bx = ldv * bx;
535*67e74705SXin Li // CHECK: [[EXPR_RE:%.+]] = load i32, i32* getelementptr inbounds ({ i32, i32 }, { i32, i32 }* [[CIV_ADDR:@.+]], i32 0, i32 0),
536*67e74705SXin Li // CHECK: [[EXPR_IM:%.+]] = load i32, i32* getelementptr inbounds ({ i32, i32 }, { i32, i32 }* [[CIV_ADDR]], i32 0, i32 1),
537*67e74705SXin Li // CHECK: [[XI8:%.+]] = load atomic i8, i8* [[X_ADDR:@.+]] monotonic
538*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
539*67e74705SXin Li // CHECK: [[CONT]]
540*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i8 [ [[XI8]], %{{.+}} ], [ [[OLD_XI8:%.+]], %[[CONT]] ]
541*67e74705SXin Li // CHECK: [[BOOL_EXPECTED:%.+]] = trunc i8 [[EXPECTED]] to i1
542*67e74705SXin Li // CHECK: [[X_RVAL:%.+]] = zext i1 [[BOOL_EXPECTED]] to i32
543*67e74705SXin Li // CHECK: [[SUB_RE:%.+]] = sub i32 [[EXPR_RE:%.+]], [[X_RVAL]]
544*67e74705SXin Li // CHECK: [[SUB_IM:%.+]] = sub i32 [[EXPR_IM:%.+]], 0
545*67e74705SXin Li // CHECK: icmp ne i32 [[SUB_RE]], 0
546*67e74705SXin Li // CHECK: icmp ne i32 [[SUB_IM]], 0
547*67e74705SXin Li // CHECK: [[BOOL_DESIRED:%.+]] = or i1
548*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = zext i1 [[BOOL_DESIRED]] to i8
549*67e74705SXin Li // CHECK: store i8 [[DESIRED]], i8* [[TEMP:%.+]]
550*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i8, i8* [[TEMP]]
551*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i8* [[X_ADDR]], i8 [[EXPECTED]], i8 [[DESIRED]] monotonic monotonic
552*67e74705SXin Li // CHECK: [[OLD_XI8:%.+]] = extractvalue { i8, i1 } [[RES]], 0
553*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i8, i1 } [[RES]], 1
554*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
555*67e74705SXin Li // CHECK: [[EXIT]]
556*67e74705SXin Li #pragma omp atomic
557*67e74705SXin Li bx = civ - bx;
558*67e74705SXin Li // CHECK: [[EXPR_RE:%.+]] = load float, float* getelementptr inbounds ({ float, float }, { float, float }* @{{.+}}, i32 0, i32 0)
559*67e74705SXin Li // CHECK: [[EXPR_IM:%.+]] = load float, float* getelementptr inbounds ({ float, float }, { float, float }* @{{.+}}, i32 0, i32 1)
560*67e74705SXin Li // CHECK: [[X:%.+]] = load atomic i16, i16* [[X_ADDR:@.+]] monotonic
561*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
562*67e74705SXin Li // CHECK: [[CONT]]
563*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i16 [ [[X]], %{{.+}} ], [ [[OLD_X:%.+]], %[[CONT]] ]
564*67e74705SXin Li // CHECK: [[CONV:%.+]] = zext i16 [[EXPECTED]] to i32
565*67e74705SXin Li // CHECK: [[X_RVAL:%.+]] = sitofp i32 [[CONV]] to float
566*67e74705SXin Li // <Skip checks for complex calculations>
567*67e74705SXin Li // CHECK: [[X_RE_ADDR:%.+]] = getelementptr inbounds { float, float }, { float, float }* [[TEMP:%.+]], i32 0, i32 0
568*67e74705SXin Li // CHECK: [[X_RE:%.+]] = load float, float* [[X_RE_ADDR]]
569*67e74705SXin Li // CHECK: [[X_IM_ADDR:%.+]] = getelementptr inbounds { float, float }, { float, float }* [[TEMP]], i32 0, i32 1
570*67e74705SXin Li // CHECK: [[X_IM:%.+]] = load float, float* [[X_IM_ADDR]]
571*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = fptoui float [[X_RE]] to i16
572*67e74705SXin Li // CHECK: store i16 [[DESIRED]], i16* [[TEMP:%.+]]
573*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i16, i16* [[TEMP]]
574*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i16* [[X_ADDR]], i16 [[EXPECTED]], i16 [[DESIRED]] monotonic monotonic
575*67e74705SXin Li // CHECK: [[OLD_X]] = extractvalue { i16, i1 } [[RES]], 0
576*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i16, i1 } [[RES]], 1
577*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
578*67e74705SXin Li // CHECK: [[EXIT]]
579*67e74705SXin Li #pragma omp atomic update
580*67e74705SXin Li usx /= cfv;
581*67e74705SXin Li // CHECK: [[EXPR_RE:%.+]] = load double, double* getelementptr inbounds ({ double, double }, { double, double }* @{{.+}}, i32 0, i32 0)
582*67e74705SXin Li // CHECK: [[EXPR_IM:%.+]] = load double, double* getelementptr inbounds ({ double, double }, { double, double }* @{{.+}}, i32 0, i32 1)
583*67e74705SXin Li // CHECK: [[X:%.+]] = load atomic i64, i64* [[X_ADDR:@.+]] monotonic
584*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
585*67e74705SXin Li // CHECK: [[CONT]]
586*67e74705SXin Li // CHECK: [[EXPECTED:%.+]] = phi i64 [ [[X]], %{{.+}} ], [ [[OLD_X:%.+]], %[[CONT]] ]
587*67e74705SXin Li // CHECK: [[X_RVAL:%.+]] = sitofp i64 [[EXPECTED]] to double
588*67e74705SXin Li // CHECK: [[ADD_RE:%.+]] = fadd double [[X_RVAL]], [[EXPR_RE]]
589*67e74705SXin Li // CHECK: [[ADD_IM:%.+]] = fadd double 0.000000e+00, [[EXPR_IM]]
590*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = fptosi double [[ADD_RE]] to i64
591*67e74705SXin Li // CHECK: store i64 [[DESIRED]], i64* [[TEMP:%.+]]
592*67e74705SXin Li // CHECK: [[DESIRED:%.+]] = load i64, i64* [[TEMP]]
593*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i64* [[X_ADDR]], i64 [[EXPECTED]], i64 [[DESIRED]] monotonic monotonic
594*67e74705SXin Li // CHECK: [[OLD_X]] = extractvalue { i64, i1 } [[RES]], 0
595*67e74705SXin Li // CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i64, i1 } [[RES]], 1
596*67e74705SXin Li // CHECK: br i1 [[SUCCESS_FAIL]], label %[[EXIT:.+]], label %[[CONT]]
597*67e74705SXin Li // CHECK: [[EXIT]]
598*67e74705SXin Li #pragma omp atomic
599*67e74705SXin Li llx += cdv;
600*67e74705SXin Li // CHECK: [[IDX:%.+]] = load i16, i16* @{{.+}}
601*67e74705SXin Li // CHECK: load i8, i8*
602*67e74705SXin Li // CHECK: [[VEC_ITEM_VAL:%.+]] = zext i1 %{{.+}} to i32
603*67e74705SXin Li // CHECK: [[I128VAL:%.+]] = load atomic i128, i128* bitcast (<4 x i32>* [[DEST:@.+]] to i128*) monotonic
604*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
605*67e74705SXin Li // CHECK: [[CONT]]
606*67e74705SXin Li // CHECK: [[OLD_I128:%.+]] = phi i128 [ [[I128VAL]], %{{.+}} ], [ [[FAILED_I128_OLD_VAL:%.+]], %[[CONT]] ]
607*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast <4 x i32>* [[TEMP:%.+]] to i128*
608*67e74705SXin Li // CHECK: store i128 [[OLD_I128]], i128* [[BITCAST]],
609*67e74705SXin Li // CHECK: [[OLD_VEC_VAL:%.+]] = bitcast i128 [[OLD_I128]] to <4 x i32>
610*67e74705SXin Li // CHECK: store <4 x i32> [[OLD_VEC_VAL]], <4 x i32>* [[LDTEMP:%.+]],
611*67e74705SXin Li // CHECK: [[VEC_VAL:%.+]] = load <4 x i32>, <4 x i32>* [[LDTEMP]]
612*67e74705SXin Li // CHECK: [[ITEM:%.+]] = extractelement <4 x i32> [[VEC_VAL]], i16 [[IDX]]
613*67e74705SXin Li // CHECK: [[OR:%.+]] = or i32 [[ITEM]], [[VEC_ITEM_VAL]]
614*67e74705SXin Li // CHECK: [[VEC_VAL:%.+]] = load <4 x i32>, <4 x i32>* [[TEMP]]
615*67e74705SXin Li // CHECK: [[NEW_VEC_VAL:%.+]] = insertelement <4 x i32> [[VEC_VAL]], i32 [[OR]], i16 [[IDX]]
616*67e74705SXin Li // CHECK: store <4 x i32> [[NEW_VEC_VAL]], <4 x i32>* [[TEMP]]
617*67e74705SXin Li // CHECK: [[NEW_I128:%.+]] = load i128, i128* [[BITCAST]]
618*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i128* bitcast (<4 x i32>* [[DEST]] to i128*), i128 [[OLD_I128]], i128 [[NEW_I128]] monotonic monotonic
619*67e74705SXin Li // CHECK: [[FAILED_I128_OLD_VAL:%.+]] = extractvalue { i128, i1 } [[RES]], 0
620*67e74705SXin Li // CHECK: [[FAIL_SUCCESS:%.+]] = extractvalue { i128, i1 } [[RES]], 1
621*67e74705SXin Li // CHECK: br i1 [[FAIL_SUCCESS]], label %[[EXIT:.+]], label %[[CONT]]
622*67e74705SXin Li // CHECK: [[EXIT]]
623*67e74705SXin Li #pragma omp atomic update
624*67e74705SXin Li int4x[sv] |= bv;
625*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load x86_fp80, x86_fp80* @{{.+}}
626*67e74705SXin Li // CHECK: [[PREV_VALUE:%.+]] = load atomic i32, i32* bitcast (i8* getelementptr (i8, i8* bitcast (%struct.BitFields* @{{.+}} to i8*), i64 4) to i32*) monotonic
627*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
628*67e74705SXin Li // CHECK: [[CONT]]
629*67e74705SXin Li // CHECK: [[OLD_BF_VALUE:%.+]] = phi i32 [ [[PREV_VALUE]], %[[EXIT]] ], [ [[FAILED_OLD_VAL:%.+]], %[[CONT]] ]
630*67e74705SXin Li // CHECK: store i32 [[OLD_BF_VALUE]], i32* [[TEMP1:%.+]],
631*67e74705SXin Li // CHECK: store i32 [[OLD_BF_VALUE]], i32* [[TEMP:%.+]],
632*67e74705SXin Li // CHECK: [[A_LD:%.+]] = load i32, i32* [[TEMP]],
633*67e74705SXin Li // CHECK: [[A_SHL:%.+]] = shl i32 [[A_LD]], 1
634*67e74705SXin Li // CHECK: [[A_ASHR:%.+]] = ashr i32 [[A_SHL]], 1
635*67e74705SXin Li // CHECK: [[X_RVAL:%.+]] = sitofp i32 [[A_ASHR]] to x86_fp80
636*67e74705SXin Li // CHECK: [[SUB:%.+]] = fsub x86_fp80 [[X_RVAL]], [[EXPR]]
637*67e74705SXin Li // CHECK: [[CONV:%.+]] = fptosi x86_fp80 [[SUB]] to i32
638*67e74705SXin Li // CHECK: [[NEW_VAL:%.+]] = load i32, i32* [[TEMP1]],
639*67e74705SXin Li // CHECK: [[BF_VALUE:%.+]] = and i32 [[CONV]], 2147483647
640*67e74705SXin Li // CHECK: [[BF_CLEAR:%.+]] = and i32 [[NEW_VAL]], -2147483648
641*67e74705SXin Li // CHECK: or i32 [[BF_CLEAR]], [[BF_VALUE]]
642*67e74705SXin Li // CHECK: store i32 %{{.+}}, i32* [[TEMP1]]
643*67e74705SXin Li // CHECK: [[NEW_BF_VALUE:%.+]] = load i32, i32* [[TEMP1]]
644*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i32* bitcast (i8* getelementptr (i8, i8* bitcast (%struct.BitFields* @{{.+}} to i8*), i64 4) to i32*), i32 [[OLD_BF_VALUE]], i32 [[NEW_BF_VALUE]] monotonic monotonic
645*67e74705SXin Li // CHECK: [[FAILED_OLD_VAL]] = extractvalue { i32, i1 } [[RES]], 0
646*67e74705SXin Li // CHECK: [[FAIL_SUCCESS:%.+]] = extractvalue { i32, i1 } [[RES]], 1
647*67e74705SXin Li // CHECK: br i1 [[FAIL_SUCCESS]], label %[[EXIT:.+]], label %[[CONT]]
648*67e74705SXin Li // CHECK: [[EXIT]]
649*67e74705SXin Li #pragma omp atomic
650*67e74705SXin Li bfx.a = bfx.a - ldv;
651*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load x86_fp80, x86_fp80* @{{.+}}
652*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast i32* [[LDTEMP:%.+]] to i8*
653*67e74705SXin Li // CHECK: call void @__atomic_load(i64 4, i8* getelementptr (i8, i8* bitcast (%struct.BitFields_packed* @{{.+}} to i8*), i64 4), i8* [[BITCAST]], i32 0)
654*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
655*67e74705SXin Li // CHECK: [[CONT]]
656*67e74705SXin Li // CHECK: [[PREV_VALUE:%.+]] = load i32, i32* [[LDTEMP]]
657*67e74705SXin Li // CHECK: store i32 [[PREV_VALUE]], i32* [[TEMP1:%.+]],
658*67e74705SXin Li // CHECK: [[PREV_VALUE:%.+]] = load i32, i32* [[LDTEMP]]
659*67e74705SXin Li // CHECK: store i32 [[PREV_VALUE]], i32* [[TEMP:%.+]],
660*67e74705SXin Li // CHECK: [[A_LD:%.+]] = load i32, i32* [[TEMP]],
661*67e74705SXin Li // CHECK: [[A_SHL:%.+]] = shl i32 [[A_LD]], 1
662*67e74705SXin Li // CHECK: [[A_ASHR:%.+]] = ashr i32 [[A_SHL]], 1
663*67e74705SXin Li // CHECK: [[X_RVAL:%.+]] = sitofp i32 [[A_ASHR]] to x86_fp80
664*67e74705SXin Li // CHECK: [[MUL:%.+]] = fmul x86_fp80 [[X_RVAL]], [[EXPR]]
665*67e74705SXin Li // CHECK: [[CONV:%.+]] = fptosi x86_fp80 [[MUL]] to i32
666*67e74705SXin Li // CHECK: [[NEW_VAL:%.+]] = load i32, i32* [[TEMP1]],
667*67e74705SXin Li // CHECK: [[BF_VALUE:%.+]] = and i32 [[CONV]], 2147483647
668*67e74705SXin Li // CHECK: [[BF_CLEAR:%.+]] = and i32 [[NEW_VAL]], -2147483648
669*67e74705SXin Li // CHECK: or i32 [[BF_CLEAR]], [[BF_VALUE]]
670*67e74705SXin Li // CHECK: store i32 %{{.+}}, i32* [[TEMP1]]
671*67e74705SXin Li // CHECK: [[BITCAST_TEMP_OLD_BF_ADDR:%.+]] = bitcast i32* [[LDTEMP]] to i8*
672*67e74705SXin Li // CHECK: [[BITCAST_TEMP_NEW_BF_ADDR:%.+]] = bitcast i32* [[TEMP1]] to i8*
673*67e74705SXin Li // CHECK: [[FAIL_SUCCESS:%.+]] = call zeroext i1 @__atomic_compare_exchange(i64 4, i8* getelementptr (i8, i8* bitcast (%struct.BitFields_packed* @{{.+}} to i8*), i64 4), i8* [[BITCAST_TEMP_OLD_BF_ADDR]], i8* [[BITCAST_TEMP_NEW_BF_ADDR]], i32 0, i32 0)
674*67e74705SXin Li // CHECK: br i1 [[FAIL_SUCCESS]], label %[[EXIT:.+]], label %[[CONT]]
675*67e74705SXin Li // CHECK: [[EXIT]]
676*67e74705SXin Li #pragma omp atomic update
677*67e74705SXin Li bfx_packed.a *= ldv;
678*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load x86_fp80, x86_fp80* @{{.+}}
679*67e74705SXin Li // CHECK: [[PREV_VALUE:%.+]] = load atomic i32, i32* getelementptr inbounds (%struct.BitFields2, %struct.BitFields2* @{{.+}}, i32 0, i32 0) monotonic
680*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
681*67e74705SXin Li // CHECK: [[CONT]]
682*67e74705SXin Li // CHECK: [[OLD_BF_VALUE:%.+]] = phi i32 [ [[PREV_VALUE]], %[[EXIT]] ], [ [[FAILED_OLD_VAL:%.+]], %[[CONT]] ]
683*67e74705SXin Li // CHECK: store i32 [[OLD_BF_VALUE]], i32* [[TEMP1:%.+]],
684*67e74705SXin Li // CHECK: store i32 [[OLD_BF_VALUE]], i32* [[TEMP:%.+]],
685*67e74705SXin Li // CHECK: [[A_LD:%.+]] = load i32, i32* [[TEMP]],
686*67e74705SXin Li // CHECK: [[A_ASHR:%.+]] = ashr i32 [[A_LD]], 31
687*67e74705SXin Li // CHECK: [[X_RVAL:%.+]] = sitofp i32 [[A_ASHR]] to x86_fp80
688*67e74705SXin Li // CHECK: [[SUB:%.+]] = fsub x86_fp80 [[X_RVAL]], [[EXPR]]
689*67e74705SXin Li // CHECK: [[CONV:%.+]] = fptosi x86_fp80 [[SUB]] to i32
690*67e74705SXin Li // CHECK: [[NEW_VAL:%.+]] = load i32, i32* [[TEMP1]],
691*67e74705SXin Li // CHECK: [[BF_AND:%.+]] = and i32 [[CONV]], 1
692*67e74705SXin Li // CHECK: [[BF_VALUE:%.+]] = shl i32 [[BF_AND]], 31
693*67e74705SXin Li // CHECK: [[BF_CLEAR:%.+]] = and i32 [[NEW_VAL]], 2147483647
694*67e74705SXin Li // CHECK: or i32 [[BF_CLEAR]], [[BF_VALUE]]
695*67e74705SXin Li // CHECK: store i32 %{{.+}}, i32* [[TEMP1]]
696*67e74705SXin Li // CHECK: [[NEW_BF_VALUE:%.+]] = load i32, i32* [[TEMP1]]
697*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i32* getelementptr inbounds (%struct.BitFields2, %struct.BitFields2* @{{.+}}, i32 0, i32 0), i32 [[OLD_BF_VALUE]], i32 [[NEW_BF_VALUE]] monotonic monotonic
698*67e74705SXin Li // CHECK: [[FAILED_OLD_VAL]] = extractvalue { i32, i1 } [[RES]], 0
699*67e74705SXin Li // CHECK: [[FAIL_SUCCESS:%.+]] = extractvalue { i32, i1 } [[RES]], 1
700*67e74705SXin Li // CHECK: br i1 [[FAIL_SUCCESS]], label %[[EXIT:.+]], label %[[CONT]]
701*67e74705SXin Li // CHECK: [[EXIT]]
702*67e74705SXin Li #pragma omp atomic
703*67e74705SXin Li bfx2.a -= ldv;
704*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load x86_fp80, x86_fp80* @{{.+}}
705*67e74705SXin Li // CHECK: [[PREV_VALUE:%.+]] = load atomic i8, i8* getelementptr (i8, i8* bitcast (%struct.BitFields2_packed* @{{.+}} to i8*), i64 3) monotonic
706*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
707*67e74705SXin Li // CHECK: [[CONT]]
708*67e74705SXin Li // CHECK: [[OLD_BF_VALUE:%.+]] = phi i8 [ [[PREV_VALUE]], %[[EXIT]] ], [ [[FAILED_OLD_VAL:%.+]], %[[CONT]] ]
709*67e74705SXin Li // CHECK: [[BITCAST1:%.+]] = bitcast i32* %{{.+}} to i8*
710*67e74705SXin Li // CHECK: store i8 [[OLD_BF_VALUE]], i8* [[BITCAST1]],
711*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast i32* %{{.+}} to i8*
712*67e74705SXin Li // CHECK: store i8 [[OLD_BF_VALUE]], i8* [[BITCAST]],
713*67e74705SXin Li // CHECK: [[A_LD:%.+]] = load i8, i8* [[BITCAST]],
714*67e74705SXin Li // CHECK: [[A_ASHR:%.+]] = ashr i8 [[A_LD]], 7
715*67e74705SXin Li // CHECK: [[CAST:%.+]] = sext i8 [[A_ASHR]] to i32
716*67e74705SXin Li // CHECK: [[X_RVAL:%.+]] = sitofp i32 [[CAST]] to x86_fp80
717*67e74705SXin Li // CHECK: [[DIV:%.+]] = fdiv x86_fp80 [[EXPR]], [[X_RVAL]]
718*67e74705SXin Li // CHECK: [[NEW_VAL:%.+]] = fptosi x86_fp80 [[DIV]] to i32
719*67e74705SXin Li // CHECK: [[TRUNC:%.+]] = trunc i32 [[NEW_VAL]] to i8
720*67e74705SXin Li // CHECK: [[BF_LD:%.+]] = load i8, i8* [[BITCAST1]],
721*67e74705SXin Li // CHECK: [[BF_AND:%.+]] = and i8 [[TRUNC]], 1
722*67e74705SXin Li // CHECK: [[BF_VALUE:%.+]] = shl i8 [[BF_AND]], 7
723*67e74705SXin Li // CHECK: [[BF_CLEAR:%.+]] = and i8 %{{.+}}, 127
724*67e74705SXin Li // CHECK: or i8 [[BF_CLEAR]], [[BF_VALUE]]
725*67e74705SXin Li // CHECK: store i8 %{{.+}}, i8* [[BITCAST1]]
726*67e74705SXin Li // CHECK: [[NEW_BF_VALUE:%.+]] = load i8, i8* [[BITCAST1]]
727*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i8* getelementptr (i8, i8* bitcast (%struct.BitFields2_packed* @{{.+}} to i8*), i64 3), i8 [[OLD_BF_VALUE]], i8 [[NEW_BF_VALUE]] monotonic monotonic
728*67e74705SXin Li // CHECK: [[FAILED_OLD_VAL]] = extractvalue { i8, i1 } [[RES]], 0
729*67e74705SXin Li // CHECK: [[FAIL_SUCCESS:%.+]] = extractvalue { i8, i1 } [[RES]], 1
730*67e74705SXin Li // CHECK: br i1 [[FAIL_SUCCESS]], label %[[EXIT:.+]], label %[[CONT]]
731*67e74705SXin Li // CHECK: [[EXIT]]
732*67e74705SXin Li #pragma omp atomic update
733*67e74705SXin Li bfx2_packed.a = ldv / bfx2_packed.a;
734*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load x86_fp80, x86_fp80* @{{.+}}
735*67e74705SXin Li // CHECK: [[PREV_VALUE:%.+]] = load atomic i32, i32* getelementptr inbounds (%struct.BitFields3, %struct.BitFields3* @{{.+}}, i32 0, i32 0) monotonic
736*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
737*67e74705SXin Li // CHECK: [[CONT]]
738*67e74705SXin Li // CHECK: [[OLD_BF_VALUE:%.+]] = phi i32 [ [[PREV_VALUE]], %[[EXIT]] ], [ [[FAILED_OLD_VAL:%.+]], %[[CONT]] ]
739*67e74705SXin Li // CHECK: store i32 [[OLD_BF_VALUE]], i32* [[TEMP1:%.+]],
740*67e74705SXin Li // CHECK: store i32 [[OLD_BF_VALUE]], i32* [[TEMP:%.+]],
741*67e74705SXin Li // CHECK: [[A_LD:%.+]] = load i32, i32* [[TEMP]],
742*67e74705SXin Li // CHECK: [[A_SHL:%.+]] = shl i32 [[A_LD]], 7
743*67e74705SXin Li // CHECK: [[A_ASHR:%.+]] = ashr i32 [[A_SHL]], 18
744*67e74705SXin Li // CHECK: [[X_RVAL:%.+]] = sitofp i32 [[A_ASHR]] to x86_fp80
745*67e74705SXin Li // CHECK: [[DIV:%.+]] = fdiv x86_fp80 [[X_RVAL]], [[EXPR]]
746*67e74705SXin Li // CHECK: [[NEW_VAL:%.+]] = fptosi x86_fp80 [[DIV]] to i32
747*67e74705SXin Li // CHECK: [[BF_LD:%.+]] = load i32, i32* [[TEMP1]],
748*67e74705SXin Li // CHECK: [[BF_AND:%.+]] = and i32 [[NEW_VAL]], 16383
749*67e74705SXin Li // CHECK: [[BF_VALUE:%.+]] = shl i32 [[BF_AND]], 11
750*67e74705SXin Li // CHECK: [[BF_CLEAR:%.+]] = and i32 %{{.+}}, -33552385
751*67e74705SXin Li // CHECK: or i32 [[BF_CLEAR]], [[BF_VALUE]]
752*67e74705SXin Li // CHECK: store i32 %{{.+}}, i32* [[TEMP1]]
753*67e74705SXin Li // CHECK: [[NEW_BF_VALUE:%.+]] = load i32, i32* [[TEMP1]]
754*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i32* getelementptr inbounds (%struct.BitFields3, %struct.BitFields3* @{{.+}}, i32 0, i32 0), i32 [[OLD_BF_VALUE]], i32 [[NEW_BF_VALUE]] monotonic monotonic
755*67e74705SXin Li // CHECK: [[FAILED_OLD_VAL]] = extractvalue { i32, i1 } [[RES]], 0
756*67e74705SXin Li // CHECK: [[FAIL_SUCCESS:%.+]] = extractvalue { i32, i1 } [[RES]], 1
757*67e74705SXin Li // CHECK: br i1 [[FAIL_SUCCESS]], label %[[EXIT:.+]], label %[[CONT]]
758*67e74705SXin Li // CHECK: [[EXIT]]
759*67e74705SXin Li #pragma omp atomic
760*67e74705SXin Li bfx3.a /= ldv;
761*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load x86_fp80, x86_fp80* @{{.+}}
762*67e74705SXin Li // CHECK: [[LDTEMP:%.+]] = bitcast i32* %{{.+}} to i24*
763*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast i24* %{{.+}} to i8*
764*67e74705SXin Li // CHECK: call void @__atomic_load(i64 3, i8* getelementptr (i8, i8* bitcast (%struct.BitFields3_packed* @{{.+}} to i8*), i64 1), i8* [[BITCAST]], i32 0)
765*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
766*67e74705SXin Li // CHECK: [[CONT]]
767*67e74705SXin Li // CHECK: [[PREV_VALUE:%.+]] = load i24, i24* [[LDTEMP]]
768*67e74705SXin Li // CHECK: store i24 [[PREV_VALUE]], i24* [[TEMP1:%.+]],
769*67e74705SXin Li // CHECK: [[PREV_VALUE:%.+]] = load i24, i24* [[LDTEMP]]
770*67e74705SXin Li // CHECK: store i24 [[PREV_VALUE]], i24* [[TEMP:%.+]],
771*67e74705SXin Li // CHECK: [[A_LD:%.+]] = load i24, i24* [[TEMP]],
772*67e74705SXin Li // CHECK: [[A_SHL:%.+]] = shl i24 [[A_LD]], 7
773*67e74705SXin Li // CHECK: [[A_ASHR:%.+]] = ashr i24 [[A_SHL]], 10
774*67e74705SXin Li // CHECK: [[CAST:%.+]] = sext i24 [[A_ASHR]] to i32
775*67e74705SXin Li // CHECK: [[X_RVAL:%.+]] = sitofp i32 [[CAST]] to x86_fp80
776*67e74705SXin Li // CHECK: [[ADD:%.+]] = fadd x86_fp80 [[X_RVAL]], [[EXPR]]
777*67e74705SXin Li // CHECK: [[NEW_VAL:%.+]] = fptosi x86_fp80 [[ADD]] to i32
778*67e74705SXin Li // CHECK: [[TRUNC:%.+]] = trunc i32 [[NEW_VAL]] to i24
779*67e74705SXin Li // CHECK: [[BF_LD:%.+]] = load i24, i24* [[TEMP1]],
780*67e74705SXin Li // CHECK: [[BF_AND:%.+]] = and i24 [[TRUNC]], 16383
781*67e74705SXin Li // CHECK: [[BF_VALUE:%.+]] = shl i24 [[BF_AND]], 3
782*67e74705SXin Li // CHECK: [[BF_CLEAR:%.+]] = and i24 [[BF_LD]], -131065
783*67e74705SXin Li // CHECK: or i24 [[BF_CLEAR]], [[BF_VALUE]]
784*67e74705SXin Li // CHECK: store i24 %{{.+}}, i24* [[TEMP1]]
785*67e74705SXin Li // CHECK: [[BITCAST_TEMP_OLD_BF_ADDR:%.+]] = bitcast i24* [[LDTEMP]] to i8*
786*67e74705SXin Li // CHECK: [[BITCAST_TEMP_NEW_BF_ADDR:%.+]] = bitcast i24* [[TEMP1]] to i8*
787*67e74705SXin Li // CHECK: [[FAIL_SUCCESS:%.+]] = call zeroext i1 @__atomic_compare_exchange(i64 3, i8* getelementptr (i8, i8* bitcast (%struct.BitFields3_packed* @{{.+}} to i8*), i64 1), i8* [[BITCAST_TEMP_OLD_BF_ADDR]], i8* [[BITCAST_TEMP_NEW_BF_ADDR]], i32 0, i32 0)
788*67e74705SXin Li // CHECK: br i1 [[FAIL_SUCCESS]], label %[[EXIT:.+]], label %[[CONT]]
789*67e74705SXin Li // CHECK: [[EXIT]]
790*67e74705SXin Li #pragma omp atomic update
791*67e74705SXin Li bfx3_packed.a += ldv;
792*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load x86_fp80, x86_fp80* @{{.+}}
793*67e74705SXin Li // CHECK: [[PREV_VALUE:%.+]] = load atomic i64, i64* bitcast (%struct.BitFields4* @{{.+}} to i64*) monotonic
794*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
795*67e74705SXin Li // CHECK: [[CONT]]
796*67e74705SXin Li // CHECK: [[OLD_BF_VALUE:%.+]] = phi i64 [ [[PREV_VALUE]], %[[EXIT]] ], [ [[FAILED_OLD_VAL:%.+]], %[[CONT]] ]
797*67e74705SXin Li // CHECK: store i64 [[OLD_BF_VALUE]], i64* [[TEMP1:%.+]],
798*67e74705SXin Li // CHECK: store i64 [[OLD_BF_VALUE]], i64* [[TEMP:%.+]],
799*67e74705SXin Li // CHECK: [[A_LD:%.+]] = load i64, i64* [[TEMP]],
800*67e74705SXin Li // CHECK: [[A_SHL:%.+]] = shl i64 [[A_LD]], 47
801*67e74705SXin Li // CHECK: [[A_ASHR:%.+]] = ashr i64 [[A_SHL:%.+]], 63
802*67e74705SXin Li // CHECK: [[A_CAST:%.+]] = trunc i64 [[A_ASHR:%.+]] to i32
803*67e74705SXin Li // CHECK: [[X_RVAL:%.+]] = sitofp i32 [[CAST:%.+]] to x86_fp80
804*67e74705SXin Li // CHECK: [[MUL:%.+]] = fmul x86_fp80 [[X_RVAL]], [[EXPR]]
805*67e74705SXin Li // CHECK: [[NEW_VAL:%.+]] = fptosi x86_fp80 [[MUL]] to i32
806*67e74705SXin Li // CHECK: [[ZEXT:%.+]] = zext i32 [[NEW_VAL]] to i64
807*67e74705SXin Li // CHECK: [[BF_LD:%.+]] = load i64, i64* [[TEMP1]],
808*67e74705SXin Li // CHECK: [[BF_AND:%.+]] = and i64 [[ZEXT]], 1
809*67e74705SXin Li // CHECK: [[BF_VALUE:%.+]] = shl i64 [[BF_AND]], 16
810*67e74705SXin Li // CHECK: [[BF_CLEAR:%.+]] = and i64 [[BF_LD]], -65537
811*67e74705SXin Li // CHECK: or i64 [[BF_CLEAR]], [[BF_VALUE]]
812*67e74705SXin Li // CHECK: store i64 %{{.+}}, i64* [[TEMP1]]
813*67e74705SXin Li // CHECK: [[NEW_BF_VALUE:%.+]] = load i64, i64* [[TEMP1]]
814*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i64* bitcast (%struct.BitFields4* @{{.+}} to i64*), i64 [[OLD_BF_VALUE]], i64 [[NEW_BF_VALUE]] monotonic monotonic
815*67e74705SXin Li // CHECK: [[FAILED_OLD_VAL]] = extractvalue { i64, i1 } [[RES]], 0
816*67e74705SXin Li // CHECK: [[FAIL_SUCCESS:%.+]] = extractvalue { i64, i1 } [[RES]], 1
817*67e74705SXin Li // CHECK: br i1 [[FAIL_SUCCESS]], label %[[EXIT:.+]], label %[[CONT]]
818*67e74705SXin Li // CHECK: [[EXIT]]
819*67e74705SXin Li #pragma omp atomic
820*67e74705SXin Li bfx4.a = bfx4.a * ldv;
821*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load x86_fp80, x86_fp80* @{{.+}}
822*67e74705SXin Li // CHECK: [[PREV_VALUE:%.+]] = load atomic i8, i8* getelementptr inbounds (%struct.BitFields4_packed, %struct.BitFields4_packed* @{{.+}}, i32 0, i32 0, i64 2) monotonic
823*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
824*67e74705SXin Li // CHECK: [[CONT]]
825*67e74705SXin Li // CHECK: [[OLD_BF_VALUE:%.+]] = phi i8 [ [[PREV_VALUE]], %{{.+}} ], [ [[FAILED_OLD_VAL:%.+]], %[[CONT]] ]
826*67e74705SXin Li // CHECK: [[BITCAST1:%.+]] = bitcast i32* %{{.+}} to i8*
827*67e74705SXin Li // CHECK: store i8 [[OLD_BF_VALUE]], i8* [[BITCAST1]],
828*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast i32* %{{.+}} to i8*
829*67e74705SXin Li // CHECK: store i8 [[OLD_BF_VALUE]], i8* [[BITCAST]],
830*67e74705SXin Li // CHECK: [[A_LD:%.+]] = load i8, i8* [[BITCAST]],
831*67e74705SXin Li // CHECK: [[A_SHL:%.+]] = shl i8 [[A_LD]], 7
832*67e74705SXin Li // CHECK: [[A_ASHR:%.+]] = ashr i8 [[A_SHL:%.+]], 7
833*67e74705SXin Li // CHECK: [[CAST:%.+]] = sext i8 [[A_ASHR:%.+]] to i32
834*67e74705SXin Li // CHECK: [[CONV:%.+]] = sitofp i32 [[CAST]] to x86_fp80
835*67e74705SXin Li // CHECK: [[SUB: %.+]] = fsub x86_fp80 [[CONV]], [[EXPR]]
836*67e74705SXin Li // CHECK: [[CONV:%.+]] = fptosi x86_fp80 [[SUB:%.+]] to i32
837*67e74705SXin Li // CHECK: [[NEW_VAL:%.+]] = trunc i32 [[CONV]] to i8
838*67e74705SXin Li // CHECK: [[BF_LD:%.+]] = load i8, i8* [[BITCAST1]],
839*67e74705SXin Li // CHECK: [[BF_VALUE:%.+]] = and i8 [[NEW_VAL]], 1
840*67e74705SXin Li // CHECK: [[BF_CLEAR:%.+]] = and i8 [[BF_LD]], -2
841*67e74705SXin Li // CHECK: or i8 [[BF_CLEAR]], [[BF_VALUE]]
842*67e74705SXin Li // CHECK: store i8 %{{.+}}, i8* [[BITCAST1]]
843*67e74705SXin Li // CHECK: [[NEW_BF_VALUE:%.+]] = load i8, i8* [[BITCAST1]]
844*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i8* getelementptr inbounds (%struct.BitFields4_packed, %struct.BitFields4_packed* @{{.+}}, i32 0, i32 0, i64 2), i8 [[OLD_BF_VALUE]], i8 [[NEW_BF_VALUE]] monotonic monotonic
845*67e74705SXin Li // CHECK: [[FAILED_OLD_VAL]] = extractvalue { i8, i1 } [[RES]], 0
846*67e74705SXin Li // CHECK: [[FAIL_SUCCESS:%.+]] = extractvalue { i8, i1 } [[RES]], 1
847*67e74705SXin Li // CHECK: br i1 [[FAIL_SUCCESS]], label %[[EXIT:.+]], label %[[CONT]]
848*67e74705SXin Li // CHECK: [[EXIT]]
849*67e74705SXin Li #pragma omp atomic update
850*67e74705SXin Li bfx4_packed.a -= ldv;
851*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load x86_fp80, x86_fp80* @{{.+}}
852*67e74705SXin Li // CHECK: [[PREV_VALUE:%.+]] = load atomic i64, i64* bitcast (%struct.BitFields4* @{{.+}} to i64*) monotonic
853*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
854*67e74705SXin Li // CHECK: [[CONT]]
855*67e74705SXin Li // CHECK: [[OLD_BF_VALUE:%.+]] = phi i64 [ [[PREV_VALUE]], %[[EXIT]] ], [ [[FAILED_OLD_VAL:%.+]], %[[CONT]] ]
856*67e74705SXin Li // CHECK: store i64 [[OLD_BF_VALUE]], i64* [[TEMP1:%.+]],
857*67e74705SXin Li // CHECK: store i64 [[OLD_BF_VALUE]], i64* [[TEMP:%.+]],
858*67e74705SXin Li // CHECK: [[A_LD:%.+]] = load i64, i64* [[TEMP]],
859*67e74705SXin Li // CHECK: [[A_SHL:%.+]] = shl i64 [[A_LD]], 40
860*67e74705SXin Li // CHECK: [[A_ASHR:%.+]] = ashr i64 [[A_SHL:%.+]], 57
861*67e74705SXin Li // CHECK: [[CONV:%.+]] = sitofp i64 [[A_ASHR]] to x86_fp80
862*67e74705SXin Li // CHECK: [[DIV:%.+]] = fdiv x86_fp80 [[CONV]], [[EXPR]]
863*67e74705SXin Li // CHECK: [[CONV:%.+]] = fptosi x86_fp80 [[DIV]] to i64
864*67e74705SXin Li // CHECK: [[BF_LD:%.+]] = load i64, i64* [[TEMP1]],
865*67e74705SXin Li // CHECK: [[BF_AND:%.+]] = and i64 [[CONV]], 127
866*67e74705SXin Li // CHECK: [[BF_VALUE:%.+]] = shl i64 [[BF_AND:%.+]], 17
867*67e74705SXin Li // CHECK: [[BF_CLEAR:%.+]] = and i64 [[BF_LD]], -16646145
868*67e74705SXin Li // CHECK: [[VAL:%.+]] = or i64 [[BF_CLEAR]], [[BF_VALUE]]
869*67e74705SXin Li // CHECK: store i64 [[VAL]], i64* [[TEMP1]]
870*67e74705SXin Li // CHECK: [[NEW_BF_VALUE:%.+]] = load i64, i64* [[TEMP1]]
871*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i64* bitcast (%struct.BitFields4* @{{.+}} to i64*), i64 [[OLD_BF_VALUE]], i64 [[NEW_BF_VALUE]] monotonic monotonic
872*67e74705SXin Li // CHECK: [[FAILED_OLD_VAL]] = extractvalue { i64, i1 } [[RES]], 0
873*67e74705SXin Li // CHECK: [[FAIL_SUCCESS:%.+]] = extractvalue { i64, i1 } [[RES]], 1
874*67e74705SXin Li // CHECK: br i1 [[FAIL_SUCCESS]], label %[[EXIT:.+]], label %[[CONT]]
875*67e74705SXin Li // CHECK: [[EXIT]]
876*67e74705SXin Li #pragma omp atomic
877*67e74705SXin Li bfx4.b /= ldv;
878*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load x86_fp80, x86_fp80* @{{.+}}
879*67e74705SXin Li // CHECK: [[PREV_VALUE:%.+]] = load atomic i8, i8* getelementptr inbounds (%struct.BitFields4_packed, %struct.BitFields4_packed* @{{.+}}, i32 0, i32 0, i64 2) monotonic
880*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
881*67e74705SXin Li // CHECK: [[CONT]]
882*67e74705SXin Li // CHECK: [[OLD_BF_VALUE:%.+]] = phi i8 [ [[PREV_VALUE]], %[[EXIT]] ], [ [[FAILED_OLD_VAL:%.+]], %[[CONT]] ]
883*67e74705SXin Li // CHECK: [[BITCAST1:%.+]] = bitcast i64* %{{.+}} to i8*
884*67e74705SXin Li // CHECK: store i8 [[OLD_BF_VALUE]], i8* [[BITCAST1]],
885*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast i64* %{{.+}} to i8*
886*67e74705SXin Li // CHECK: store i8 [[OLD_BF_VALUE]], i8* [[BITCAST]],
887*67e74705SXin Li // CHECK: [[A_LD:%.+]] = load i8, i8* [[BITCAST]],
888*67e74705SXin Li // CHECK: [[A_ASHR:%.+]] = ashr i8 [[A_LD]], 1
889*67e74705SXin Li // CHECK: [[CAST:%.+]] = sext i8 [[A_ASHR]] to i64
890*67e74705SXin Li // CHECK: [[CONV:%.+]] = sitofp i64 [[CAST]] to x86_fp80
891*67e74705SXin Li // CHECK: [[ADD:%.+]] = fadd x86_fp80 [[CONV]], [[EXPR]]
892*67e74705SXin Li // CHECK: [[NEW_VAL:%.+]] = fptosi x86_fp80 [[ADD]] to i64
893*67e74705SXin Li // CHECK: [[TRUNC:%.+]] = trunc i64 [[NEW_VAL]] to i8
894*67e74705SXin Li // CHECK: [[BF_LD:%.+]] = load i8, i8* [[BITCAST1]],
895*67e74705SXin Li // CHECK: [[BF_AND:%.+]] = and i8 [[TRUNC]], 127
896*67e74705SXin Li // CHECK: [[BF_VALUE:%.+]] = shl i8 [[BF_AND]], 1
897*67e74705SXin Li // CHECK: [[BF_CLEAR:%.+]] = and i8 [[BF_LD]], 1
898*67e74705SXin Li // CHECK: or i8 [[BF_CLEAR]], [[BF_VALUE]]
899*67e74705SXin Li // CHECK: store i8 %{{.+}}, i8* [[BITCAST1]]
900*67e74705SXin Li // CHECK: [[NEW_BF_VALUE:%.+]] = load i8, i8* [[BITCAST1]]
901*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i8* getelementptr inbounds (%struct.BitFields4_packed, %struct.BitFields4_packed* @{{.+}}, i32 0, i32 0, i64 2), i8 [[OLD_BF_VALUE]], i8 [[NEW_BF_VALUE]] monotonic monotonic
902*67e74705SXin Li // CHECK: [[FAILED_OLD_VAL]] = extractvalue { i8, i1 } [[RES]], 0
903*67e74705SXin Li // CHECK: [[FAIL_SUCCESS:%.+]] = extractvalue { i8, i1 } [[RES]], 1
904*67e74705SXin Li // CHECK: br i1 [[FAIL_SUCCESS]], label %[[EXIT:.+]], label %[[CONT]]
905*67e74705SXin Li // CHECK: [[EXIT]]
906*67e74705SXin Li #pragma omp atomic update
907*67e74705SXin Li bfx4_packed.b += ldv;
908*67e74705SXin Li // CHECK: load i64, i64*
909*67e74705SXin Li // CHECK: [[EXPR:%.+]] = uitofp i64 %{{.+}} to float
910*67e74705SXin Li // CHECK: [[I64VAL:%.+]] = load atomic i64, i64* bitcast (<2 x float>* [[DEST:@.+]] to i64*) monotonic
911*67e74705SXin Li // CHECK: br label %[[CONT:.+]]
912*67e74705SXin Li // CHECK: [[CONT]]
913*67e74705SXin Li // CHECK: [[OLD_I64:%.+]] = phi i64 [ [[I64VAL]], %{{.+}} ], [ [[FAILED_I64_OLD_VAL:%.+]], %[[CONT]] ]
914*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast <2 x float>* [[TEMP:%.+]] to i64*
915*67e74705SXin Li // CHECK: store i64 [[OLD_I64]], i64* [[BITCAST]],
916*67e74705SXin Li // CHECK: [[OLD_VEC_VAL:%.+]] = bitcast i64 [[OLD_I64]] to <2 x float>
917*67e74705SXin Li // CHECK: store <2 x float> [[OLD_VEC_VAL]], <2 x float>* [[LDTEMP:%.+]],
918*67e74705SXin Li // CHECK: [[VEC_VAL:%.+]] = load <2 x float>, <2 x float>* [[LDTEMP]]
919*67e74705SXin Li // CHECK: [[X:%.+]] = extractelement <2 x float> [[VEC_VAL]], i64 0
920*67e74705SXin Li // CHECK: [[VEC_ITEM_VAL:%.+]] = fsub float [[EXPR]], [[X]]
921*67e74705SXin Li // CHECK: [[VEC_VAL:%.+]] = load <2 x float>, <2 x float>* [[TEMP]],
922*67e74705SXin Li // CHECK: [[NEW_VEC_VAL:%.+]] = insertelement <2 x float> [[VEC_VAL]], float [[VEC_ITEM_VAL]], i64 0
923*67e74705SXin Li // CHECK: store <2 x float> [[NEW_VEC_VAL]], <2 x float>* [[TEMP]]
924*67e74705SXin Li // CHECK: [[NEW_I64:%.+]] = load i64, i64* [[BITCAST]]
925*67e74705SXin Li // CHECK: [[RES:%.+]] = cmpxchg i64* bitcast (<2 x float>* [[DEST]] to i64*), i64 [[OLD_I64]], i64 [[NEW_I64]] monotonic monotonic
926*67e74705SXin Li // CHECK: [[FAILED_I64_OLD_VAL:%.+]] = extractvalue { i64, i1 } [[RES]], 0
927*67e74705SXin Li // CHECK: [[FAIL_SUCCESS:%.+]] = extractvalue { i64, i1 } [[RES]], 1
928*67e74705SXin Li // CHECK: br i1 [[FAIL_SUCCESS]], label %[[EXIT:.+]], label %[[CONT]]
929*67e74705SXin Li // CHECK: [[EXIT]]
930*67e74705SXin Li #pragma omp atomic
931*67e74705SXin Li float2x.x = ulv - float2x.x;
932*67e74705SXin Li // CHECK: [[EXPR:%.+]] = load double, double* @{{.+}},
933*67e74705SXin Li // CHECK: [[OLD_VAL:%.+]] = call i32 @llvm.read_register.i32([[REG:metadata ![0-9]+]])
934*67e74705SXin Li // CHECK: [[X_RVAL:%.+]] = sitofp i32 [[OLD_VAL]] to double
935*67e74705SXin Li // CHECK: [[DIV:%.+]] = fdiv double [[EXPR]], [[X_RVAL]]
936*67e74705SXin Li // CHECK: [[NEW_VAL:%.+]] = fptosi double [[DIV]] to i32
937*67e74705SXin Li // CHECK: call void @llvm.write_register.i32([[REG]], i32 [[NEW_VAL]])
938*67e74705SXin Li // CHECK: call{{.*}} @__kmpc_flush(
939*67e74705SXin Li #pragma omp atomic seq_cst
940*67e74705SXin Li rix = dv / rix;
941*67e74705SXin Li return 0;
942*67e74705SXin Li }
943*67e74705SXin Li
944*67e74705SXin Li #endif
945