xref: /llvm-project/llvm/test/Transforms/AtomicExpand/X86/expand-atomic-non-integer.ll (revision fe42e72db29e48aa81eac2aa922afd90a7f01517)
1; RUN: opt -S %s -passes=atomic-expand -mtriple=x86_64-linux-gnu | FileCheck %s
2
3; This file tests the functions `llvm::convertAtomicLoadToIntegerType` and
4; `llvm::convertAtomicStoreToIntegerType`. If X86 stops using this
5; functionality, please move this test to a target which still is.
6
7define float @float_load_expand(ptr %ptr) {
8; CHECK-LABEL: @float_load_expand
9; CHECK: %1 = load atomic i32, ptr %ptr unordered, align 4
10; CHECK: %2 = bitcast i32 %1 to float
11; CHECK: ret float %2
12  %res = load atomic float, ptr %ptr unordered, align 4
13  ret float %res
14}
15
16define float @float_load_expand_seq_cst(ptr %ptr) {
17; CHECK-LABEL: @float_load_expand_seq_cst
18; CHECK: %1 = load atomic i32, ptr %ptr seq_cst, align 4
19; CHECK: %2 = bitcast i32 %1 to float
20; CHECK: ret float %2
21  %res = load atomic float, ptr %ptr seq_cst, align 4
22  ret float %res
23}
24
25define float @float_load_expand_vol(ptr %ptr) {
26; CHECK-LABEL: @float_load_expand_vol
27; CHECK: %1 = load atomic volatile i32, ptr %ptr unordered, align 4
28; CHECK: %2 = bitcast i32 %1 to float
29; CHECK: ret float %2
30  %res = load atomic volatile float, ptr %ptr unordered, align 4
31  ret float %res
32}
33
34define float @float_load_expand_addr1(ptr addrspace(1) %ptr) {
35; CHECK-LABEL: @float_load_expand_addr1
36; CHECK: %1 = load atomic i32, ptr addrspace(1) %ptr unordered, align 4
37; CHECK: %2 = bitcast i32 %1 to float
38; CHECK: ret float %2
39  %res = load atomic float, ptr addrspace(1) %ptr unordered, align 4
40  ret float %res
41}
42
43define void @float_store_expand(ptr %ptr, float %v) {
44; CHECK-LABEL: @float_store_expand
45; CHECK: %1 = bitcast float %v to i32
46; CHECK: store atomic i32 %1, ptr %ptr unordered, align 4
47  store atomic float %v, ptr %ptr unordered, align 4
48  ret void
49}
50
51define void @float_store_expand_seq_cst(ptr %ptr, float %v) {
52; CHECK-LABEL: @float_store_expand_seq_cst
53; CHECK: %1 = bitcast float %v to i32
54; CHECK: store atomic i32 %1, ptr %ptr seq_cst, align 4
55  store atomic float %v, ptr %ptr seq_cst, align 4
56  ret void
57}
58
59define void @float_store_expand_vol(ptr %ptr, float %v) {
60; CHECK-LABEL: @float_store_expand_vol
61; CHECK: %1 = bitcast float %v to i32
62; CHECK: store atomic volatile i32 %1, ptr %ptr unordered, align 4
63  store atomic volatile float %v, ptr %ptr unordered, align 4
64  ret void
65}
66
67define void @float_store_expand_addr1(ptr addrspace(1) %ptr, float %v) {
68; CHECK-LABEL: @float_store_expand_addr1
69; CHECK: %1 = bitcast float %v to i32
70; CHECK: store atomic i32 %1, ptr addrspace(1) %ptr unordered, align 4
71  store atomic float %v, ptr addrspace(1) %ptr unordered, align 4
72  ret void
73}
74
75define void @pointer_cmpxchg_expand(ptr %ptr, ptr %v) {
76; CHECK-LABEL: @pointer_cmpxchg_expand
77; CHECK: %1 = ptrtoint ptr %v to i64
78; CHECK: %2 = cmpxchg ptr %ptr, i64 0, i64 %1 seq_cst monotonic
79; CHECK: %3 = extractvalue { i64, i1 } %2, 0
80; CHECK: %4 = extractvalue { i64, i1 } %2, 1
81; CHECK: %5 = inttoptr i64 %3 to ptr
82; CHECK: %6 = insertvalue { ptr, i1 } poison, ptr %5, 0
83; CHECK: %7 = insertvalue { ptr, i1 } %6, i1 %4, 1
84  cmpxchg ptr %ptr, ptr null, ptr %v seq_cst monotonic
85  ret void
86}
87
88define void @pointer_cmpxchg_expand2(ptr %ptr, ptr %v) {
89; CHECK-LABEL: @pointer_cmpxchg_expand2
90; CHECK: %1 = ptrtoint ptr %v to i64
91; CHECK: %2 = cmpxchg ptr %ptr, i64 0, i64 %1 release monotonic
92; CHECK: %3 = extractvalue { i64, i1 } %2, 0
93; CHECK: %4 = extractvalue { i64, i1 } %2, 1
94; CHECK: %5 = inttoptr i64 %3 to ptr
95; CHECK: %6 = insertvalue { ptr, i1 } poison, ptr %5, 0
96; CHECK: %7 = insertvalue { ptr, i1 } %6, i1 %4, 1
97  cmpxchg ptr %ptr, ptr null, ptr %v release monotonic
98  ret void
99}
100
101define void @pointer_cmpxchg_expand3(ptr %ptr, ptr %v) {
102; CHECK-LABEL: @pointer_cmpxchg_expand3
103; CHECK: %1 = ptrtoint ptr %v to i64
104; CHECK: %2 = cmpxchg ptr %ptr, i64 0, i64 %1 seq_cst seq_cst
105; CHECK: %3 = extractvalue { i64, i1 } %2, 0
106; CHECK: %4 = extractvalue { i64, i1 } %2, 1
107; CHECK: %5 = inttoptr i64 %3 to ptr
108; CHECK: %6 = insertvalue { ptr, i1 } poison, ptr %5, 0
109; CHECK: %7 = insertvalue { ptr, i1 } %6, i1 %4, 1
110  cmpxchg ptr %ptr, ptr null, ptr %v seq_cst seq_cst
111  ret void
112}
113
114define void @pointer_cmpxchg_expand4(ptr %ptr, ptr %v) {
115; CHECK-LABEL: @pointer_cmpxchg_expand4
116; CHECK: %1 = ptrtoint ptr %v to i64
117; CHECK: %2 = cmpxchg weak ptr %ptr, i64 0, i64 %1 seq_cst seq_cst
118; CHECK: %3 = extractvalue { i64, i1 } %2, 0
119; CHECK: %4 = extractvalue { i64, i1 } %2, 1
120; CHECK: %5 = inttoptr i64 %3 to ptr
121; CHECK: %6 = insertvalue { ptr, i1 } poison, ptr %5, 0
122; CHECK: %7 = insertvalue { ptr, i1 } %6, i1 %4, 1
123  cmpxchg weak ptr %ptr, ptr null, ptr %v seq_cst seq_cst
124  ret void
125}
126
127define void @pointer_cmpxchg_expand5(ptr %ptr, ptr %v) {
128; CHECK-LABEL: @pointer_cmpxchg_expand5
129; CHECK: %1 = ptrtoint ptr %v to i64
130; CHECK: %2 = cmpxchg volatile ptr %ptr, i64 0, i64 %1 seq_cst seq_cst
131; CHECK: %3 = extractvalue { i64, i1 } %2, 0
132; CHECK: %4 = extractvalue { i64, i1 } %2, 1
133; CHECK: %5 = inttoptr i64 %3 to ptr
134; CHECK: %6 = insertvalue { ptr, i1 } poison, ptr %5, 0
135; CHECK: %7 = insertvalue { ptr, i1 } %6, i1 %4, 1
136  cmpxchg volatile ptr %ptr, ptr null, ptr %v seq_cst seq_cst
137  ret void
138}
139
140define void @pointer_cmpxchg_expand6(ptr addrspace(1) %ptr,
141                                     ptr addrspace(2) %v) {
142; CHECK-LABEL: @pointer_cmpxchg_expand6
143; CHECK: %1 = ptrtoint ptr addrspace(2) %v to i64
144; CHECK: %2 = cmpxchg ptr addrspace(1) %ptr, i64 0, i64 %1 seq_cst seq_cst
145; CHECK: %3 = extractvalue { i64, i1 } %2, 0
146; CHECK: %4 = extractvalue { i64, i1 } %2, 1
147; CHECK: %5 = inttoptr i64 %3 to ptr addrspace(2)
148; CHECK: %6 = insertvalue { ptr addrspace(2), i1 } poison, ptr addrspace(2) %5, 0
149; CHECK: %7 = insertvalue { ptr addrspace(2), i1 } %6, i1 %4, 1
150  cmpxchg ptr addrspace(1) %ptr, ptr addrspace(2) null, ptr addrspace(2) %v seq_cst seq_cst
151  ret void
152}
153
154