4
4
// RUN: | opt -S --passes=mem2reg | FileCheck --check-prefix=HYBRID %s
5
5
// RUN: %riscv64_cheri_purecap_cc1 -target-feature +a -std=c11 -o - -emit-llvm -disable-O0-optnone %s -verify \
6
6
// RUN: | opt -S --passes=mem2reg | FileCheck --check-prefix=PURECAP %s
7
+ // expected-no-diagnostics
7
8
8
9
typedef struct capstruct {
9
10
unsigned __intcap value ;
@@ -36,24 +37,25 @@ void test_init(_Atomic(capstruct) *f, capstruct value) {
36
37
// HYBRID-NEXT: entry:
37
38
// HYBRID-NEXT: [[RETVAL:%.*]] = alloca [[STRUCT_CAPSTRUCT:%.*]], align 16
38
39
// HYBRID-NEXT: [[ATOMIC_TEMP:%.*]] = alloca [[STRUCT_CAPSTRUCT]], align 16
39
- // HYBRID-NEXT: call void @__atomic_load(i64 noundef 16, ptr noundef [[F]], ptr noundef [[ATOMIC_TEMP]], i32 noundef signext 5)
40
+ // HYBRID-NEXT: [[TMP0:%.*]] = load atomic ptr addrspace(200), ptr [[F]] seq_cst, align 16
41
+ // HYBRID-NEXT: store ptr addrspace(200) [[TMP0]], ptr [[ATOMIC_TEMP]], align 16
40
42
// HYBRID-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[RETVAL]], ptr align 16 [[ATOMIC_TEMP]], i64 16, i1 false)
41
- // HYBRID-NEXT: [[TMP0 :%.*]] = load [[STRUCT_CAPSTRUCT]], ptr [[RETVAL]], align 16
42
- // HYBRID-NEXT: ret [[STRUCT_CAPSTRUCT]] [[TMP0 ]]
43
+ // HYBRID-NEXT: [[TMP1 :%.*]] = load [[STRUCT_CAPSTRUCT]], ptr [[RETVAL]], align 16
44
+ // HYBRID-NEXT: ret [[STRUCT_CAPSTRUCT]] [[TMP1 ]]
43
45
//
44
46
// PURECAP-LABEL: define {{[^@]+}}@test_load
45
47
// PURECAP-SAME: (ptr addrspace(200) noundef [[F:%.*]]) addrspace(200) #[[ATTR0]] {
46
48
// PURECAP-NEXT: entry:
47
49
// PURECAP-NEXT: [[RETVAL:%.*]] = alloca [[STRUCT_CAPSTRUCT:%.*]], align 16, addrspace(200)
48
50
// PURECAP-NEXT: [[ATOMIC_TEMP:%.*]] = alloca [[STRUCT_CAPSTRUCT]], align 16, addrspace(200)
49
- // PURECAP-NEXT: call void @__atomic_load(i64 noundef 16, ptr addrspace(200) noundef [[F]], ptr addrspace(200) noundef [[ATOMIC_TEMP]], i32 noundef signext 5)
51
+ // PURECAP-NEXT: [[TMP0:%.*]] = load atomic ptr addrspace(200), ptr addrspace(200) [[F]] seq_cst, align 16
52
+ // PURECAP-NEXT: store ptr addrspace(200) [[TMP0]], ptr addrspace(200) [[ATOMIC_TEMP]], align 16
50
53
// PURECAP-NEXT: call void @llvm.memcpy.p200.p200.i64(ptr addrspace(200) align 16 [[RETVAL]], ptr addrspace(200) align 16 [[ATOMIC_TEMP]], i64 16, i1 false)
51
- // PURECAP-NEXT: [[TMP0 :%.*]] = load [[STRUCT_CAPSTRUCT]], ptr addrspace(200) [[RETVAL]], align 16
52
- // PURECAP-NEXT: ret [[STRUCT_CAPSTRUCT]] [[TMP0 ]]
54
+ // PURECAP-NEXT: [[TMP1 :%.*]] = load [[STRUCT_CAPSTRUCT]], ptr addrspace(200) [[RETVAL]], align 16
55
+ // PURECAP-NEXT: ret [[STRUCT_CAPSTRUCT]] [[TMP1 ]]
53
56
//
54
57
capstruct test_load (_Atomic (capstruct ) * f ) {
55
58
return __c11_atomic_load (f , __ATOMIC_SEQ_CST );
56
- // expected-warning@-1{{large atomic operation may incur significant performance penalty}}
57
59
}
58
60
59
61
// HYBRID-LABEL: define {{[^@]+}}@test_store
@@ -64,7 +66,8 @@ capstruct test_load(_Atomic(capstruct) *f) {
64
66
// HYBRID-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds [[STRUCT_CAPSTRUCT]], ptr [[VALUE]], i32 0, i32 0
65
67
// HYBRID-NEXT: store ptr addrspace(200) [[VALUE_COERCE]], ptr [[COERCE_DIVE]], align 16
66
68
// HYBRID-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[DOTATOMICTMP]], ptr align 16 [[VALUE]], i64 16, i1 false)
67
- // HYBRID-NEXT: call void @__atomic_store(i64 noundef 16, ptr noundef [[F]], ptr noundef [[DOTATOMICTMP]], i32 noundef signext 5)
69
+ // HYBRID-NEXT: [[TMP0:%.*]] = load ptr addrspace(200), ptr [[DOTATOMICTMP]], align 16
70
+ // HYBRID-NEXT: store atomic ptr addrspace(200) [[TMP0]], ptr [[F]] seq_cst, align 16
68
71
// HYBRID-NEXT: ret void
69
72
//
70
73
// PURECAP-LABEL: define {{[^@]+}}@test_store
@@ -75,12 +78,12 @@ capstruct test_load(_Atomic(capstruct) *f) {
75
78
// PURECAP-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds [[STRUCT_CAPSTRUCT]], ptr addrspace(200) [[VALUE]], i32 0, i32 0
76
79
// PURECAP-NEXT: store ptr addrspace(200) [[VALUE_COERCE]], ptr addrspace(200) [[COERCE_DIVE]], align 16
77
80
// PURECAP-NEXT: call void @llvm.memcpy.p200.p200.i64(ptr addrspace(200) align 16 [[DOTATOMICTMP]], ptr addrspace(200) align 16 [[VALUE]], i64 16, i1 false)
78
- // PURECAP-NEXT: call void @__atomic_store(i64 noundef 16, ptr addrspace(200) noundef [[F]], ptr addrspace(200) noundef [[DOTATOMICTMP]], i32 noundef signext 5)
81
+ // PURECAP-NEXT: [[TMP0:%.*]] = load ptr addrspace(200), ptr addrspace(200) [[DOTATOMICTMP]], align 16
82
+ // PURECAP-NEXT: store atomic ptr addrspace(200) [[TMP0]], ptr addrspace(200) [[F]] seq_cst, align 16
79
83
// PURECAP-NEXT: ret void
80
84
//
81
85
void test_store (_Atomic (capstruct ) * f , capstruct value ) {
82
86
__c11_atomic_store (f , value , __ATOMIC_SEQ_CST );
83
- // expected-warning@-1{{large atomic operation may incur significant performance penalty}}
84
87
}
85
88
86
89
// HYBRID-LABEL: define {{[^@]+}}@test_xchg
@@ -93,10 +96,12 @@ void test_store(_Atomic(capstruct) *f, capstruct value) {
93
96
// HYBRID-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds [[STRUCT_CAPSTRUCT]], ptr [[VALUE]], i32 0, i32 0
94
97
// HYBRID-NEXT: store ptr addrspace(200) [[VALUE_COERCE]], ptr [[COERCE_DIVE]], align 16
95
98
// HYBRID-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[DOTATOMICTMP]], ptr align 16 [[VALUE]], i64 16, i1 false)
96
- // HYBRID-NEXT: call void @__atomic_exchange(i64 noundef 16, ptr noundef [[F]], ptr noundef [[DOTATOMICTMP]], ptr noundef [[ATOMIC_TEMP]], i32 noundef signext 5)
99
+ // HYBRID-NEXT: [[TMP0:%.*]] = load ptr addrspace(200), ptr [[DOTATOMICTMP]], align 16
100
+ // HYBRID-NEXT: [[TMP1:%.*]] = atomicrmw xchg ptr [[F]], ptr addrspace(200) [[TMP0]] seq_cst, align 16
101
+ // HYBRID-NEXT: store ptr addrspace(200) [[TMP1]], ptr [[ATOMIC_TEMP]], align 16
97
102
// HYBRID-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[RETVAL]], ptr align 16 [[ATOMIC_TEMP]], i64 16, i1 false)
98
- // HYBRID-NEXT: [[TMP0 :%.*]] = load [[STRUCT_CAPSTRUCT]], ptr [[RETVAL]], align 16
99
- // HYBRID-NEXT: ret [[STRUCT_CAPSTRUCT]] [[TMP0 ]]
103
+ // HYBRID-NEXT: [[TMP2 :%.*]] = load [[STRUCT_CAPSTRUCT]], ptr [[RETVAL]], align 16
104
+ // HYBRID-NEXT: ret [[STRUCT_CAPSTRUCT]] [[TMP2 ]]
100
105
//
101
106
// PURECAP-LABEL: define {{[^@]+}}@test_xchg
102
107
// PURECAP-SAME: (ptr addrspace(200) noundef [[F:%.*]], ptr addrspace(200) [[VALUE_COERCE:%.*]]) addrspace(200) #[[ATTR0]] {
@@ -108,14 +113,15 @@ void test_store(_Atomic(capstruct) *f, capstruct value) {
108
113
// PURECAP-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds [[STRUCT_CAPSTRUCT]], ptr addrspace(200) [[VALUE]], i32 0, i32 0
109
114
// PURECAP-NEXT: store ptr addrspace(200) [[VALUE_COERCE]], ptr addrspace(200) [[COERCE_DIVE]], align 16
110
115
// PURECAP-NEXT: call void @llvm.memcpy.p200.p200.i64(ptr addrspace(200) align 16 [[DOTATOMICTMP]], ptr addrspace(200) align 16 [[VALUE]], i64 16, i1 false)
111
- // PURECAP-NEXT: call void @__atomic_exchange(i64 noundef 16, ptr addrspace(200) noundef [[F]], ptr addrspace(200) noundef [[DOTATOMICTMP]], ptr addrspace(200) noundef [[ATOMIC_TEMP]], i32 noundef signext 5)
116
+ // PURECAP-NEXT: [[TMP0:%.*]] = load ptr addrspace(200), ptr addrspace(200) [[DOTATOMICTMP]], align 16
117
+ // PURECAP-NEXT: [[TMP1:%.*]] = atomicrmw xchg ptr addrspace(200) [[F]], ptr addrspace(200) [[TMP0]] seq_cst, align 16
118
+ // PURECAP-NEXT: store ptr addrspace(200) [[TMP1]], ptr addrspace(200) [[ATOMIC_TEMP]], align 16
112
119
// PURECAP-NEXT: call void @llvm.memcpy.p200.p200.i64(ptr addrspace(200) align 16 [[RETVAL]], ptr addrspace(200) align 16 [[ATOMIC_TEMP]], i64 16, i1 false)
113
- // PURECAP-NEXT: [[TMP0 :%.*]] = load [[STRUCT_CAPSTRUCT]], ptr addrspace(200) [[RETVAL]], align 16
114
- // PURECAP-NEXT: ret [[STRUCT_CAPSTRUCT]] [[TMP0 ]]
120
+ // PURECAP-NEXT: [[TMP2 :%.*]] = load [[STRUCT_CAPSTRUCT]], ptr addrspace(200) [[RETVAL]], align 16
121
+ // PURECAP-NEXT: ret [[STRUCT_CAPSTRUCT]] [[TMP2 ]]
115
122
//
116
123
capstruct test_xchg (_Atomic (capstruct ) * f , capstruct value ) {
117
124
return __c11_atomic_exchange (f , value , __ATOMIC_SEQ_CST );
118
- // expected-warning@-1{{large atomic operation may incur significant performance penalty}}
119
125
}
120
126
121
127
// HYBRID-LABEL: define {{[^@]+}}@test_cmpxchg_weak
@@ -126,8 +132,19 @@ capstruct test_xchg(_Atomic(capstruct) *f, capstruct value) {
126
132
// HYBRID-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds [[STRUCT_CAPSTRUCT]], ptr [[NEW]], i32 0, i32 0
127
133
// HYBRID-NEXT: store ptr addrspace(200) [[NEW_COERCE]], ptr [[COERCE_DIVE]], align 16
128
134
// HYBRID-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[DOTATOMICTMP]], ptr align 16 [[NEW]], i64 16, i1 false)
129
- // HYBRID-NEXT: [[CALL:%.*]] = call zeroext i1 @__atomic_compare_exchange(i64 noundef 16, ptr noundef [[F]], ptr noundef [[EXP]], ptr noundef [[DOTATOMICTMP]], i32 noundef signext 0, i32 noundef signext 0)
130
- // HYBRID-NEXT: ret i1 [[CALL]]
135
+ // HYBRID-NEXT: [[TMP0:%.*]] = load ptr addrspace(200), ptr [[EXP]], align 16
136
+ // HYBRID-NEXT: [[TMP1:%.*]] = load ptr addrspace(200), ptr [[DOTATOMICTMP]], align 16
137
+ // HYBRID-NEXT: [[TMP2:%.*]] = cmpxchg weak ptr [[F]], ptr addrspace(200) [[TMP0]], ptr addrspace(200) [[TMP1]] monotonic monotonic, align 16
138
+ // HYBRID-NEXT: [[TMP3:%.*]] = extractvalue { ptr addrspace(200), i1 } [[TMP2]], 0
139
+ // HYBRID-NEXT: [[TMP4:%.*]] = extractvalue { ptr addrspace(200), i1 } [[TMP2]], 1
140
+ // HYBRID-NEXT: br i1 [[TMP4]], label [[CMPXCHG_CONTINUE:%.*]], label [[CMPXCHG_STORE_EXPECTED:%.*]]
141
+ // HYBRID: cmpxchg.store_expected:
142
+ // HYBRID-NEXT: store ptr addrspace(200) [[TMP3]], ptr [[EXP]], align 16
143
+ // HYBRID-NEXT: br label [[CMPXCHG_CONTINUE]]
144
+ // HYBRID: cmpxchg.continue:
145
+ // HYBRID-NEXT: [[FROMBOOL:%.*]] = zext i1 [[TMP4]] to i8
146
+ // HYBRID-NEXT: [[TOBOOL:%.*]] = trunc i8 [[FROMBOOL]] to i1
147
+ // HYBRID-NEXT: ret i1 [[TOBOOL]]
131
148
//
132
149
// PURECAP-LABEL: define {{[^@]+}}@test_cmpxchg_weak
133
150
// PURECAP-SAME: (ptr addrspace(200) noundef [[F:%.*]], ptr addrspace(200) noundef [[EXP:%.*]], ptr addrspace(200) [[NEW_COERCE:%.*]]) addrspace(200) #[[ATTR0]] {
@@ -137,12 +154,22 @@ capstruct test_xchg(_Atomic(capstruct) *f, capstruct value) {
137
154
// PURECAP-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds [[STRUCT_CAPSTRUCT]], ptr addrspace(200) [[NEW]], i32 0, i32 0
138
155
// PURECAP-NEXT: store ptr addrspace(200) [[NEW_COERCE]], ptr addrspace(200) [[COERCE_DIVE]], align 16
139
156
// PURECAP-NEXT: call void @llvm.memcpy.p200.p200.i64(ptr addrspace(200) align 16 [[DOTATOMICTMP]], ptr addrspace(200) align 16 [[NEW]], i64 16, i1 false)
140
- // PURECAP-NEXT: [[CALL:%.*]] = call zeroext i1 @__atomic_compare_exchange(i64 noundef 16, ptr addrspace(200) noundef [[F]], ptr addrspace(200) noundef [[EXP]], ptr addrspace(200) noundef [[DOTATOMICTMP]], i32 noundef signext 0, i32 noundef signext 0)
141
- // PURECAP-NEXT: ret i1 [[CALL]]
157
+ // PURECAP-NEXT: [[TMP0:%.*]] = load ptr addrspace(200), ptr addrspace(200) [[EXP]], align 16
158
+ // PURECAP-NEXT: [[TMP1:%.*]] = load ptr addrspace(200), ptr addrspace(200) [[DOTATOMICTMP]], align 16
159
+ // PURECAP-NEXT: [[TMP2:%.*]] = cmpxchg weak ptr addrspace(200) [[F]], ptr addrspace(200) [[TMP0]], ptr addrspace(200) [[TMP1]] monotonic monotonic, align 16
160
+ // PURECAP-NEXT: [[TMP3:%.*]] = extractvalue { ptr addrspace(200), i1 } [[TMP2]], 0
161
+ // PURECAP-NEXT: [[TMP4:%.*]] = extractvalue { ptr addrspace(200), i1 } [[TMP2]], 1
162
+ // PURECAP-NEXT: br i1 [[TMP4]], label [[CMPXCHG_CONTINUE:%.*]], label [[CMPXCHG_STORE_EXPECTED:%.*]]
163
+ // PURECAP: cmpxchg.store_expected:
164
+ // PURECAP-NEXT: store ptr addrspace(200) [[TMP3]], ptr addrspace(200) [[EXP]], align 16
165
+ // PURECAP-NEXT: br label [[CMPXCHG_CONTINUE]]
166
+ // PURECAP: cmpxchg.continue:
167
+ // PURECAP-NEXT: [[FROMBOOL:%.*]] = zext i1 [[TMP4]] to i8
168
+ // PURECAP-NEXT: [[TOBOOL:%.*]] = trunc i8 [[FROMBOOL]] to i1
169
+ // PURECAP-NEXT: ret i1 [[TOBOOL]]
142
170
//
143
171
_Bool test_cmpxchg_weak (_Atomic (capstruct ) * f , capstruct * exp , capstruct new ) {
144
172
return __c11_atomic_compare_exchange_weak (f , exp , new , __ATOMIC_RELAXED , __ATOMIC_RELAXED );
145
- // expected-warning@-1{{large atomic operation may incur significant performance penalty}}
146
173
}
147
174
148
175
// HYBRID-LABEL: define {{[^@]+}}@test_cmpxchg_strong
@@ -153,8 +180,19 @@ _Bool test_cmpxchg_weak(_Atomic(capstruct) *f, capstruct *exp, capstruct new) {
153
180
// HYBRID-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds [[STRUCT_CAPSTRUCT]], ptr [[NEW]], i32 0, i32 0
154
181
// HYBRID-NEXT: store ptr addrspace(200) [[NEW_COERCE]], ptr [[COERCE_DIVE]], align 16
155
182
// HYBRID-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[DOTATOMICTMP]], ptr align 16 [[NEW]], i64 16, i1 false)
156
- // HYBRID-NEXT: [[CALL:%.*]] = call zeroext i1 @__atomic_compare_exchange(i64 noundef 16, ptr noundef [[F]], ptr noundef [[EXP]], ptr noundef [[DOTATOMICTMP]], i32 noundef signext 0, i32 noundef signext 0)
157
- // HYBRID-NEXT: ret i1 [[CALL]]
183
+ // HYBRID-NEXT: [[TMP0:%.*]] = load ptr addrspace(200), ptr [[EXP]], align 16
184
+ // HYBRID-NEXT: [[TMP1:%.*]] = load ptr addrspace(200), ptr [[DOTATOMICTMP]], align 16
185
+ // HYBRID-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[F]], ptr addrspace(200) [[TMP0]], ptr addrspace(200) [[TMP1]] monotonic monotonic, align 16
186
+ // HYBRID-NEXT: [[TMP3:%.*]] = extractvalue { ptr addrspace(200), i1 } [[TMP2]], 0
187
+ // HYBRID-NEXT: [[TMP4:%.*]] = extractvalue { ptr addrspace(200), i1 } [[TMP2]], 1
188
+ // HYBRID-NEXT: br i1 [[TMP4]], label [[CMPXCHG_CONTINUE:%.*]], label [[CMPXCHG_STORE_EXPECTED:%.*]]
189
+ // HYBRID: cmpxchg.store_expected:
190
+ // HYBRID-NEXT: store ptr addrspace(200) [[TMP3]], ptr [[EXP]], align 16
191
+ // HYBRID-NEXT: br label [[CMPXCHG_CONTINUE]]
192
+ // HYBRID: cmpxchg.continue:
193
+ // HYBRID-NEXT: [[FROMBOOL:%.*]] = zext i1 [[TMP4]] to i8
194
+ // HYBRID-NEXT: [[TOBOOL:%.*]] = trunc i8 [[FROMBOOL]] to i1
195
+ // HYBRID-NEXT: ret i1 [[TOBOOL]]
158
196
//
159
197
// PURECAP-LABEL: define {{[^@]+}}@test_cmpxchg_strong
160
198
// PURECAP-SAME: (ptr addrspace(200) noundef [[F:%.*]], ptr addrspace(200) noundef [[EXP:%.*]], ptr addrspace(200) [[NEW_COERCE:%.*]]) addrspace(200) #[[ATTR0]] {
@@ -164,10 +202,20 @@ _Bool test_cmpxchg_weak(_Atomic(capstruct) *f, capstruct *exp, capstruct new) {
164
202
// PURECAP-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds [[STRUCT_CAPSTRUCT]], ptr addrspace(200) [[NEW]], i32 0, i32 0
165
203
// PURECAP-NEXT: store ptr addrspace(200) [[NEW_COERCE]], ptr addrspace(200) [[COERCE_DIVE]], align 16
166
204
// PURECAP-NEXT: call void @llvm.memcpy.p200.p200.i64(ptr addrspace(200) align 16 [[DOTATOMICTMP]], ptr addrspace(200) align 16 [[NEW]], i64 16, i1 false)
167
- // PURECAP-NEXT: [[CALL:%.*]] = call zeroext i1 @__atomic_compare_exchange(i64 noundef 16, ptr addrspace(200) noundef [[F]], ptr addrspace(200) noundef [[EXP]], ptr addrspace(200) noundef [[DOTATOMICTMP]], i32 noundef signext 0, i32 noundef signext 0)
168
- // PURECAP-NEXT: ret i1 [[CALL]]
205
+ // PURECAP-NEXT: [[TMP0:%.*]] = load ptr addrspace(200), ptr addrspace(200) [[EXP]], align 16
206
+ // PURECAP-NEXT: [[TMP1:%.*]] = load ptr addrspace(200), ptr addrspace(200) [[DOTATOMICTMP]], align 16
207
+ // PURECAP-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(200) [[F]], ptr addrspace(200) [[TMP0]], ptr addrspace(200) [[TMP1]] monotonic monotonic, align 16
208
+ // PURECAP-NEXT: [[TMP3:%.*]] = extractvalue { ptr addrspace(200), i1 } [[TMP2]], 0
209
+ // PURECAP-NEXT: [[TMP4:%.*]] = extractvalue { ptr addrspace(200), i1 } [[TMP2]], 1
210
+ // PURECAP-NEXT: br i1 [[TMP4]], label [[CMPXCHG_CONTINUE:%.*]], label [[CMPXCHG_STORE_EXPECTED:%.*]]
211
+ // PURECAP: cmpxchg.store_expected:
212
+ // PURECAP-NEXT: store ptr addrspace(200) [[TMP3]], ptr addrspace(200) [[EXP]], align 16
213
+ // PURECAP-NEXT: br label [[CMPXCHG_CONTINUE]]
214
+ // PURECAP: cmpxchg.continue:
215
+ // PURECAP-NEXT: [[FROMBOOL:%.*]] = zext i1 [[TMP4]] to i8
216
+ // PURECAP-NEXT: [[TOBOOL:%.*]] = trunc i8 [[FROMBOOL]] to i1
217
+ // PURECAP-NEXT: ret i1 [[TOBOOL]]
169
218
//
170
219
_Bool test_cmpxchg_strong (_Atomic (capstruct ) * f , capstruct * exp , capstruct new ) {
171
220
return __c11_atomic_compare_exchange_strong (f , exp , new , __ATOMIC_RELAXED , __ATOMIC_RELAXED );
172
- // expected-warning@-1{{large atomic operation may incur significant performance penalty}}
173
221
}
0 commit comments