1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --filter-out "\b(sp)\b" --filter "^\s*(ld|st[^r]|swp|cas|bl|add|and|eor|orn|orr|sub|mvn|sxt|cmp|ccmp|csel|dmb)"
2 ; The base test file was generated by ./llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
3 ; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64_be -mattr=+lse2,+rcpc3 -O0 | FileCheck %s --check-prefixes=CHECK,-O0
4 ; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64_be -mattr=+lse2,+rcpc3 -O1 | FileCheck %s --check-prefixes=CHECK,-O1
6 define dso_local i8 @load_atomic_i8_aligned_unordered(ptr %ptr) {
7 ; CHECK-LABEL: load_atomic_i8_aligned_unordered:
9 %r = load atomic i8, ptr %ptr unordered, align 1
13 define dso_local i8 @load_atomic_i8_aligned_unordered_const(ptr readonly %ptr) {
14 ; CHECK-LABEL: load_atomic_i8_aligned_unordered_const:
15 ; CHECK: ldrb w0, [x0]
16 %r = load atomic i8, ptr %ptr unordered, align 1
20 define dso_local i8 @load_atomic_i8_aligned_monotonic(ptr %ptr) {
21 ; CHECK-LABEL: load_atomic_i8_aligned_monotonic:
22 ; CHECK: ldrb w0, [x0]
23 %r = load atomic i8, ptr %ptr monotonic, align 1
27 define dso_local i8 @load_atomic_i8_aligned_monotonic_const(ptr readonly %ptr) {
28 ; CHECK-LABEL: load_atomic_i8_aligned_monotonic_const:
29 ; CHECK: ldrb w0, [x0]
30 %r = load atomic i8, ptr %ptr monotonic, align 1
34 define dso_local i8 @load_atomic_i8_aligned_acquire(ptr %ptr) {
35 ; CHECK-LABEL: load_atomic_i8_aligned_acquire:
36 ; CHECK: ldaprb w0, [x0]
37 %r = load atomic i8, ptr %ptr acquire, align 1
41 define dso_local i8 @load_atomic_i8_aligned_acquire_const(ptr readonly %ptr) {
42 ; CHECK-LABEL: load_atomic_i8_aligned_acquire_const:
43 ; CHECK: ldaprb w0, [x0]
44 %r = load atomic i8, ptr %ptr acquire, align 1
48 define dso_local i8 @load_atomic_i8_aligned_seq_cst(ptr %ptr) {
49 ; CHECK-LABEL: load_atomic_i8_aligned_seq_cst:
50 ; CHECK: ldarb w0, [x0]
51 %r = load atomic i8, ptr %ptr seq_cst, align 1
55 define dso_local i8 @load_atomic_i8_aligned_seq_cst_const(ptr readonly %ptr) {
56 ; CHECK-LABEL: load_atomic_i8_aligned_seq_cst_const:
57 ; CHECK: ldarb w0, [x0]
58 %r = load atomic i8, ptr %ptr seq_cst, align 1
62 define dso_local i16 @load_atomic_i16_aligned_unordered(ptr %ptr) {
63 ; CHECK-LABEL: load_atomic_i16_aligned_unordered:
64 ; CHECK: ldrh w0, [x0]
65 %r = load atomic i16, ptr %ptr unordered, align 2
69 define dso_local i16 @load_atomic_i16_aligned_unordered_const(ptr readonly %ptr) {
70 ; CHECK-LABEL: load_atomic_i16_aligned_unordered_const:
71 ; CHECK: ldrh w0, [x0]
72 %r = load atomic i16, ptr %ptr unordered, align 2
76 define dso_local i16 @load_atomic_i16_aligned_monotonic(ptr %ptr) {
77 ; CHECK-LABEL: load_atomic_i16_aligned_monotonic:
78 ; CHECK: ldrh w0, [x0]
79 %r = load atomic i16, ptr %ptr monotonic, align 2
83 define dso_local i16 @load_atomic_i16_aligned_monotonic_const(ptr readonly %ptr) {
84 ; CHECK-LABEL: load_atomic_i16_aligned_monotonic_const:
85 ; CHECK: ldrh w0, [x0]
86 %r = load atomic i16, ptr %ptr monotonic, align 2
90 define dso_local i16 @load_atomic_i16_aligned_acquire(ptr %ptr) {
91 ; CHECK-LABEL: load_atomic_i16_aligned_acquire:
92 ; CHECK: ldaprh w0, [x0]
93 %r = load atomic i16, ptr %ptr acquire, align 2
97 define dso_local i16 @load_atomic_i16_aligned_acquire_const(ptr readonly %ptr) {
98 ; CHECK-LABEL: load_atomic_i16_aligned_acquire_const:
99 ; CHECK: ldaprh w0, [x0]
100 %r = load atomic i16, ptr %ptr acquire, align 2
104 define dso_local i16 @load_atomic_i16_aligned_seq_cst(ptr %ptr) {
105 ; CHECK-LABEL: load_atomic_i16_aligned_seq_cst:
106 ; CHECK: ldarh w0, [x0]
107 %r = load atomic i16, ptr %ptr seq_cst, align 2
111 define dso_local i16 @load_atomic_i16_aligned_seq_cst_const(ptr readonly %ptr) {
112 ; CHECK-LABEL: load_atomic_i16_aligned_seq_cst_const:
113 ; CHECK: ldarh w0, [x0]
114 %r = load atomic i16, ptr %ptr seq_cst, align 2
118 define dso_local i32 @load_atomic_i32_aligned_unordered(ptr %ptr) {
119 ; CHECK-LABEL: load_atomic_i32_aligned_unordered:
120 ; CHECK: ldr w0, [x0]
121 %r = load atomic i32, ptr %ptr unordered, align 4
125 define dso_local i32 @load_atomic_i32_aligned_unordered_const(ptr readonly %ptr) {
126 ; CHECK-LABEL: load_atomic_i32_aligned_unordered_const:
127 ; CHECK: ldr w0, [x0]
128 %r = load atomic i32, ptr %ptr unordered, align 4
132 define dso_local i32 @load_atomic_i32_aligned_monotonic(ptr %ptr) {
133 ; CHECK-LABEL: load_atomic_i32_aligned_monotonic:
134 ; CHECK: ldr w0, [x0]
135 %r = load atomic i32, ptr %ptr monotonic, align 4
139 define dso_local i32 @load_atomic_i32_aligned_monotonic_const(ptr readonly %ptr) {
140 ; CHECK-LABEL: load_atomic_i32_aligned_monotonic_const:
141 ; CHECK: ldr w0, [x0]
142 %r = load atomic i32, ptr %ptr monotonic, align 4
146 define dso_local i32 @load_atomic_i32_aligned_acquire(ptr %ptr) {
147 ; CHECK-LABEL: load_atomic_i32_aligned_acquire:
148 ; CHECK: ldapr w0, [x0]
149 %r = load atomic i32, ptr %ptr acquire, align 4
153 define dso_local i32 @load_atomic_i32_aligned_acquire_const(ptr readonly %ptr) {
154 ; CHECK-LABEL: load_atomic_i32_aligned_acquire_const:
155 ; CHECK: ldapr w0, [x0]
156 %r = load atomic i32, ptr %ptr acquire, align 4
160 define dso_local i32 @load_atomic_i32_aligned_seq_cst(ptr %ptr) {
161 ; CHECK-LABEL: load_atomic_i32_aligned_seq_cst:
162 ; CHECK: ldar w0, [x0]
163 %r = load atomic i32, ptr %ptr seq_cst, align 4
167 define dso_local i32 @load_atomic_i32_aligned_seq_cst_const(ptr readonly %ptr) {
168 ; CHECK-LABEL: load_atomic_i32_aligned_seq_cst_const:
169 ; CHECK: ldar w0, [x0]
170 %r = load atomic i32, ptr %ptr seq_cst, align 4
174 define dso_local i64 @load_atomic_i64_aligned_unordered(ptr %ptr) {
175 ; CHECK-LABEL: load_atomic_i64_aligned_unordered:
176 ; CHECK: ldr x0, [x0]
177 %r = load atomic i64, ptr %ptr unordered, align 8
181 define dso_local i64 @load_atomic_i64_aligned_unordered_const(ptr readonly %ptr) {
182 ; CHECK-LABEL: load_atomic_i64_aligned_unordered_const:
183 ; CHECK: ldr x0, [x0]
184 %r = load atomic i64, ptr %ptr unordered, align 8
188 define dso_local i64 @load_atomic_i64_aligned_monotonic(ptr %ptr) {
189 ; CHECK-LABEL: load_atomic_i64_aligned_monotonic:
190 ; CHECK: ldr x0, [x0]
191 %r = load atomic i64, ptr %ptr monotonic, align 8
195 define dso_local i64 @load_atomic_i64_aligned_monotonic_const(ptr readonly %ptr) {
196 ; CHECK-LABEL: load_atomic_i64_aligned_monotonic_const:
197 ; CHECK: ldr x0, [x0]
198 %r = load atomic i64, ptr %ptr monotonic, align 8
202 define dso_local i64 @load_atomic_i64_aligned_acquire(ptr %ptr) {
203 ; CHECK-LABEL: load_atomic_i64_aligned_acquire:
204 ; CHECK: ldapr x0, [x0]
205 %r = load atomic i64, ptr %ptr acquire, align 8
209 define dso_local i64 @load_atomic_i64_aligned_acquire_const(ptr readonly %ptr) {
210 ; CHECK-LABEL: load_atomic_i64_aligned_acquire_const:
211 ; CHECK: ldapr x0, [x0]
212 %r = load atomic i64, ptr %ptr acquire, align 8
216 define dso_local i64 @load_atomic_i64_aligned_seq_cst(ptr %ptr) {
217 ; CHECK-LABEL: load_atomic_i64_aligned_seq_cst:
218 ; CHECK: ldar x0, [x0]
219 %r = load atomic i64, ptr %ptr seq_cst, align 8
223 define dso_local i64 @load_atomic_i64_aligned_seq_cst_const(ptr readonly %ptr) {
224 ; CHECK-LABEL: load_atomic_i64_aligned_seq_cst_const:
225 ; CHECK: ldar x0, [x0]
226 %r = load atomic i64, ptr %ptr seq_cst, align 8
230 define dso_local i128 @load_atomic_i128_aligned_unordered(ptr %ptr) {
231 ; CHECK-LABEL: load_atomic_i128_aligned_unordered:
232 ; CHECK: ldp x1, x0, [x0]
233 %r = load atomic i128, ptr %ptr unordered, align 16
237 define dso_local i128 @load_atomic_i128_aligned_unordered_const(ptr readonly %ptr) {
238 ; CHECK-LABEL: load_atomic_i128_aligned_unordered_const:
239 ; CHECK: ldp x1, x0, [x0]
240 %r = load atomic i128, ptr %ptr unordered, align 16
244 define dso_local i128 @load_atomic_i128_aligned_monotonic(ptr %ptr) {
245 ; CHECK-LABEL: load_atomic_i128_aligned_monotonic:
246 ; CHECK: ldp x1, x0, [x0]
247 %r = load atomic i128, ptr %ptr monotonic, align 16
251 define dso_local i128 @load_atomic_i128_aligned_monotonic_const(ptr readonly %ptr) {
252 ; CHECK-LABEL: load_atomic_i128_aligned_monotonic_const:
253 ; CHECK: ldp x1, x0, [x0]
254 %r = load atomic i128, ptr %ptr monotonic, align 16
258 define dso_local i128 @load_atomic_i128_aligned_acquire(ptr %ptr) {
259 ; CHECK-LABEL: load_atomic_i128_aligned_acquire:
260 ; CHECK: ldiapp x1, x0, [x0]
261 %r = load atomic i128, ptr %ptr acquire, align 16
265 define dso_local i128 @load_atomic_i128_aligned_acquire_const(ptr readonly %ptr) {
266 ; CHECK-LABEL: load_atomic_i128_aligned_acquire_const:
267 ; CHECK: ldiapp x1, x0, [x0]
268 %r = load atomic i128, ptr %ptr acquire, align 16
272 define dso_local i128 @load_atomic_i128_aligned_seq_cst(ptr %ptr) {
273 ; CHECK-LABEL: load_atomic_i128_aligned_seq_cst:
274 ; CHECK: ldp x1, x0, [x0]
276 %r = load atomic i128, ptr %ptr seq_cst, align 16
280 define dso_local i128 @load_atomic_i128_aligned_seq_cst_const(ptr readonly %ptr) {
281 ; CHECK-LABEL: load_atomic_i128_aligned_seq_cst_const:
282 ; CHECK: ldp x1, x0, [x0]
284 %r = load atomic i128, ptr %ptr seq_cst, align 16
288 define dso_local i8 @load_atomic_i8_unaligned_unordered(ptr %ptr) {
289 ; CHECK-LABEL: load_atomic_i8_unaligned_unordered:
290 ; CHECK: ldrb w0, [x0]
291 %r = load atomic i8, ptr %ptr unordered, align 1
295 define dso_local i8 @load_atomic_i8_unaligned_unordered_const(ptr readonly %ptr) {
296 ; CHECK-LABEL: load_atomic_i8_unaligned_unordered_const:
297 ; CHECK: ldrb w0, [x0]
298 %r = load atomic i8, ptr %ptr unordered, align 1
302 define dso_local i8 @load_atomic_i8_unaligned_monotonic(ptr %ptr) {
303 ; CHECK-LABEL: load_atomic_i8_unaligned_monotonic:
304 ; CHECK: ldrb w0, [x0]
305 %r = load atomic i8, ptr %ptr monotonic, align 1
309 define dso_local i8 @load_atomic_i8_unaligned_monotonic_const(ptr readonly %ptr) {
310 ; CHECK-LABEL: load_atomic_i8_unaligned_monotonic_const:
311 ; CHECK: ldrb w0, [x0]
312 %r = load atomic i8, ptr %ptr monotonic, align 1
316 define dso_local i8 @load_atomic_i8_unaligned_acquire(ptr %ptr) {
317 ; CHECK-LABEL: load_atomic_i8_unaligned_acquire:
318 ; CHECK: ldaprb w0, [x0]
319 %r = load atomic i8, ptr %ptr acquire, align 1
323 define dso_local i8 @load_atomic_i8_unaligned_acquire_const(ptr readonly %ptr) {
324 ; CHECK-LABEL: load_atomic_i8_unaligned_acquire_const:
325 ; CHECK: ldaprb w0, [x0]
326 %r = load atomic i8, ptr %ptr acquire, align 1
330 define dso_local i8 @load_atomic_i8_unaligned_seq_cst(ptr %ptr) {
331 ; CHECK-LABEL: load_atomic_i8_unaligned_seq_cst:
332 ; CHECK: ldarb w0, [x0]
333 %r = load atomic i8, ptr %ptr seq_cst, align 1
337 define dso_local i8 @load_atomic_i8_unaligned_seq_cst_const(ptr readonly %ptr) {
338 ; CHECK-LABEL: load_atomic_i8_unaligned_seq_cst_const:
339 ; CHECK: ldarb w0, [x0]
340 %r = load atomic i8, ptr %ptr seq_cst, align 1
344 define dso_local i16 @load_atomic_i16_unaligned_unordered(ptr %ptr) {
345 ; CHECK-LABEL: load_atomic_i16_unaligned_unordered:
346 ; CHECK: bl __atomic_load
347 %r = load atomic i16, ptr %ptr unordered, align 1
351 define dso_local i16 @load_atomic_i16_unaligned_unordered_const(ptr readonly %ptr) {
352 ; CHECK-LABEL: load_atomic_i16_unaligned_unordered_const:
353 ; CHECK: bl __atomic_load
354 %r = load atomic i16, ptr %ptr unordered, align 1
358 define dso_local i16 @load_atomic_i16_unaligned_monotonic(ptr %ptr) {
359 ; CHECK-LABEL: load_atomic_i16_unaligned_monotonic:
360 ; CHECK: bl __atomic_load
361 %r = load atomic i16, ptr %ptr monotonic, align 1
365 define dso_local i16 @load_atomic_i16_unaligned_monotonic_const(ptr readonly %ptr) {
366 ; CHECK-LABEL: load_atomic_i16_unaligned_monotonic_const:
367 ; CHECK: bl __atomic_load
368 %r = load atomic i16, ptr %ptr monotonic, align 1
372 define dso_local i16 @load_atomic_i16_unaligned_acquire(ptr %ptr) {
373 ; CHECK-LABEL: load_atomic_i16_unaligned_acquire:
374 ; CHECK: bl __atomic_load
375 %r = load atomic i16, ptr %ptr acquire, align 1
379 define dso_local i16 @load_atomic_i16_unaligned_acquire_const(ptr readonly %ptr) {
380 ; CHECK-LABEL: load_atomic_i16_unaligned_acquire_const:
381 ; CHECK: bl __atomic_load
382 %r = load atomic i16, ptr %ptr acquire, align 1
386 define dso_local i16 @load_atomic_i16_unaligned_seq_cst(ptr %ptr) {
387 ; CHECK-LABEL: load_atomic_i16_unaligned_seq_cst:
388 ; CHECK: bl __atomic_load
389 %r = load atomic i16, ptr %ptr seq_cst, align 1
393 define dso_local i16 @load_atomic_i16_unaligned_seq_cst_const(ptr readonly %ptr) {
394 ; CHECK-LABEL: load_atomic_i16_unaligned_seq_cst_const:
395 ; CHECK: bl __atomic_load
396 %r = load atomic i16, ptr %ptr seq_cst, align 1
400 define dso_local i32 @load_atomic_i32_unaligned_unordered(ptr %ptr) {
401 ; CHECK-LABEL: load_atomic_i32_unaligned_unordered:
402 ; CHECK: bl __atomic_load
403 %r = load atomic i32, ptr %ptr unordered, align 1
407 define dso_local i32 @load_atomic_i32_unaligned_unordered_const(ptr readonly %ptr) {
408 ; CHECK-LABEL: load_atomic_i32_unaligned_unordered_const:
409 ; CHECK: bl __atomic_load
410 %r = load atomic i32, ptr %ptr unordered, align 1
414 define dso_local i32 @load_atomic_i32_unaligned_monotonic(ptr %ptr) {
415 ; CHECK-LABEL: load_atomic_i32_unaligned_monotonic:
416 ; CHECK: bl __atomic_load
417 %r = load atomic i32, ptr %ptr monotonic, align 1
421 define dso_local i32 @load_atomic_i32_unaligned_monotonic_const(ptr readonly %ptr) {
422 ; CHECK-LABEL: load_atomic_i32_unaligned_monotonic_const:
423 ; CHECK: bl __atomic_load
424 %r = load atomic i32, ptr %ptr monotonic, align 1
428 define dso_local i32 @load_atomic_i32_unaligned_acquire(ptr %ptr) {
429 ; CHECK-LABEL: load_atomic_i32_unaligned_acquire:
430 ; CHECK: bl __atomic_load
431 %r = load atomic i32, ptr %ptr acquire, align 1
435 define dso_local i32 @load_atomic_i32_unaligned_acquire_const(ptr readonly %ptr) {
436 ; CHECK-LABEL: load_atomic_i32_unaligned_acquire_const:
437 ; CHECK: bl __atomic_load
438 %r = load atomic i32, ptr %ptr acquire, align 1
442 define dso_local i32 @load_atomic_i32_unaligned_seq_cst(ptr %ptr) {
443 ; CHECK-LABEL: load_atomic_i32_unaligned_seq_cst:
444 ; CHECK: bl __atomic_load
445 %r = load atomic i32, ptr %ptr seq_cst, align 1
449 define dso_local i32 @load_atomic_i32_unaligned_seq_cst_const(ptr readonly %ptr) {
450 ; CHECK-LABEL: load_atomic_i32_unaligned_seq_cst_const:
451 ; CHECK: bl __atomic_load
452 %r = load atomic i32, ptr %ptr seq_cst, align 1
456 define dso_local i64 @load_atomic_i64_unaligned_unordered(ptr %ptr) {
457 ; CHECK-LABEL: load_atomic_i64_unaligned_unordered:
458 ; CHECK: bl __atomic_load
459 %r = load atomic i64, ptr %ptr unordered, align 1
463 define dso_local i64 @load_atomic_i64_unaligned_unordered_const(ptr readonly %ptr) {
464 ; CHECK-LABEL: load_atomic_i64_unaligned_unordered_const:
465 ; CHECK: bl __atomic_load
466 %r = load atomic i64, ptr %ptr unordered, align 1
470 define dso_local i64 @load_atomic_i64_unaligned_monotonic(ptr %ptr) {
471 ; CHECK-LABEL: load_atomic_i64_unaligned_monotonic:
472 ; CHECK: bl __atomic_load
473 %r = load atomic i64, ptr %ptr monotonic, align 1
477 define dso_local i64 @load_atomic_i64_unaligned_monotonic_const(ptr readonly %ptr) {
478 ; CHECK-LABEL: load_atomic_i64_unaligned_monotonic_const:
479 ; CHECK: bl __atomic_load
480 %r = load atomic i64, ptr %ptr monotonic, align 1
484 define dso_local i64 @load_atomic_i64_unaligned_acquire(ptr %ptr) {
485 ; CHECK-LABEL: load_atomic_i64_unaligned_acquire:
486 ; CHECK: bl __atomic_load
487 %r = load atomic i64, ptr %ptr acquire, align 1
491 define dso_local i64 @load_atomic_i64_unaligned_acquire_const(ptr readonly %ptr) {
492 ; CHECK-LABEL: load_atomic_i64_unaligned_acquire_const:
493 ; CHECK: bl __atomic_load
494 %r = load atomic i64, ptr %ptr acquire, align 1
498 define dso_local i64 @load_atomic_i64_unaligned_seq_cst(ptr %ptr) {
499 ; CHECK-LABEL: load_atomic_i64_unaligned_seq_cst:
500 ; CHECK: bl __atomic_load
501 %r = load atomic i64, ptr %ptr seq_cst, align 1
505 define dso_local i64 @load_atomic_i64_unaligned_seq_cst_const(ptr readonly %ptr) {
506 ; CHECK-LABEL: load_atomic_i64_unaligned_seq_cst_const:
507 ; CHECK: bl __atomic_load
508 %r = load atomic i64, ptr %ptr seq_cst, align 1
512 define dso_local i128 @load_atomic_i128_unaligned_unordered(ptr %ptr) {
513 ; CHECK-LABEL: load_atomic_i128_unaligned_unordered:
514 ; CHECK: bl __atomic_load
515 %r = load atomic i128, ptr %ptr unordered, align 1
519 define dso_local i128 @load_atomic_i128_unaligned_unordered_const(ptr readonly %ptr) {
520 ; CHECK-LABEL: load_atomic_i128_unaligned_unordered_const:
521 ; CHECK: bl __atomic_load
522 %r = load atomic i128, ptr %ptr unordered, align 1
526 define dso_local i128 @load_atomic_i128_unaligned_monotonic(ptr %ptr) {
527 ; CHECK-LABEL: load_atomic_i128_unaligned_monotonic:
528 ; CHECK: bl __atomic_load
529 %r = load atomic i128, ptr %ptr monotonic, align 1
533 define dso_local i128 @load_atomic_i128_unaligned_monotonic_const(ptr readonly %ptr) {
534 ; CHECK-LABEL: load_atomic_i128_unaligned_monotonic_const:
535 ; CHECK: bl __atomic_load
536 %r = load atomic i128, ptr %ptr monotonic, align 1
540 define dso_local i128 @load_atomic_i128_unaligned_acquire(ptr %ptr) {
541 ; CHECK-LABEL: load_atomic_i128_unaligned_acquire:
542 ; CHECK: bl __atomic_load
543 %r = load atomic i128, ptr %ptr acquire, align 1
547 define dso_local i128 @load_atomic_i128_unaligned_acquire_const(ptr readonly %ptr) {
548 ; CHECK-LABEL: load_atomic_i128_unaligned_acquire_const:
549 ; CHECK: bl __atomic_load
550 %r = load atomic i128, ptr %ptr acquire, align 1
554 define dso_local i128 @load_atomic_i128_unaligned_seq_cst(ptr %ptr) {
555 ; CHECK-LABEL: load_atomic_i128_unaligned_seq_cst:
556 ; CHECK: bl __atomic_load
557 %r = load atomic i128, ptr %ptr seq_cst, align 1
561 define dso_local i128 @load_atomic_i128_unaligned_seq_cst_const(ptr readonly %ptr) {
562 ; CHECK-LABEL: load_atomic_i128_unaligned_seq_cst_const:
563 ; CHECK: bl __atomic_load
564 %r = load atomic i128, ptr %ptr seq_cst, align 1
567 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: