xref: /minix3/external/bsd/llvm/dist/clang/test/CodeGen/x86-atomic-long_double.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc // RUN: %clang_cc1 -triple x86_64-linux-gnu -target-cpu core2 %s -S -emit-llvm -o - | FileCheck %s
2*0a6a1f1dSLionel Sambuc // RUN: %clang_cc1 -triple i686-linux-gnu -target-cpu core2 %s -S -emit-llvm -o - | FileCheck -check-prefix=CHECK32 %s
3*0a6a1f1dSLionel Sambuc 
testinc(_Atomic long double * addr)4*0a6a1f1dSLionel Sambuc long double testinc(_Atomic long double *addr) {
5*0a6a1f1dSLionel Sambuc   // CHECK-LABEL: @testinc
6*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80* %{{.+}}, x86_fp80** [[ADDR_ADDR:%.+]], align 8
7*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR:%.+]] = load x86_fp80** [[ADDR_ADDR]], align 8
8*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_ADDR:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
9*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_VALUE:%.+]] = load atomic i128* [[INT_ADDR]] seq_cst, align 16
10*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_LOAD_ADDR:%.+]] = bitcast x86_fp80* [[LD_ADDR:%.+]] to i128*
11*0a6a1f1dSLionel Sambuc   // CHECK: store i128 [[INT_VALUE]], i128* [[INT_LOAD_ADDR]], align 16
12*0a6a1f1dSLionel Sambuc   // CHECK: [[LD_VALUE:%.+]] = load x86_fp80* [[LD_ADDR]], align 16
13*0a6a1f1dSLionel Sambuc   // CHECK: br label %[[ATOMIC_OP:.+]]
14*0a6a1f1dSLionel Sambuc   // CHECK: [[ATOMIC_OP]]
15*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE:%.+]] = phi x86_fp80 [ [[LD_VALUE]], %{{.+}} ], [ [[LD_VALUE:%.+]], %[[ATOMIC_OP]] ]
16*0a6a1f1dSLionel Sambuc   // CHECK: [[INC_VALUE:%.+]] = fadd x86_fp80 [[OLD_VALUE]],
17*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR:%.+]] to i8*
18*0a6a1f1dSLionel Sambuc   // CHECK: call void @llvm.memset.p0i8.i64(i8* [[OLD_VALUE_VOID_ADDR]], i8 0, i64 16, i32 16, i1 false)
19*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80 [[OLD_VALUE]], x86_fp80* [[OLD_VALUE_ADDR]], align 16
20*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_INT_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR]] to i128*
21*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_INT:%.+]] = load i128* [[OLD_INT_ADDR]], align 16
22*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[NEW_VALUE_ADDR:%.+]] to i8*
23*0a6a1f1dSLionel Sambuc   // CHECK: call void @llvm.memset.p0i8.i64(i8* [[NEW_VALUE_VOID_ADDR]], i8 0, i64 16, i32 16, i1 false)
24*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80 [[INC_VALUE]], x86_fp80* [[NEW_VALUE_ADDR]], align 16
25*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_INT_ADDR:%.+]] = bitcast x86_fp80* [[NEW_VALUE_ADDR]] to i128*
26*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_INT:%.+]] = load i128* [[NEW_INT_ADDR]], align 16
27*0a6a1f1dSLionel Sambuc   // CHECK: [[OBJ_INT_ADDR:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
28*0a6a1f1dSLionel Sambuc   // CHECK: [[RES:%.+]] = cmpxchg i128* [[OBJ_INT_ADDR]], i128 [[OLD_INT]], i128 [[NEW_INT]] seq_cst seq_cst
29*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE:%.+]] = extractvalue { i128, i1 } [[RES]], 0
30*0a6a1f1dSLionel Sambuc   // CHECK: [[FAIL_SUCCESS:%.+]] = extractvalue { i128, i1 } [[RES]], 1
31*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE_RES_INT_PTR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_RES_PTR:%.+]] to i128*
32*0a6a1f1dSLionel Sambuc   // CHECK: store i128 [[OLD_VALUE]], i128* [[OLD_VALUE_RES_INT_PTR]], align 16
33*0a6a1f1dSLionel Sambuc   // CHECK: [[LD_VALUE]] = load x86_fp80* [[OLD_VALUE_RES_PTR]], align 16
34*0a6a1f1dSLionel Sambuc   // CHECK: br i1 [[FAIL_SUCCESS]], label %[[ATOMIC_CONT:.+]], label %[[ATOMIC_OP]]
35*0a6a1f1dSLionel Sambuc   // CHECK: [[ATOMIC_CONT]]
36*0a6a1f1dSLionel Sambuc   // CHECK: ret x86_fp80 [[INC_VALUE]]
37*0a6a1f1dSLionel Sambuc   // CHECK32-LABEL: @testinc
38*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80* %{{.+}}, x86_fp80** [[ADDR_ADDR:%.+]], align 4
39*0a6a1f1dSLionel Sambuc   // CHECK32: [[ADDR:%.+]] = load x86_fp80** [[ADDR_ADDR]], align 4
40*0a6a1f1dSLionel Sambuc   // CHECK32: [[VOID_PTR:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
41*0a6a1f1dSLionel Sambuc   // CHECK32: [[TEMP_LD_PTR:%.+]] = bitcast x86_fp80* [[TEMP_LD_ADDR:%.+]] to i8*
42*0a6a1f1dSLionel Sambuc   // CHECK32: call void @__atomic_load(i32 12, i8* [[VOID_PTR]], i8* [[TEMP_LD_PTR]], i32 5)
43*0a6a1f1dSLionel Sambuc   // CHECK32: [[LD_VALUE:%.+]] = load x86_fp80* [[TEMP_LD_ADDR]], align 4
44*0a6a1f1dSLionel Sambuc   // CHECK32: br label %[[ATOMIC_OP:.+]]
45*0a6a1f1dSLionel Sambuc   // CHECK32: [[ATOMIC_OP]]
46*0a6a1f1dSLionel Sambuc   // CHECK32: [[OLD_VALUE:%.+]] = phi x86_fp80 [ [[LD_VALUE]], %{{.+}} ], [ [[LD_VALUE:%.+]], %[[ATOMIC_OP]] ]
47*0a6a1f1dSLionel Sambuc   // CHECK32: [[INC_VALUE:%.+]] = fadd x86_fp80 [[OLD_VALUE]],
48*0a6a1f1dSLionel Sambuc   // CHECK32: [[OLD_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR:%.+]] to i8*
49*0a6a1f1dSLionel Sambuc   // CHECK32: call void @llvm.memset.p0i8.i64(i8* [[OLD_VALUE_VOID_ADDR]], i8 0, i64 12, i32 4, i1 false)
50*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80 [[OLD_VALUE]], x86_fp80* [[OLD_VALUE_ADDR]], align 4
51*0a6a1f1dSLionel Sambuc   // CHECK32: [[DESIRED_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[DESIRED_VALUE_ADDR:%.+]] to i8*
52*0a6a1f1dSLionel Sambuc   // CHECK32: call void @llvm.memset.p0i8.i64(i8* [[DESIRED_VALUE_VOID_ADDR]], i8 0, i64 12, i32 4, i1 false)
53*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80 [[INC_VALUE]], x86_fp80* [[DESIRED_VALUE_ADDR]], align 4
54*0a6a1f1dSLionel Sambuc   // CHECK32: [[OBJ:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
55*0a6a1f1dSLionel Sambuc   // CHECK32: [[EXPECTED:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR]] to i8*
56*0a6a1f1dSLionel Sambuc   // CHECK32: [[DESIRED:%.+]] = bitcast x86_fp80* [[DESIRED_VALUE_ADDR]] to i8*
57*0a6a1f1dSLionel Sambuc   // CHECK32: [[FAIL_SUCCESS:%.+]] = call zeroext i1 @__atomic_compare_exchange(i32 12, i8* [[OBJ]], i8* [[EXPECTED]], i8* [[DESIRED]], i32 7, i32 7)
58*0a6a1f1dSLionel Sambuc   // CHECK32: [[LD_VALUE:%.+]] = load x86_fp80* [[OLD_VALUE_ADDR]], align 4
59*0a6a1f1dSLionel Sambuc   // CHECK32: br i1 [[FAIL_SUCCESS]], label %[[ATOMIC_CONT:.+]], label %[[ATOMIC_OP]]
60*0a6a1f1dSLionel Sambuc   // CHECK32: [[ATOMIC_CONT]]
61*0a6a1f1dSLionel Sambuc   // CHECK32: ret x86_fp80 [[INC_VALUE]]
62*0a6a1f1dSLionel Sambuc 
63*0a6a1f1dSLionel Sambuc   return ++*addr;
64*0a6a1f1dSLionel Sambuc }
65*0a6a1f1dSLionel Sambuc 
testdec(_Atomic long double * addr)66*0a6a1f1dSLionel Sambuc long double testdec(_Atomic long double *addr) {
67*0a6a1f1dSLionel Sambuc   // CHECK-LABEL: @testdec
68*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80* %{{.+}}, x86_fp80** [[ADDR_ADDR:%.+]], align 8
69*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR:%.+]] = load x86_fp80** [[ADDR_ADDR]], align 8
70*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_ADDR:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
71*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_VALUE:%.+]] = load atomic i128* [[INT_ADDR]] seq_cst, align 16
72*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_LOAD_ADDR:%.+]] = bitcast x86_fp80* [[LD_ADDR:%.+]] to i128*
73*0a6a1f1dSLionel Sambuc   // CHECK: store i128 [[INT_VALUE]], i128* [[INT_LOAD_ADDR]], align 16
74*0a6a1f1dSLionel Sambuc   // CHECK: [[ORIG_LD_VALUE:%.+]] = load x86_fp80* [[LD_ADDR]], align 16
75*0a6a1f1dSLionel Sambuc   // CHECK: br label %[[ATOMIC_OP:.+]]
76*0a6a1f1dSLionel Sambuc   // CHECK: [[ATOMIC_OP]]
77*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE:%.+]] = phi x86_fp80 [ [[ORIG_LD_VALUE]], %{{.+}} ], [ [[LD_VALUE:%.+]], %[[ATOMIC_OP]] ]
78*0a6a1f1dSLionel Sambuc   // CHECK: [[DEC_VALUE:%.+]] = fadd x86_fp80 [[OLD_VALUE]],
79*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR:%.+]] to i8*
80*0a6a1f1dSLionel Sambuc   // CHECK: call void @llvm.memset.p0i8.i64(i8* [[OLD_VALUE_VOID_ADDR]], i8 0, i64 16, i32 16, i1 false)
81*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80 [[OLD_VALUE]], x86_fp80* [[OLD_VALUE_ADDR]], align 16
82*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_INT_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR]] to i128*
83*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_INT:%.+]] = load i128* [[OLD_INT_ADDR]], align 16
84*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[NEW_VALUE_ADDR:%.+]] to i8*
85*0a6a1f1dSLionel Sambuc   // CHECK: call void @llvm.memset.p0i8.i64(i8* [[NEW_VALUE_VOID_ADDR]], i8 0, i64 16, i32 16, i1 false)
86*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80 [[DEC_VALUE]], x86_fp80* [[NEW_VALUE_ADDR]], align 16
87*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_INT_ADDR:%.+]] = bitcast x86_fp80* [[NEW_VALUE_ADDR]] to i128*
88*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_INT:%.+]] = load i128* [[NEW_INT_ADDR]], align 16
89*0a6a1f1dSLionel Sambuc   // CHECK: [[OBJ_INT_ADDR:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
90*0a6a1f1dSLionel Sambuc   // CHECK: [[RES:%.+]] = cmpxchg i128* [[OBJ_INT_ADDR]], i128 [[OLD_INT]], i128 [[NEW_INT]] seq_cst seq_cst
91*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE:%.+]] = extractvalue { i128, i1 } [[RES]], 0
92*0a6a1f1dSLionel Sambuc   // CHECK: [[FAIL_SUCCESS:%.+]] = extractvalue { i128, i1 } [[RES]], 1
93*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE_RES_INT_PTR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_RES_PTR:%.+]] to i128*
94*0a6a1f1dSLionel Sambuc   // CHECK: store i128 [[OLD_VALUE]], i128* [[OLD_VALUE_RES_INT_PTR]], align 16
95*0a6a1f1dSLionel Sambuc   // CHECK: [[LD_VALUE]] = load x86_fp80* [[OLD_VALUE_RES_PTR]], align 16
96*0a6a1f1dSLionel Sambuc   // CHECK: br i1 [[FAIL_SUCCESS]], label %[[ATOMIC_CONT:.+]], label %[[ATOMIC_OP]]
97*0a6a1f1dSLionel Sambuc   // CHECK: [[ATOMIC_CONT]]
98*0a6a1f1dSLionel Sambuc   // CHECK: ret x86_fp80 [[ORIG_LD_VALUE]]
99*0a6a1f1dSLionel Sambuc   // CHECK32-LABEL: @testdec
100*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80* %{{.+}}, x86_fp80** [[ADDR_ADDR:%.+]], align 4
101*0a6a1f1dSLionel Sambuc   // CHECK32: [[ADDR:%.+]] = load x86_fp80** [[ADDR_ADDR]], align 4
102*0a6a1f1dSLionel Sambuc   // CHECK32: [[VOID_PTR:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
103*0a6a1f1dSLionel Sambuc   // CHECK32: [[TEMP_LD_PTR:%.+]] = bitcast x86_fp80* [[TEMP_LD_ADDR:%.+]] to i8*
104*0a6a1f1dSLionel Sambuc   // CHECK32: call void @__atomic_load(i32 12, i8* [[VOID_PTR]], i8* [[TEMP_LD_PTR]], i32 5)
105*0a6a1f1dSLionel Sambuc   // CHECK32: [[ORIG_LD_VALUE:%.+]] = load x86_fp80* [[TEMP_LD_ADDR]], align 4
106*0a6a1f1dSLionel Sambuc   // CHECK32: br label %[[ATOMIC_OP:.+]]
107*0a6a1f1dSLionel Sambuc   // CHECK32: [[ATOMIC_OP]]
108*0a6a1f1dSLionel Sambuc   // CHECK32: [[OLD_VALUE:%.+]] = phi x86_fp80 [ [[ORIG_LD_VALUE]], %{{.+}} ], [ [[LD_VALUE:%.+]], %[[ATOMIC_OP]] ]
109*0a6a1f1dSLionel Sambuc   // CHECK32: [[DEC_VALUE:%.+]] = fadd x86_fp80 [[OLD_VALUE]],
110*0a6a1f1dSLionel Sambuc   // CHECK32: [[OLD_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR:%.+]] to i8*
111*0a6a1f1dSLionel Sambuc   // CHECK32: call void @llvm.memset.p0i8.i64(i8* [[OLD_VALUE_VOID_ADDR]], i8 0, i64 12, i32 4, i1 false)
112*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80 [[OLD_VALUE]], x86_fp80* [[OLD_VALUE_ADDR]], align 4
113*0a6a1f1dSLionel Sambuc   // CHECK32: [[DESIRED_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[DESIRED_VALUE_ADDR:%.+]] to i8*
114*0a6a1f1dSLionel Sambuc   // CHECK32: call void @llvm.memset.p0i8.i64(i8* [[DESIRED_VALUE_VOID_ADDR]], i8 0, i64 12, i32 4, i1 false)
115*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80 [[DEC_VALUE]], x86_fp80* [[DESIRED_VALUE_ADDR]], align 4
116*0a6a1f1dSLionel Sambuc   // CHECK32: [[OBJ:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
117*0a6a1f1dSLionel Sambuc   // CHECK32: [[EXPECTED:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR]] to i8*
118*0a6a1f1dSLionel Sambuc   // CHECK32: [[DESIRED:%.+]] = bitcast x86_fp80* [[DESIRED_VALUE_ADDR]] to i8*
119*0a6a1f1dSLionel Sambuc   // CHECK32: [[FAIL_SUCCESS:%.+]] = call zeroext i1 @__atomic_compare_exchange(i32 12, i8* [[OBJ]], i8* [[EXPECTED]], i8* [[DESIRED]], i32 7, i32 7)
120*0a6a1f1dSLionel Sambuc   // CHECK32: [[LD_VALUE]] = load x86_fp80* [[OLD_VALUE_ADDR]], align 4
121*0a6a1f1dSLionel Sambuc   // CHECK32: br i1 [[FAIL_SUCCESS]], label %[[ATOMIC_CONT:.+]], label %[[ATOMIC_OP]]
122*0a6a1f1dSLionel Sambuc   // CHECK32: [[ATOMIC_CONT]]
123*0a6a1f1dSLionel Sambuc   // CHECK32: ret x86_fp80 [[ORIG_LD_VALUE]]
124*0a6a1f1dSLionel Sambuc 
125*0a6a1f1dSLionel Sambuc   return (*addr)--;
126*0a6a1f1dSLionel Sambuc }
127*0a6a1f1dSLionel Sambuc 
testcompassign(_Atomic long double * addr)128*0a6a1f1dSLionel Sambuc long double testcompassign(_Atomic long double *addr) {
129*0a6a1f1dSLionel Sambuc   *addr -= 25;
130*0a6a1f1dSLionel Sambuc   // CHECK-LABEL: @testcompassign
131*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80* %{{.+}}, x86_fp80** [[ADDR_ADDR:%.+]], align 8
132*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR:%.+]] = load x86_fp80** [[ADDR_ADDR]], align 8
133*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_ADDR:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
134*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_VALUE:%.+]] = load atomic i128* [[INT_ADDR]] seq_cst, align 16
135*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_LOAD_ADDR:%.+]] = bitcast x86_fp80* [[LD_ADDR:%.+]] to i128*
136*0a6a1f1dSLionel Sambuc   // CHECK: store i128 [[INT_VALUE]], i128* [[INT_LOAD_ADDR]], align 16
137*0a6a1f1dSLionel Sambuc   // CHECK: [[LD_VALUE:%.+]] = load x86_fp80* [[LD_ADDR]], align 16
138*0a6a1f1dSLionel Sambuc   // CHECK: br label %[[ATOMIC_OP:.+]]
139*0a6a1f1dSLionel Sambuc   // CHECK: [[ATOMIC_OP]]
140*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE:%.+]] = phi x86_fp80 [ [[LD_VALUE]], %{{.+}} ], [ [[LD_VALUE:%.+]], %[[ATOMIC_OP]] ]
141*0a6a1f1dSLionel Sambuc   // CHECK: [[SUB_VALUE:%.+]] = fsub x86_fp80 [[OLD_VALUE]],
142*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR:%.+]] to i8*
143*0a6a1f1dSLionel Sambuc   // CHECK: call void @llvm.memset.p0i8.i64(i8* [[OLD_VALUE_VOID_ADDR]], i8 0, i64 16, i32 16, i1 false)
144*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80 [[OLD_VALUE]], x86_fp80* [[OLD_VALUE_ADDR]], align 16
145*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_INT_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR]] to i128*
146*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_INT:%.+]] = load i128* [[OLD_INT_ADDR]], align 16
147*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[NEW_VALUE_ADDR:%.+]] to i8*
148*0a6a1f1dSLionel Sambuc   // CHECK: call void @llvm.memset.p0i8.i64(i8* [[NEW_VALUE_VOID_ADDR]], i8 0, i64 16, i32 16, i1 false)
149*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80 [[SUB_VALUE]], x86_fp80* [[NEW_VALUE_ADDR]], align 16
150*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_INT_ADDR:%.+]] = bitcast x86_fp80* [[NEW_VALUE_ADDR]] to i128*
151*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_INT:%.+]] = load i128* [[NEW_INT_ADDR]], align 16
152*0a6a1f1dSLionel Sambuc   // CHECK: [[OBJ_INT_ADDR:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
153*0a6a1f1dSLionel Sambuc   // CHECK: [[RES:%.+]] = cmpxchg i128* [[OBJ_INT_ADDR]], i128 [[OLD_INT]], i128 [[NEW_INT]] seq_cst seq_cst
154*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE:%.+]] = extractvalue { i128, i1 } [[RES]], 0
155*0a6a1f1dSLionel Sambuc   // CHECK: [[FAIL_SUCCESS:%.+]] = extractvalue { i128, i1 } [[RES]], 1
156*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE_RES_INT_PTR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_RES_PTR:%.+]] to i128*
157*0a6a1f1dSLionel Sambuc   // CHECK: store i128 [[OLD_VALUE]], i128* [[OLD_VALUE_RES_INT_PTR]], align 16
158*0a6a1f1dSLionel Sambuc   // CHECK: [[LD_VALUE]] = load x86_fp80* [[OLD_VALUE_RES_PTR]], align 16
159*0a6a1f1dSLionel Sambuc   // CHECK: br i1 [[FAIL_SUCCESS]], label %[[ATOMIC_CONT:.+]], label %[[ATOMIC_OP]]
160*0a6a1f1dSLionel Sambuc   // CHECK: [[ATOMIC_CONT]]
161*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR:%.+]] = load x86_fp80** %{{.+}}, align 8
162*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR_INT:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
163*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_VAL:%.+]] = load atomic i128* [[ADDR_INT]] seq_cst, align 16
164*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_LD_TEMP:%.+]] = bitcast x86_fp80* [[LD_TEMP:%.+]] to i128*
165*0a6a1f1dSLionel Sambuc   // CHECK: store i128 [[INT_VAL]], i128* [[INT_LD_TEMP:%.+]], align 16
166*0a6a1f1dSLionel Sambuc   // CHECK: [[RET_VAL:%.+]] = load x86_fp80* [[LD_TEMP]], align 16
167*0a6a1f1dSLionel Sambuc   // CHECK: ret x86_fp80 [[RET_VAL]]
168*0a6a1f1dSLionel Sambuc   // CHECK32-LABEL: @testcompassign
169*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80* %{{.+}}, x86_fp80** [[ADDR_ADDR:%.+]], align 4
170*0a6a1f1dSLionel Sambuc   // CHECK32: [[ADDR:%.+]] = load x86_fp80** [[ADDR_ADDR]], align 4
171*0a6a1f1dSLionel Sambuc   // CHECK32: [[VOID_PTR:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
172*0a6a1f1dSLionel Sambuc   // CHECK32: [[TEMP_LD_PTR:%.+]] = bitcast x86_fp80* [[TEMP_LD_ADDR:%.+]] to i8*
173*0a6a1f1dSLionel Sambuc   // CHECK32: call void @__atomic_load(i32 12, i8* [[VOID_PTR]], i8* [[TEMP_LD_PTR]], i32 5)
174*0a6a1f1dSLionel Sambuc   // CHECK32: [[LD_VALUE:%.+]] = load x86_fp80* [[TEMP_LD_ADDR]], align 4
175*0a6a1f1dSLionel Sambuc   // CHECK32: br label %[[ATOMIC_OP:.+]]
176*0a6a1f1dSLionel Sambuc   // CHECK32: [[ATOMIC_OP]]
177*0a6a1f1dSLionel Sambuc   // CHECK32: [[OLD_VALUE:%.+]] = phi x86_fp80 [ [[LD_VALUE]], %{{.+}} ], [ [[LD_VALUE:%.+]], %[[ATOMIC_OP]] ]
178*0a6a1f1dSLionel Sambuc   // CHECK32: [[INC_VALUE:%.+]] = fsub x86_fp80 [[OLD_VALUE]],
179*0a6a1f1dSLionel Sambuc   // CHECK32: [[OLD_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR:%.+]] to i8*
180*0a6a1f1dSLionel Sambuc   // CHECK32: call void @llvm.memset.p0i8.i64(i8* [[OLD_VALUE_VOID_ADDR]], i8 0, i64 12, i32 4, i1 false)
181*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80 [[OLD_VALUE]], x86_fp80* [[OLD_VALUE_ADDR]], align 4
182*0a6a1f1dSLionel Sambuc   // CHECK32: [[DESIRED_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[DESIRED_VALUE_ADDR:%.+]] to i8*
183*0a6a1f1dSLionel Sambuc   // CHECK32: call void @llvm.memset.p0i8.i64(i8* [[DESIRED_VALUE_VOID_ADDR]], i8 0, i64 12, i32 4, i1 false)
184*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80 [[INC_VALUE]], x86_fp80* [[DESIRED_VALUE_ADDR]], align 4
185*0a6a1f1dSLionel Sambuc   // CHECK32: [[OBJ:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
186*0a6a1f1dSLionel Sambuc   // CHECK32: [[EXPECTED:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR]] to i8*
187*0a6a1f1dSLionel Sambuc   // CHECK32: [[DESIRED:%.+]] = bitcast x86_fp80* [[DESIRED_VALUE_ADDR]] to i8*
188*0a6a1f1dSLionel Sambuc   // CHECK32: [[FAIL_SUCCESS:%.+]] = call zeroext i1 @__atomic_compare_exchange(i32 12, i8* [[OBJ]], i8* [[EXPECTED]], i8* [[DESIRED]], i32 7, i32 7)
189*0a6a1f1dSLionel Sambuc   // CHECK32: [[LD_VALUE]] = load x86_fp80* [[OLD_VALUE_ADDR]], align 4
190*0a6a1f1dSLionel Sambuc   // CHECK32: br i1 [[FAIL_SUCCESS]], label %[[ATOMIC_CONT:.+]], label %[[ATOMIC_OP]]
191*0a6a1f1dSLionel Sambuc   // CHECK32: [[ATOMIC_CONT]]
192*0a6a1f1dSLionel Sambuc   // CHECK32: [[ADDR:%.+]] = load x86_fp80** %{{.+}}, align 4
193*0a6a1f1dSLionel Sambuc   // CHECK32: [[VOID_ADDR:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
194*0a6a1f1dSLionel Sambuc   // CHECK32: [[VOID_GET_ADDR:%.+]] = bitcast x86_fp80* [[GET_ADDR:%.+]] to i8*
195*0a6a1f1dSLionel Sambuc   // CHECK32: call void @__atomic_load(i32 12, i8* [[VOID_ADDR]], i8* [[VOID_GET_ADDR]], i32 5)
196*0a6a1f1dSLionel Sambuc   // CHECK32: [[RET_VAL:%.+]] = load x86_fp80* [[GET_ADDR]], align 4
197*0a6a1f1dSLionel Sambuc   // CHECK32: ret x86_fp80 [[RET_VAL]]
198*0a6a1f1dSLionel Sambuc   return *addr;
199*0a6a1f1dSLionel Sambuc }
200*0a6a1f1dSLionel Sambuc 
testassign(_Atomic long double * addr)201*0a6a1f1dSLionel Sambuc long double testassign(_Atomic long double *addr) {
202*0a6a1f1dSLionel Sambuc   // CHECK-LABEL: @testassign
203*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80* %{{.+}}, x86_fp80** [[ADDR_ADDR:%.+]], align 8
204*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR:%.+]] = load x86_fp80** [[ADDR_ADDR]], align 8
205*0a6a1f1dSLionel Sambuc   // CHECK: [[STORE_TEMP_VOID_PTR:%.+]] = bitcast x86_fp80* [[STORE_TEMP_PTR:%.+]] to i8*
206*0a6a1f1dSLionel Sambuc   // CHECK: call void @llvm.memset.p0i8.i64(i8* [[STORE_TEMP_VOID_PTR]], i8 0, i64 16, i32 16, i1 false)
207*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80 {{.+}}, x86_fp80* [[STORE_TEMP_PTR]], align 16
208*0a6a1f1dSLionel Sambuc   // CHECK: [[STORE_TEMP_INT_PTR:%.+]] = bitcast x86_fp80* [[STORE_TEMP_PTR]] to i128*
209*0a6a1f1dSLionel Sambuc   // CHECK: [[STORE_TEMP_INT:%.+]] = load i128* [[STORE_TEMP_INT_PTR]], align 16
210*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR_INT:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
211*0a6a1f1dSLionel Sambuc   // CHECK: store atomic i128 [[STORE_TEMP_INT]], i128* [[ADDR_INT]] seq_cst, align 16
212*0a6a1f1dSLionel Sambuc   // CHECK32-LABEL: @testassign
213*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80* %{{.+}}, x86_fp80** [[ADDR_ADDR:%.+]], align 4
214*0a6a1f1dSLionel Sambuc   // CHECK32: [[ADDR:%.+]] = load x86_fp80** [[ADDR_ADDR]], align 4
215*0a6a1f1dSLionel Sambuc   // CHECK32: [[STORE_TEMP_VOID_PTR:%.+]] = bitcast x86_fp80* [[STORE_TEMP_PTR:%.+]] to i8*
216*0a6a1f1dSLionel Sambuc   // CHECK32: call void @llvm.memset.p0i8.i64(i8* [[STORE_TEMP_VOID_PTR]], i8 0, i64 12, i32 4, i1 false)
217*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80 {{.+}}, x86_fp80* [[STORE_TEMP_PTR]], align 4
218*0a6a1f1dSLionel Sambuc   // CHECK32: [[ADDR_VOID:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
219*0a6a1f1dSLionel Sambuc   // CHECK32: [[STORE_TEMP_VOID_PTR:%.+]] = bitcast x86_fp80* [[STORE_TEMP_PTR]] to i8*
220*0a6a1f1dSLionel Sambuc   // CHECK32: call void @__atomic_store(i32 12, i8* [[ADDR_VOID]], i8* [[STORE_TEMP_VOID_PTR]], i32 5)
221*0a6a1f1dSLionel Sambuc   *addr = 115;
222*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR:%.+]] = load x86_fp80** %{{.+}}, align 8
223*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR_INT:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
224*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_VAL:%.+]] = load atomic i128* [[ADDR_INT]] seq_cst, align 16
225*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_LD_TEMP:%.+]] = bitcast x86_fp80* [[LD_TEMP:%.+]] to i128*
226*0a6a1f1dSLionel Sambuc   // CHECK: store i128 [[INT_VAL]], i128* [[INT_LD_TEMP:%.+]], align 16
227*0a6a1f1dSLionel Sambuc   // CHECK: [[RET_VAL:%.+]] = load x86_fp80* [[LD_TEMP]], align 16
228*0a6a1f1dSLionel Sambuc   // CHECK: ret x86_fp80 [[RET_VAL]]
229*0a6a1f1dSLionel Sambuc   // CHECK32: [[ADDR:%.+]] = load x86_fp80** %{{.+}}, align 4
230*0a6a1f1dSLionel Sambuc   // CHECK32: [[VOID_ADDR:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
231*0a6a1f1dSLionel Sambuc   // CHECK32: [[VOID_LD_TEMP:%.+]] = bitcast x86_fp80* [[LD_TEMP:%.+]] to i8*
232*0a6a1f1dSLionel Sambuc   // CHECK32: call void @__atomic_load(i32 12, i8* [[VOID_ADDR]], i8* [[VOID_LD_TEMP]], i32 5)
233*0a6a1f1dSLionel Sambuc   // CHECK32: [[RET_VAL:%.+]] = load x86_fp80* [[LD_TEMP]], align 4
234*0a6a1f1dSLionel Sambuc   // CHECK32: ret x86_fp80 [[RET_VAL]]
235*0a6a1f1dSLionel Sambuc 
236*0a6a1f1dSLionel Sambuc   return *addr;
237*0a6a1f1dSLionel Sambuc }
238*0a6a1f1dSLionel Sambuc 
test_volatile_inc(volatile _Atomic long double * addr)239*0a6a1f1dSLionel Sambuc long double test_volatile_inc(volatile _Atomic long double *addr) {
240*0a6a1f1dSLionel Sambuc   // CHECK-LABEL: @test_volatile_inc
241*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80* %{{.+}}, x86_fp80** [[ADDR_ADDR:%.+]], align 8
242*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR:%.+]] = load x86_fp80** [[ADDR_ADDR]], align 8
243*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_ADDR:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
244*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_VALUE:%.+]] = load atomic volatile i128* [[INT_ADDR]] seq_cst, align 16
245*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_LOAD_ADDR:%.+]] = bitcast x86_fp80* [[LD_ADDR:%.+]] to i128*
246*0a6a1f1dSLionel Sambuc   // CHECK: store i128 [[INT_VALUE]], i128* [[INT_LOAD_ADDR]], align 16
247*0a6a1f1dSLionel Sambuc   // CHECK: [[LD_VALUE:%.+]] = load x86_fp80* [[LD_ADDR]], align 16
248*0a6a1f1dSLionel Sambuc   // CHECK: br label %[[ATOMIC_OP:.+]]
249*0a6a1f1dSLionel Sambuc   // CHECK: [[ATOMIC_OP]]
250*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE:%.+]] = phi x86_fp80 [ [[LD_VALUE]], %{{.+}} ], [ [[LD_VALUE:%.+]], %[[ATOMIC_OP]] ]
251*0a6a1f1dSLionel Sambuc   // CHECK: [[INC_VALUE:%.+]] = fadd x86_fp80 [[OLD_VALUE]],
252*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR:%.+]] to i8*
253*0a6a1f1dSLionel Sambuc   // CHECK: call void @llvm.memset.p0i8.i64(i8* [[OLD_VALUE_VOID_ADDR]], i8 0, i64 16, i32 16, i1 false)
254*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80 [[OLD_VALUE]], x86_fp80* [[OLD_VALUE_ADDR]], align 16
255*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_INT_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR]] to i128*
256*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_INT:%.+]] = load i128* [[OLD_INT_ADDR]], align 16
257*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[NEW_VALUE_ADDR:%.+]] to i8*
258*0a6a1f1dSLionel Sambuc   // CHECK: call void @llvm.memset.p0i8.i64(i8* [[NEW_VALUE_VOID_ADDR]], i8 0, i64 16, i32 16, i1 false)
259*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80 [[INC_VALUE]], x86_fp80* [[NEW_VALUE_ADDR]], align 16
260*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_INT_ADDR:%.+]] = bitcast x86_fp80* [[NEW_VALUE_ADDR]] to i128*
261*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_INT:%.+]] = load i128* [[NEW_INT_ADDR]], align 16
262*0a6a1f1dSLionel Sambuc   // CHECK: [[OBJ_INT_ADDR:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
263*0a6a1f1dSLionel Sambuc   // CHECK: [[RES:%.+]] = cmpxchg volatile i128* [[OBJ_INT_ADDR]], i128 [[OLD_INT]], i128 [[NEW_INT]] seq_cst seq_cst
264*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE:%.+]] = extractvalue { i128, i1 } [[RES]], 0
265*0a6a1f1dSLionel Sambuc   // CHECK: [[FAIL_SUCCESS:%.+]] = extractvalue { i128, i1 } [[RES]], 1
266*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE_RES_INT_PTR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_RES_PTR:%.+]] to i128*
267*0a6a1f1dSLionel Sambuc   // CHECK: store i128 [[OLD_VALUE]], i128* [[OLD_VALUE_RES_INT_PTR]], align 16
268*0a6a1f1dSLionel Sambuc   // CHECK: [[LD_VALUE]] = load x86_fp80* [[OLD_VALUE_RES_PTR]], align 16
269*0a6a1f1dSLionel Sambuc   // CHECK: br i1 [[FAIL_SUCCESS]], label %[[ATOMIC_CONT:.+]], label %[[ATOMIC_OP]]
270*0a6a1f1dSLionel Sambuc   // CHECK: [[ATOMIC_CONT]]
271*0a6a1f1dSLionel Sambuc   // CHECK: ret x86_fp80 [[INC_VALUE]]
272*0a6a1f1dSLionel Sambuc   // CHECK32-LABEL: @test_volatile_inc
273*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80* %{{.+}}, x86_fp80** [[ADDR_ADDR:%.+]], align 4
274*0a6a1f1dSLionel Sambuc   // CHECK32: [[ADDR:%.+]] = load x86_fp80** [[ADDR_ADDR]], align 4
275*0a6a1f1dSLionel Sambuc   // CHECK32: [[VOID_PTR:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
276*0a6a1f1dSLionel Sambuc   // CHECK32: [[TEMP_LD_PTR:%.+]] = bitcast x86_fp80* [[TEMP_LD_ADDR:%.+]] to i8*
277*0a6a1f1dSLionel Sambuc   // CHECK32: call void @__atomic_load(i32 12, i8* [[VOID_PTR]], i8* [[TEMP_LD_PTR]], i32 5)
278*0a6a1f1dSLionel Sambuc   // CHECK32: [[LD_VALUE:%.+]] = load x86_fp80* [[TEMP_LD_ADDR]], align 4
279*0a6a1f1dSLionel Sambuc   // CHECK32: br label %[[ATOMIC_OP:.+]]
280*0a6a1f1dSLionel Sambuc   // CHECK32: [[ATOMIC_OP]]
281*0a6a1f1dSLionel Sambuc   // CHECK32: [[OLD_VALUE:%.+]] = phi x86_fp80 [ [[LD_VALUE]], %{{.+}} ], [ [[LD_VALUE:%.+]], %[[ATOMIC_OP]] ]
282*0a6a1f1dSLionel Sambuc   // CHECK32: [[INC_VALUE:%.+]] = fadd x86_fp80 [[OLD_VALUE]],
283*0a6a1f1dSLionel Sambuc   // CHECK32: [[OLD_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR:%.+]] to i8*
284*0a6a1f1dSLionel Sambuc   // CHECK32: call void @llvm.memset.p0i8.i64(i8* [[OLD_VALUE_VOID_ADDR]], i8 0, i64 12, i32 4, i1 false)
285*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80 [[OLD_VALUE]], x86_fp80* [[OLD_VALUE_ADDR]], align 4
286*0a6a1f1dSLionel Sambuc   // CHECK32: [[DESIRED_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[DESIRED_VALUE_ADDR:%.+]] to i8*
287*0a6a1f1dSLionel Sambuc   // CHECK32: call void @llvm.memset.p0i8.i64(i8* [[DESIRED_VALUE_VOID_ADDR]], i8 0, i64 12, i32 4, i1 false)
288*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80 [[INC_VALUE]], x86_fp80* [[DESIRED_VALUE_ADDR]], align 4
289*0a6a1f1dSLionel Sambuc   // CHECK32: [[OBJ:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
290*0a6a1f1dSLionel Sambuc   // CHECK32: [[EXPECTED:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR]] to i8*
291*0a6a1f1dSLionel Sambuc   // CHECK32: [[DESIRED:%.+]] = bitcast x86_fp80* [[DESIRED_VALUE_ADDR]] to i8*
292*0a6a1f1dSLionel Sambuc   // CHECK32: [[FAIL_SUCCESS:%.+]] = call zeroext i1 @__atomic_compare_exchange(i32 12, i8* [[OBJ]], i8* [[EXPECTED]], i8* [[DESIRED]], i32 7, i32 7)
293*0a6a1f1dSLionel Sambuc   // CHECK32: [[LD_VALUE]] = load x86_fp80* [[OLD_VALUE_ADDR]], align 4
294*0a6a1f1dSLionel Sambuc   // CHECK32: br i1 [[FAIL_SUCCESS]], label %[[ATOMIC_CONT:.+]], label %[[ATOMIC_OP]]
295*0a6a1f1dSLionel Sambuc   // CHECK32: [[ATOMIC_CONT]]
296*0a6a1f1dSLionel Sambuc   // CHECK32: ret x86_fp80 [[INC_VALUE]]
297*0a6a1f1dSLionel Sambuc   return ++*addr;
298*0a6a1f1dSLionel Sambuc }
299*0a6a1f1dSLionel Sambuc 
test_volatile_dec(volatile _Atomic long double * addr)300*0a6a1f1dSLionel Sambuc long double test_volatile_dec(volatile _Atomic long double *addr) {
301*0a6a1f1dSLionel Sambuc   // CHECK-LABEL: @test_volatile_dec
302*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80* %{{.+}}, x86_fp80** [[ADDR_ADDR:%.+]], align 8
303*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR:%.+]] = load x86_fp80** [[ADDR_ADDR]], align 8
304*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_ADDR:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
305*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_VALUE:%.+]] = load atomic volatile i128* [[INT_ADDR]] seq_cst, align 16
306*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_LOAD_ADDR:%.+]] = bitcast x86_fp80* [[LD_ADDR:%.+]] to i128*
307*0a6a1f1dSLionel Sambuc   // CHECK: store i128 [[INT_VALUE]], i128* [[INT_LOAD_ADDR]], align 16
308*0a6a1f1dSLionel Sambuc   // CHECK: [[ORIG_LD_VALUE:%.+]] = load x86_fp80* [[LD_ADDR]], align 16
309*0a6a1f1dSLionel Sambuc   // CHECK: br label %[[ATOMIC_OP:.+]]
310*0a6a1f1dSLionel Sambuc   // CHECK: [[ATOMIC_OP]]
311*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE:%.+]] = phi x86_fp80 [ [[ORIG_LD_VALUE]], %{{.+}} ], [ [[LD_VALUE:%.+]], %[[ATOMIC_OP]] ]
312*0a6a1f1dSLionel Sambuc   // CHECK: [[DEC_VALUE:%.+]] = fadd x86_fp80 [[OLD_VALUE]],
313*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR:%.+]] to i8*
314*0a6a1f1dSLionel Sambuc   // CHECK: call void @llvm.memset.p0i8.i64(i8* [[OLD_VALUE_VOID_ADDR]], i8 0, i64 16, i32 16, i1 false)
315*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80 [[OLD_VALUE]], x86_fp80* [[OLD_VALUE_ADDR]], align 16
316*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_INT_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR]] to i128*
317*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_INT:%.+]] = load i128* [[OLD_INT_ADDR]], align 16
318*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[NEW_VALUE_ADDR:%.+]] to i8*
319*0a6a1f1dSLionel Sambuc   // CHECK: call void @llvm.memset.p0i8.i64(i8* [[NEW_VALUE_VOID_ADDR]], i8 0, i64 16, i32 16, i1 false)
320*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80 [[DEC_VALUE]], x86_fp80* [[NEW_VALUE_ADDR]], align 16
321*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_INT_ADDR:%.+]] = bitcast x86_fp80* [[NEW_VALUE_ADDR]] to i128*
322*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_INT:%.+]] = load i128* [[NEW_INT_ADDR]], align 16
323*0a6a1f1dSLionel Sambuc   // CHECK: [[OBJ_INT_ADDR:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
324*0a6a1f1dSLionel Sambuc   // CHECK: [[RES:%.+]] = cmpxchg volatile i128* [[OBJ_INT_ADDR]], i128 [[OLD_INT]], i128 [[NEW_INT]] seq_cst seq_cst
325*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE:%.+]] = extractvalue { i128, i1 } [[RES]], 0
326*0a6a1f1dSLionel Sambuc   // CHECK: [[FAIL_SUCCESS:%.+]] = extractvalue { i128, i1 } [[RES]], 1
327*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE_RES_INT_PTR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_RES_PTR:%.+]] to i128*
328*0a6a1f1dSLionel Sambuc   // CHECK: store i128 [[OLD_VALUE]], i128* [[OLD_VALUE_RES_INT_PTR]], align 16
329*0a6a1f1dSLionel Sambuc   // CHECK: [[LD_VALUE]] = load x86_fp80* [[OLD_VALUE_RES_PTR]], align 16
330*0a6a1f1dSLionel Sambuc   // CHECK: br i1 [[FAIL_SUCCESS]], label %[[ATOMIC_CONT:.+]], label %[[ATOMIC_OP]]
331*0a6a1f1dSLionel Sambuc   // CHECK: [[ATOMIC_CONT]]
332*0a6a1f1dSLionel Sambuc   // CHECK: ret x86_fp80 [[ORIG_LD_VALUE]]
333*0a6a1f1dSLionel Sambuc   // CHECK32-LABEL: @test_volatile_dec
334*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80* %{{.+}}, x86_fp80** [[ADDR_ADDR:%.+]], align 4
335*0a6a1f1dSLionel Sambuc   // CHECK32: [[ADDR:%.+]] = load x86_fp80** [[ADDR_ADDR]], align 4
336*0a6a1f1dSLionel Sambuc   // CHECK32: [[VOID_PTR:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
337*0a6a1f1dSLionel Sambuc   // CHECK32: [[TEMP_LD_PTR:%.+]] = bitcast x86_fp80* [[TEMP_LD_ADDR:%.+]] to i8*
338*0a6a1f1dSLionel Sambuc   // CHECK32: call void @__atomic_load(i32 12, i8* [[VOID_PTR]], i8* [[TEMP_LD_PTR]], i32 5)
339*0a6a1f1dSLionel Sambuc   // CHECK32: [[ORIG_LD_VALUE:%.+]] = load x86_fp80* [[TEMP_LD_ADDR]], align 4
340*0a6a1f1dSLionel Sambuc   // CHECK32: br label %[[ATOMIC_OP:.+]]
341*0a6a1f1dSLionel Sambuc   // CHECK32: [[ATOMIC_OP]]
342*0a6a1f1dSLionel Sambuc   // CHECK32: [[OLD_VALUE:%.+]] = phi x86_fp80 [ [[ORIG_LD_VALUE]], %{{.+}} ], [ [[LD_VALUE:%.+]], %[[ATOMIC_OP]] ]
343*0a6a1f1dSLionel Sambuc   // CHECK32: [[DEC_VALUE:%.+]] = fadd x86_fp80 [[OLD_VALUE]],
344*0a6a1f1dSLionel Sambuc   // CHECK32: [[OLD_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR:%.+]] to i8*
345*0a6a1f1dSLionel Sambuc   // CHECK32: call void @llvm.memset.p0i8.i64(i8* [[OLD_VALUE_VOID_ADDR]], i8 0, i64 12, i32 4, i1 false)
346*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80 [[OLD_VALUE]], x86_fp80* [[OLD_VALUE_ADDR]], align 4
347*0a6a1f1dSLionel Sambuc   // CHECK32: [[DESIRED_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[DESIRED_VALUE_ADDR:%.+]] to i8*
348*0a6a1f1dSLionel Sambuc   // CHECK32: call void @llvm.memset.p0i8.i64(i8* [[DESIRED_VALUE_VOID_ADDR]], i8 0, i64 12, i32 4, i1 false)
349*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80 [[DEC_VALUE]], x86_fp80* [[DESIRED_VALUE_ADDR]], align 4
350*0a6a1f1dSLionel Sambuc   // CHECK32: [[OBJ:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
351*0a6a1f1dSLionel Sambuc   // CHECK32: [[EXPECTED:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR]] to i8*
352*0a6a1f1dSLionel Sambuc   // CHECK32: [[DESIRED:%.+]] = bitcast x86_fp80* [[DESIRED_VALUE_ADDR]] to i8*
353*0a6a1f1dSLionel Sambuc   // CHECK32: [[FAIL_SUCCESS:%.+]] = call zeroext i1 @__atomic_compare_exchange(i32 12, i8* [[OBJ]], i8* [[EXPECTED]], i8* [[DESIRED]], i32 7, i32 7)
354*0a6a1f1dSLionel Sambuc   // CHECK32: [[LD_VALUE]] = load x86_fp80* [[OLD_VALUE_ADDR]], align 4
355*0a6a1f1dSLionel Sambuc   // CHECK32: br i1 [[FAIL_SUCCESS]], label %[[ATOMIC_CONT:.+]], label %[[ATOMIC_OP]]
356*0a6a1f1dSLionel Sambuc   // CHECK32: [[ATOMIC_CONT]]
357*0a6a1f1dSLionel Sambuc   // CHECK32: ret x86_fp80 [[ORIG_LD_VALUE]]
358*0a6a1f1dSLionel Sambuc   return (*addr)--;
359*0a6a1f1dSLionel Sambuc }
360*0a6a1f1dSLionel Sambuc 
test_volatile_compassign(volatile _Atomic long double * addr)361*0a6a1f1dSLionel Sambuc long double test_volatile_compassign(volatile _Atomic long double *addr) {
362*0a6a1f1dSLionel Sambuc   *addr -= 25;
363*0a6a1f1dSLionel Sambuc   // CHECK-LABEL: @test_volatile_compassign
364*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80* %{{.+}}, x86_fp80** [[ADDR_ADDR:%.+]], align 8
365*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR:%.+]] = load x86_fp80** [[ADDR_ADDR]], align 8
366*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_ADDR:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
367*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_VALUE:%.+]] = load atomic volatile i128* [[INT_ADDR]] seq_cst, align 16
368*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_LOAD_ADDR:%.+]] = bitcast x86_fp80* [[LD_ADDR:%.+]] to i128*
369*0a6a1f1dSLionel Sambuc   // CHECK: store i128 [[INT_VALUE]], i128* [[INT_LOAD_ADDR]], align 16
370*0a6a1f1dSLionel Sambuc   // CHECK: [[LD_VALUE:%.+]] = load x86_fp80* [[LD_ADDR]], align 16
371*0a6a1f1dSLionel Sambuc   // CHECK: br label %[[ATOMIC_OP:.+]]
372*0a6a1f1dSLionel Sambuc   // CHECK: [[ATOMIC_OP]]
373*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE:%.+]] = phi x86_fp80 [ [[LD_VALUE]], %{{.+}} ], [ [[LD_VALUE:%.+]], %[[ATOMIC_OP]] ]
374*0a6a1f1dSLionel Sambuc   // CHECK: [[SUB_VALUE:%.+]] = fsub x86_fp80 [[OLD_VALUE]],
375*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR:%.+]] to i8*
376*0a6a1f1dSLionel Sambuc   // CHECK: call void @llvm.memset.p0i8.i64(i8* [[OLD_VALUE_VOID_ADDR]], i8 0, i64 16, i32 16, i1 false)
377*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80 [[OLD_VALUE]], x86_fp80* [[OLD_VALUE_ADDR]], align 16
378*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_INT_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR]] to i128*
379*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_INT:%.+]] = load i128* [[OLD_INT_ADDR]], align 16
380*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[NEW_VALUE_ADDR:%.+]] to i8*
381*0a6a1f1dSLionel Sambuc   // CHECK: call void @llvm.memset.p0i8.i64(i8* [[NEW_VALUE_VOID_ADDR]], i8 0, i64 16, i32 16, i1 false)
382*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80 [[SUB_VALUE]], x86_fp80* [[NEW_VALUE_ADDR]], align 16
383*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_INT_ADDR:%.+]] = bitcast x86_fp80* [[NEW_VALUE_ADDR]] to i128*
384*0a6a1f1dSLionel Sambuc   // CHECK: [[NEW_INT:%.+]] = load i128* [[NEW_INT_ADDR]], align 16
385*0a6a1f1dSLionel Sambuc   // CHECK: [[OBJ_INT_ADDR:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
386*0a6a1f1dSLionel Sambuc   // CHECK: [[RES:%.+]] = cmpxchg volatile i128* [[OBJ_INT_ADDR]], i128 [[OLD_INT]], i128 [[NEW_INT]] seq_cst seq_cst
387*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE:%.+]] = extractvalue { i128, i1 } [[RES]], 0
388*0a6a1f1dSLionel Sambuc   // CHECK: [[FAIL_SUCCESS:%.+]] = extractvalue { i128, i1 } [[RES]], 1
389*0a6a1f1dSLionel Sambuc   // CHECK: [[OLD_VALUE_RES_INT_PTR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_RES_PTR:%.+]] to i128*
390*0a6a1f1dSLionel Sambuc   // CHECK: store i128 [[OLD_VALUE]], i128* [[OLD_VALUE_RES_INT_PTR]], align 16
391*0a6a1f1dSLionel Sambuc   // CHECK: [[LD_VALUE]] = load x86_fp80* [[OLD_VALUE_RES_PTR]], align 16
392*0a6a1f1dSLionel Sambuc   // CHECK: br i1 [[FAIL_SUCCESS]], label %[[ATOMIC_CONT:.+]], label %[[ATOMIC_OP]]
393*0a6a1f1dSLionel Sambuc   // CHECK: [[ATOMIC_CONT]]
394*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR:%.+]] = load x86_fp80** %{{.+}}, align 8
395*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR_INT:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
396*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_VAL:%.+]] = load atomic volatile i128* [[ADDR_INT]] seq_cst, align 16
397*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_LD_TEMP:%.+]] = bitcast x86_fp80* [[LD_TEMP:%.+]] to i128*
398*0a6a1f1dSLionel Sambuc   // CHECK: store i128 [[INT_VAL]], i128* [[INT_LD_TEMP:%.+]], align 16
399*0a6a1f1dSLionel Sambuc   // CHECK: [[RET_VAL:%.+]] = load x86_fp80* [[LD_TEMP]], align 16
400*0a6a1f1dSLionel Sambuc   // CHECK32-LABEL: @test_volatile_compassign
401*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80* %{{.+}}, x86_fp80** [[ADDR_ADDR:%.+]], align 4
402*0a6a1f1dSLionel Sambuc   // CHECK32: [[ADDR:%.+]] = load x86_fp80** [[ADDR_ADDR]], align 4
403*0a6a1f1dSLionel Sambuc   // CHECK32: [[VOID_PTR:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
404*0a6a1f1dSLionel Sambuc   // CHECK32: [[TEMP_LD_PTR:%.+]] = bitcast x86_fp80* [[TEMP_LD_ADDR:%.+]] to i8*
405*0a6a1f1dSLionel Sambuc   // CHECK32: call void @__atomic_load(i32 12, i8* [[VOID_PTR]], i8* [[TEMP_LD_PTR]], i32 5)
406*0a6a1f1dSLionel Sambuc   // CHECK32: [[LD_VALUE:%.+]] = load x86_fp80* [[TEMP_LD_ADDR]], align 4
407*0a6a1f1dSLionel Sambuc   // CHECK32: br label %[[ATOMIC_OP:.+]]
408*0a6a1f1dSLionel Sambuc   // CHECK32: [[ATOMIC_OP]]
409*0a6a1f1dSLionel Sambuc   // CHECK32: [[OLD_VALUE:%.+]] = phi x86_fp80 [ [[LD_VALUE]], %{{.+}} ], [ [[LD_VALUE:%.+]], %[[ATOMIC_OP]] ]
410*0a6a1f1dSLionel Sambuc   // CHECK32: [[INC_VALUE:%.+]] = fsub x86_fp80 [[OLD_VALUE]],
411*0a6a1f1dSLionel Sambuc   // CHECK32: [[OLD_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR:%.+]] to i8*
412*0a6a1f1dSLionel Sambuc   // CHECK32: call void @llvm.memset.p0i8.i64(i8* [[OLD_VALUE_VOID_ADDR]], i8 0, i64 12, i32 4, i1 false)
413*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80 [[OLD_VALUE]], x86_fp80* [[OLD_VALUE_ADDR]], align 4
414*0a6a1f1dSLionel Sambuc   // CHECK32: [[DESIRED_VALUE_VOID_ADDR:%.+]] = bitcast x86_fp80* [[DESIRED_VALUE_ADDR:%.+]] to i8*
415*0a6a1f1dSLionel Sambuc   // CHECK32: call void @llvm.memset.p0i8.i64(i8* [[DESIRED_VALUE_VOID_ADDR]], i8 0, i64 12, i32 4, i1 false)
416*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80 [[INC_VALUE]], x86_fp80* [[DESIRED_VALUE_ADDR]], align 4
417*0a6a1f1dSLionel Sambuc   // CHECK32: [[OBJ:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
418*0a6a1f1dSLionel Sambuc   // CHECK32: [[EXPECTED:%.+]] = bitcast x86_fp80* [[OLD_VALUE_ADDR]] to i8*
419*0a6a1f1dSLionel Sambuc   // CHECK32: [[DESIRED:%.+]] = bitcast x86_fp80* [[DESIRED_VALUE_ADDR]] to i8*
420*0a6a1f1dSLionel Sambuc   // CHECK32: [[FAIL_SUCCESS:%.+]] = call zeroext i1 @__atomic_compare_exchange(i32 12, i8* [[OBJ]], i8* [[EXPECTED]], i8* [[DESIRED]], i32 7, i32 7)
421*0a6a1f1dSLionel Sambuc   // CHECK32: [[LD_VALUE]] = load x86_fp80* [[OLD_VALUE_ADDR]], align 4
422*0a6a1f1dSLionel Sambuc   // CHECK32: br i1 [[FAIL_SUCCESS]], label %[[ATOMIC_CONT:.+]], label %[[ATOMIC_OP]]
423*0a6a1f1dSLionel Sambuc   // CHECK32: [[ATOMIC_CONT]]
424*0a6a1f1dSLionel Sambuc   // CHECK32: [[ADDR:%.+]] = load x86_fp80** %{{.+}}, align 4
425*0a6a1f1dSLionel Sambuc   // CHECK32: [[VOID_ADDR:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
426*0a6a1f1dSLionel Sambuc   // CHECK32: [[VOID_GET_ADDR:%.+]] = bitcast x86_fp80* [[GET_ADDR:%.+]] to i8*
427*0a6a1f1dSLionel Sambuc   // CHECK32: call void @__atomic_load(i32 12, i8* [[VOID_ADDR]], i8* [[VOID_GET_ADDR]], i32 5)
428*0a6a1f1dSLionel Sambuc   // CHECK32: [[RET_VAL:%.+]] = load x86_fp80* [[GET_ADDR]], align 4
429*0a6a1f1dSLionel Sambuc   // CHECK32: ret x86_fp80 [[RET_VAL]]
430*0a6a1f1dSLionel Sambuc   return *addr;
431*0a6a1f1dSLionel Sambuc }
432*0a6a1f1dSLionel Sambuc 
test_volatile_assign(volatile _Atomic long double * addr)433*0a6a1f1dSLionel Sambuc long double test_volatile_assign(volatile _Atomic long double *addr) {
434*0a6a1f1dSLionel Sambuc   // CHECK-LABEL: @test_volatile_assign
435*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80* %{{.+}}, x86_fp80** [[ADDR_ADDR:%.+]], align 8
436*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR:%.+]] = load x86_fp80** [[ADDR_ADDR]], align 8
437*0a6a1f1dSLionel Sambuc   // CHECK: [[STORE_TEMP_VOID_PTR:%.+]] = bitcast x86_fp80* [[STORE_TEMP_PTR:%.+]] to i8*
438*0a6a1f1dSLionel Sambuc   // CHECK: call void @llvm.memset.p0i8.i64(i8* [[STORE_TEMP_VOID_PTR]], i8 0, i64 16, i32 16, i1 false)
439*0a6a1f1dSLionel Sambuc   // CHECK: store x86_fp80 {{.+}}, x86_fp80* [[STORE_TEMP_PTR]], align 16
440*0a6a1f1dSLionel Sambuc   // CHECK: [[STORE_TEMP_INT_PTR:%.+]] = bitcast x86_fp80* [[STORE_TEMP_PTR]] to i128*
441*0a6a1f1dSLionel Sambuc   // CHECK: [[STORE_TEMP_INT:%.+]] = load i128* [[STORE_TEMP_INT_PTR]], align 16
442*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR_INT:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
443*0a6a1f1dSLionel Sambuc   // CHECK: store atomic volatile i128 [[STORE_TEMP_INT]], i128* [[ADDR_INT]] seq_cst, align 16
444*0a6a1f1dSLionel Sambuc   // CHECK32-LABEL: @test_volatile_assign
445*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80* %{{.+}}, x86_fp80** [[ADDR_ADDR:%.+]], align 4
446*0a6a1f1dSLionel Sambuc   // CHECK32: [[ADDR:%.+]] = load x86_fp80** [[ADDR_ADDR]], align 4
447*0a6a1f1dSLionel Sambuc   // CHECK32: [[STORE_TEMP_VOID_PTR:%.+]] = bitcast x86_fp80* [[STORE_TEMP_PTR:%.+]] to i8*
448*0a6a1f1dSLionel Sambuc   // CHECK32: call void @llvm.memset.p0i8.i64(i8* [[STORE_TEMP_VOID_PTR]], i8 0, i64 12, i32 4, i1 false)
449*0a6a1f1dSLionel Sambuc   // CHECK32: store x86_fp80 {{.+}}, x86_fp80* [[STORE_TEMP_PTR]], align 4
450*0a6a1f1dSLionel Sambuc   // CHECK32: [[ADDR_VOID:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
451*0a6a1f1dSLionel Sambuc   // CHECK32: [[STORE_TEMP_VOID_PTR:%.+]] = bitcast x86_fp80* [[STORE_TEMP_PTR]] to i8*
452*0a6a1f1dSLionel Sambuc   // CHECK32: call void @__atomic_store(i32 12, i8* [[ADDR_VOID]], i8* [[STORE_TEMP_VOID_PTR]], i32 5)
453*0a6a1f1dSLionel Sambuc   *addr = 115;
454*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR:%.+]] = load x86_fp80** %{{.+}}, align 8
455*0a6a1f1dSLionel Sambuc   // CHECK: [[ADDR_INT:%.+]] = bitcast x86_fp80* [[ADDR]] to i128*
456*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_VAL:%.+]] = load atomic volatile i128* [[ADDR_INT]] seq_cst, align 16
457*0a6a1f1dSLionel Sambuc   // CHECK: [[INT_LD_TEMP:%.+]] = bitcast x86_fp80* [[LD_TEMP:%.+]] to i128*
458*0a6a1f1dSLionel Sambuc   // CHECK: store i128 [[INT_VAL]], i128* [[INT_LD_TEMP:%.+]], align 16
459*0a6a1f1dSLionel Sambuc   // CHECK: [[RET_VAL:%.+]] = load x86_fp80* [[LD_TEMP]], align 16
460*0a6a1f1dSLionel Sambuc   // CHECK: ret x86_fp80 [[RET_VAL]]
461*0a6a1f1dSLionel Sambuc   // CHECK32: [[ADDR:%.+]] = load x86_fp80** %{{.+}}, align 4
462*0a6a1f1dSLionel Sambuc   // CHECK32: [[VOID_ADDR:%.+]] = bitcast x86_fp80* [[ADDR]] to i8*
463*0a6a1f1dSLionel Sambuc   // CHECK32: [[VOID_LD_TEMP:%.+]] = bitcast x86_fp80* [[LD_TEMP:%.+]] to i8*
464*0a6a1f1dSLionel Sambuc   // CHECK32: call void @__atomic_load(i32 12, i8* [[VOID_ADDR]], i8* [[VOID_LD_TEMP]], i32 5)
465*0a6a1f1dSLionel Sambuc   // CHECK32: [[RET_VAL:%.+]] = load x86_fp80* [[LD_TEMP]], align 4
466*0a6a1f1dSLionel Sambuc   // CHECK32: ret x86_fp80 [[RET_VAL]]
467*0a6a1f1dSLionel Sambuc 
468*0a6a1f1dSLionel Sambuc   return *addr;
469*0a6a1f1dSLionel Sambuc }
470