|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
1 | 2 | ; RUN: opt -S %s -passes=atomic-expand -mtriple=x86_64-linux-gnu | FileCheck %s
|
2 | 3 |
|
3 | 4 | ; This file tests the functions `llvm::convertAtomicLoadToIntegerType` and
|
4 |
| -; `llvm::convertAtomicStoreToIntegerType`. If X86 stops using this |
| 5 | +; `llvm::convertAtomicStoreToIntegerType`. If X86 stops using this |
5 | 6 | ; functionality, please move this test to a target which still is.
|
6 | 7 |
|
7 | 8 | define 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 |
| 9 | +; CHECK-LABEL: define float @float_load_expand( |
| 10 | +; CHECK-SAME: ptr [[PTR:%.*]]) { |
| 11 | +; CHECK-NEXT: [[TMP1:%.*]] = load atomic i32, ptr [[PTR]] unordered, align 4 |
| 12 | +; CHECK-NEXT: [[TMP2:%.*]] = bitcast i32 [[TMP1]] to float |
| 13 | +; CHECK-NEXT: ret float [[TMP2]] |
| 14 | +; |
12 | 15 | %res = load atomic float, ptr %ptr unordered, align 4
|
13 | 16 | ret float %res
|
14 | 17 | }
|
15 | 18 |
|
16 | 19 | define 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 |
| 20 | +; CHECK-LABEL: define float @float_load_expand_seq_cst( |
| 21 | +; CHECK-SAME: ptr [[PTR:%.*]]) { |
| 22 | +; CHECK-NEXT: [[TMP1:%.*]] = load atomic i32, ptr [[PTR]] seq_cst, align 4 |
| 23 | +; CHECK-NEXT: [[TMP2:%.*]] = bitcast i32 [[TMP1]] to float |
| 24 | +; CHECK-NEXT: ret float [[TMP2]] |
| 25 | +; |
21 | 26 | %res = load atomic float, ptr %ptr seq_cst, align 4
|
22 | 27 | ret float %res
|
23 | 28 | }
|
24 | 29 |
|
25 | 30 | define 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 |
| 31 | +; CHECK-LABEL: define float @float_load_expand_vol( |
| 32 | +; CHECK-SAME: ptr [[PTR:%.*]]) { |
| 33 | +; CHECK-NEXT: [[TMP1:%.*]] = load atomic volatile i32, ptr [[PTR]] unordered, align 4 |
| 34 | +; CHECK-NEXT: [[TMP2:%.*]] = bitcast i32 [[TMP1]] to float |
| 35 | +; CHECK-NEXT: ret float [[TMP2]] |
| 36 | +; |
30 | 37 | %res = load atomic volatile float, ptr %ptr unordered, align 4
|
31 | 38 | ret float %res
|
32 | 39 | }
|
33 | 40 |
|
34 | 41 | define 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 |
| 42 | +; CHECK-LABEL: define float @float_load_expand_addr1( |
| 43 | +; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) { |
| 44 | +; CHECK-NEXT: [[TMP1:%.*]] = load atomic i32, ptr addrspace(1) [[PTR]] unordered, align 4 |
| 45 | +; CHECK-NEXT: [[TMP2:%.*]] = bitcast i32 [[TMP1]] to float |
| 46 | +; CHECK-NEXT: ret float [[TMP2]] |
| 47 | +; |
39 | 48 | %res = load atomic float, ptr addrspace(1) %ptr unordered, align 4
|
40 | 49 | ret float %res
|
41 | 50 | }
|
42 | 51 |
|
43 | 52 | define 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 |
| 53 | +; CHECK-LABEL: define void @float_store_expand( |
| 54 | +; CHECK-SAME: ptr [[PTR:%.*]], float [[V:%.*]]) { |
| 55 | +; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[V]] to i32 |
| 56 | +; CHECK-NEXT: store atomic i32 [[TMP1]], ptr [[PTR]] unordered, align 4 |
| 57 | +; CHECK-NEXT: ret void |
| 58 | +; |
47 | 59 | store atomic float %v, ptr %ptr unordered, align 4
|
48 | 60 | ret void
|
49 | 61 | }
|
50 | 62 |
|
51 | 63 | define 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 |
| 64 | +; CHECK-LABEL: define void @float_store_expand_seq_cst( |
| 65 | +; CHECK-SAME: ptr [[PTR:%.*]], float [[V:%.*]]) { |
| 66 | +; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[V]] to i32 |
| 67 | +; CHECK-NEXT: store atomic i32 [[TMP1]], ptr [[PTR]] seq_cst, align 4 |
| 68 | +; CHECK-NEXT: ret void |
| 69 | +; |
55 | 70 | store atomic float %v, ptr %ptr seq_cst, align 4
|
56 | 71 | ret void
|
57 | 72 | }
|
58 | 73 |
|
59 | 74 | define 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 |
| 75 | +; CHECK-LABEL: define void @float_store_expand_vol( |
| 76 | +; CHECK-SAME: ptr [[PTR:%.*]], float [[V:%.*]]) { |
| 77 | +; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[V]] to i32 |
| 78 | +; CHECK-NEXT: store atomic volatile i32 [[TMP1]], ptr [[PTR]] unordered, align 4 |
| 79 | +; CHECK-NEXT: ret void |
| 80 | +; |
63 | 81 | store atomic volatile float %v, ptr %ptr unordered, align 4
|
64 | 82 | ret void
|
65 | 83 | }
|
66 | 84 |
|
67 | 85 | define 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 |
| 86 | +; CHECK-LABEL: define void @float_store_expand_addr1( |
| 87 | +; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]], float [[V:%.*]]) { |
| 88 | +; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[V]] to i32 |
| 89 | +; CHECK-NEXT: store atomic i32 [[TMP1]], ptr addrspace(1) [[PTR]] unordered, align 4 |
| 90 | +; CHECK-NEXT: ret void |
| 91 | +; |
71 | 92 | store atomic float %v, ptr addrspace(1) %ptr unordered, align 4
|
72 | 93 | ret void
|
73 | 94 | }
|
74 | 95 |
|
75 | 96 | define 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 |
| 97 | +; CHECK-LABEL: define void @pointer_cmpxchg_expand( |
| 98 | +; CHECK-SAME: ptr [[PTR:%.*]], ptr [[V:%.*]]) { |
| 99 | +; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[V]] to i64 |
| 100 | +; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[PTR]], i64 0, i64 [[TMP1]] seq_cst monotonic, align 8 |
| 101 | +; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP2]], 0 |
| 102 | +; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i64, i1 } [[TMP2]], 1 |
| 103 | +; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP3]] to ptr |
| 104 | +; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { ptr, i1 } poison, ptr [[TMP5]], 0 |
| 105 | +; CHECK-NEXT: [[TMP7:%.*]] = insertvalue { ptr, i1 } [[TMP6]], i1 [[TMP4]], 1 |
| 106 | +; CHECK-NEXT: ret void |
| 107 | +; |
84 | 108 | cmpxchg ptr %ptr, ptr null, ptr %v seq_cst monotonic
|
85 | 109 | ret void
|
86 | 110 | }
|
87 | 111 |
|
88 | 112 | define 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 |
| 113 | +; CHECK-LABEL: define void @pointer_cmpxchg_expand2( |
| 114 | +; CHECK-SAME: ptr [[PTR:%.*]], ptr [[V:%.*]]) { |
| 115 | +; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[V]] to i64 |
| 116 | +; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[PTR]], i64 0, i64 [[TMP1]] release monotonic, align 8 |
| 117 | +; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP2]], 0 |
| 118 | +; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i64, i1 } [[TMP2]], 1 |
| 119 | +; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP3]] to ptr |
| 120 | +; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { ptr, i1 } poison, ptr [[TMP5]], 0 |
| 121 | +; CHECK-NEXT: [[TMP7:%.*]] = insertvalue { ptr, i1 } [[TMP6]], i1 [[TMP4]], 1 |
| 122 | +; CHECK-NEXT: ret void |
| 123 | +; |
97 | 124 | cmpxchg ptr %ptr, ptr null, ptr %v release monotonic
|
98 | 125 | ret void
|
99 | 126 | }
|
100 | 127 |
|
101 | 128 | define 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 |
| 129 | +; CHECK-LABEL: define void @pointer_cmpxchg_expand3( |
| 130 | +; CHECK-SAME: ptr [[PTR:%.*]], ptr [[V:%.*]]) { |
| 131 | +; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[V]] to i64 |
| 132 | +; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[PTR]], i64 0, i64 [[TMP1]] seq_cst seq_cst, align 8 |
| 133 | +; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP2]], 0 |
| 134 | +; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i64, i1 } [[TMP2]], 1 |
| 135 | +; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP3]] to ptr |
| 136 | +; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { ptr, i1 } poison, ptr [[TMP5]], 0 |
| 137 | +; CHECK-NEXT: [[TMP7:%.*]] = insertvalue { ptr, i1 } [[TMP6]], i1 [[TMP4]], 1 |
| 138 | +; CHECK-NEXT: ret void |
| 139 | +; |
110 | 140 | cmpxchg ptr %ptr, ptr null, ptr %v seq_cst seq_cst
|
111 | 141 | ret void
|
112 | 142 | }
|
113 | 143 |
|
114 | 144 | define 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 |
| 145 | +; CHECK-LABEL: define void @pointer_cmpxchg_expand4( |
| 146 | +; CHECK-SAME: ptr [[PTR:%.*]], ptr [[V:%.*]]) { |
| 147 | +; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[V]] to i64 |
| 148 | +; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg weak ptr [[PTR]], i64 0, i64 [[TMP1]] seq_cst seq_cst, align 8 |
| 149 | +; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP2]], 0 |
| 150 | +; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i64, i1 } [[TMP2]], 1 |
| 151 | +; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP3]] to ptr |
| 152 | +; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { ptr, i1 } poison, ptr [[TMP5]], 0 |
| 153 | +; CHECK-NEXT: [[TMP7:%.*]] = insertvalue { ptr, i1 } [[TMP6]], i1 [[TMP4]], 1 |
| 154 | +; CHECK-NEXT: ret void |
| 155 | +; |
123 | 156 | cmpxchg weak ptr %ptr, ptr null, ptr %v seq_cst seq_cst
|
124 | 157 | ret void
|
125 | 158 | }
|
126 | 159 |
|
127 | 160 | define 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 |
| 161 | +; CHECK-LABEL: define void @pointer_cmpxchg_expand5( |
| 162 | +; CHECK-SAME: ptr [[PTR:%.*]], ptr [[V:%.*]]) { |
| 163 | +; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[V]] to i64 |
| 164 | +; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg volatile ptr [[PTR]], i64 0, i64 [[TMP1]] seq_cst seq_cst, align 8 |
| 165 | +; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP2]], 0 |
| 166 | +; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i64, i1 } [[TMP2]], 1 |
| 167 | +; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP3]] to ptr |
| 168 | +; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { ptr, i1 } poison, ptr [[TMP5]], 0 |
| 169 | +; CHECK-NEXT: [[TMP7:%.*]] = insertvalue { ptr, i1 } [[TMP6]], i1 [[TMP4]], 1 |
| 170 | +; CHECK-NEXT: ret void |
| 171 | +; |
136 | 172 | cmpxchg volatile ptr %ptr, ptr null, ptr %v seq_cst seq_cst
|
137 | 173 | ret void
|
138 | 174 | }
|
139 | 175 |
|
140 |
| -define 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 |
| 176 | +define void @pointer_cmpxchg_expand6(ptr addrspace(1) %ptr, ptr addrspace(2) %v) { |
| 177 | +; CHECK-LABEL: define void @pointer_cmpxchg_expand6( |
| 178 | +; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]], ptr addrspace(2) [[V:%.*]]) { |
| 179 | +; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(2) [[V]] to i64 |
| 180 | +; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i64 0, i64 [[TMP1]] seq_cst seq_cst, align 8 |
| 181 | +; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP2]], 0 |
| 182 | +; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i64, i1 } [[TMP2]], 1 |
| 183 | +; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP3]] to ptr addrspace(2) |
| 184 | +; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { ptr addrspace(2), i1 } poison, ptr addrspace(2) [[TMP5]], 0 |
| 185 | +; CHECK-NEXT: [[TMP7:%.*]] = insertvalue { ptr addrspace(2), i1 } [[TMP6]], i1 [[TMP4]], 1 |
| 186 | +; CHECK-NEXT: ret void |
| 187 | +; |
150 | 188 | cmpxchg ptr addrspace(1) %ptr, ptr addrspace(2) null, ptr addrspace(2) %v seq_cst seq_cst
|
151 | 189 | ret void
|
152 | 190 | }
|
|
0 commit comments