|
1 |
| -; RUN: llc -O0 -aarch64-enable-atomic-cfg-tidy=0 -stop-after=irtranslator -global-isel -verify-machineinstrs %s -o - 2>&1 | FileCheck %s |
2 |
| -; RUN: llc -O3 -aarch64-enable-atomic-cfg-tidy=0 -stop-after=irtranslator -global-isel -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefix=O3 |
| 1 | +; RUN: llc -O0 -aarch64-enable-atomic-cfg-tidy=0 -mattr=+lse -stop-after=irtranslator -global-isel -verify-machineinstrs %s -o - 2>&1 | FileCheck %s |
| 2 | +; RUN: llc -O3 -aarch64-enable-atomic-cfg-tidy=0 -mattr=+lse -stop-after=irtranslator -global-isel -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefix=O3 |
3 | 3 |
|
4 | 4 | ; This file checks that the translation from llvm IR to generic MachineInstr
|
5 | 5 | ; is correct.
|
@@ -2077,190 +2077,147 @@ done:
|
2077 | 2077 | }
|
2078 | 2078 |
|
2079 | 2079 | ; Try a monotonic atomicrmw xchg
|
2080 |
| -; AArch64 will expand some atomicrmw's at the LLVM-IR level so we use a wide type to avoid this. |
2081 | 2080 | define i32 @test_atomicrmw_xchg(ptr %addr) {
|
2082 | 2081 | ; CHECK-LABEL: name: test_atomicrmw_xchg
|
2083 | 2082 | ; CHECK: bb.1 (%ir-block.{{[0-9]+}}):
|
2084 | 2083 | ; CHECK-NEXT: liveins: $x0
|
2085 | 2084 | ; CHECK: [[ADDR:%[0-9]+]]:_(p0) = COPY $x0
|
2086 |
| -; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s256) = G_CONSTANT i256 1 |
2087 |
| -; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s256) = G_ATOMICRMW_XCHG [[ADDR]](p0), [[VAL]] :: (load store monotonic (s256) on %ir.addr) |
2088 |
| -; CHECK-NEXT: [[RES:%[0-9]+]]:_(s32) = G_TRUNC [[OLDVALRES]] |
2089 |
| - %oldval = atomicrmw xchg ptr %addr, i256 1 monotonic |
2090 |
| - ; FIXME: We currently can't lower 'ret i256' and it's not the purpose of this |
2091 |
| - ; test so work around it by truncating to i32 for now. |
2092 |
| - %oldval.trunc = trunc i256 %oldval to i32 |
2093 |
| - ret i32 %oldval.trunc |
| 2085 | +; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 |
| 2086 | +; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s32) = G_ATOMICRMW_XCHG [[ADDR]](p0), [[VAL]] :: (load store monotonic (s32) on %ir.addr) |
| 2087 | + %oldval = atomicrmw xchg ptr %addr, i32 1 monotonic |
| 2088 | + ret i32 %oldval |
2094 | 2089 | }
|
2095 | 2090 |
|
2096 | 2091 | ; Try an acquire atomicrmw add
|
2097 |
| -; AArch64 will expand some atomicrmw's at the LLVM-IR level so we use a wide type to avoid this. |
2098 | 2092 | define i32 @test_atomicrmw_add(ptr %addr) {
|
2099 | 2093 | ; CHECK-LABEL: name: test_atomicrmw_add
|
2100 | 2094 | ; CHECK: bb.1 (%ir-block.{{[0-9]+}}):
|
2101 | 2095 | ; CHECK-NEXT: liveins: $x0
|
2102 | 2096 | ; CHECK: [[ADDR:%[0-9]+]]:_(p0) = COPY $x0
|
2103 |
| -; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s256) = G_CONSTANT i256 1 |
2104 |
| -; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s256) = G_ATOMICRMW_ADD [[ADDR]](p0), [[VAL]] :: (load store acquire (s256) on %ir.addr) |
2105 |
| -; CHECK-NEXT: [[RES:%[0-9]+]]:_(s32) = G_TRUNC [[OLDVALRES]] |
2106 |
| - %oldval = atomicrmw add ptr %addr, i256 1 acquire |
2107 |
| - ; FIXME: We currently can't lower 'ret i256' and it's not the purpose of this |
2108 |
| - ; test so work around it by truncating to i32 for now. |
2109 |
| - %oldval.trunc = trunc i256 %oldval to i32 |
2110 |
| - ret i32 %oldval.trunc |
| 2097 | +; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 |
| 2098 | +; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s32) = G_ATOMICRMW_ADD [[ADDR]](p0), [[VAL]] :: (load store acquire (s32) on %ir.addr) |
| 2099 | + %oldval = atomicrmw add ptr %addr, i32 1 acquire |
| 2100 | + ret i32 %oldval |
2111 | 2101 | }
|
2112 | 2102 |
|
2113 | 2103 | ; Try a release atomicrmw sub
|
2114 |
| -; AArch64 will expand some atomicrmw's at the LLVM-IR level so we use a wide type to avoid this. |
2115 | 2104 | define i32 @test_atomicrmw_sub(ptr %addr) {
|
2116 | 2105 | ; CHECK-LABEL: name: test_atomicrmw_sub
|
2117 | 2106 | ; CHECK: bb.1 (%ir-block.{{[0-9]+}}):
|
2118 | 2107 | ; CHECK-NEXT: liveins: $x0
|
2119 | 2108 | ; CHECK: [[ADDR:%[0-9]+]]:_(p0) = COPY $x0
|
2120 |
| -; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s256) = G_CONSTANT i256 1 |
2121 |
| -; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s256) = G_ATOMICRMW_SUB [[ADDR]](p0), [[VAL]] :: (load store release (s256) on %ir.addr) |
2122 |
| -; CHECK-NEXT: [[RES:%[0-9]+]]:_(s32) = G_TRUNC [[OLDVALRES]] |
2123 |
| - %oldval = atomicrmw sub ptr %addr, i256 1 release |
2124 |
| - ; FIXME: We currently can't lower 'ret i256' and it's not the purpose of this |
2125 |
| - ; test so work around it by truncating to i32 for now. |
2126 |
| - %oldval.trunc = trunc i256 %oldval to i32 |
2127 |
| - ret i32 %oldval.trunc |
| 2109 | +; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 |
| 2110 | +; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s32) = G_ATOMICRMW_SUB [[ADDR]](p0), [[VAL]] :: (load store release (s32) on %ir.addr) |
| 2111 | + %oldval = atomicrmw sub ptr %addr, i32 1 release |
| 2112 | + ret i32 %oldval |
2128 | 2113 | }
|
2129 | 2114 |
|
2130 | 2115 | ; Try an acq_rel atomicrmw and
|
2131 |
| -; AArch64 will expand some atomicrmw's at the LLVM-IR level so we use a wide type to avoid this. |
2132 | 2116 | define i32 @test_atomicrmw_and(ptr %addr) {
|
2133 | 2117 | ; CHECK-LABEL: name: test_atomicrmw_and
|
2134 | 2118 | ; CHECK: bb.1 (%ir-block.{{[0-9]+}}):
|
2135 | 2119 | ; CHECK-NEXT: liveins: $x0
|
2136 | 2120 | ; CHECK: [[ADDR:%[0-9]+]]:_(p0) = COPY $x0
|
2137 |
| -; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s256) = G_CONSTANT i256 1 |
2138 |
| -; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s256) = G_ATOMICRMW_AND [[ADDR]](p0), [[VAL]] :: (load store acq_rel (s256) on %ir.addr) |
2139 |
| -; CHECK-NEXT: [[RES:%[0-9]+]]:_(s32) = G_TRUNC [[OLDVALRES]] |
2140 |
| - %oldval = atomicrmw and ptr %addr, i256 1 acq_rel |
2141 |
| - ; FIXME: We currently can't lower 'ret i256' and it's not the purpose of this |
2142 |
| - ; test so work around it by truncating to i32 for now. |
2143 |
| - %oldval.trunc = trunc i256 %oldval to i32 |
2144 |
| - ret i32 %oldval.trunc |
2145 |
| -} |
2146 |
| - |
2147 |
| -; Try an seq_cst atomicrmw nand |
2148 |
| -; AArch64 will expand some atomicrmw's at the LLVM-IR level so we use a wide type to avoid this. |
| 2121 | +; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 |
| 2122 | +; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s32) = G_ATOMICRMW_AND [[ADDR]](p0), [[VAL]] :: (load store acq_rel (s32) on %ir.addr) |
| 2123 | + %oldval = atomicrmw and ptr %addr, i32 1 acq_rel |
| 2124 | + ret i32 %oldval |
| 2125 | +} |
| 2126 | + |
| 2127 | +; Try an seq_cst atomicrmw nand. NAND isn't supported by LSE, so it |
| 2128 | +; expands to G_ATOMIC_CMPXCHG_WITH_SUCCESS. |
2149 | 2129 | define i32 @test_atomicrmw_nand(ptr %addr) {
|
2150 | 2130 | ; CHECK-LABEL: name: test_atomicrmw_nand
|
2151 | 2131 | ; CHECK: bb.1 (%ir-block.{{[0-9]+}}):
|
| 2132 | +; CHECK-NEXT: successors: %bb.2(0x80000000) |
2152 | 2133 | ; CHECK-NEXT: liveins: $x0
|
2153 | 2134 | ; CHECK: [[ADDR:%[0-9]+]]:_(p0) = COPY $x0
|
2154 |
| -; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s256) = G_CONSTANT i256 1 |
2155 |
| -; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s256) = G_ATOMICRMW_NAND [[ADDR]](p0), [[VAL]] :: (load store seq_cst (s256) on %ir.addr) |
2156 |
| -; CHECK-NEXT: [[RES:%[0-9]+]]:_(s32) = G_TRUNC [[OLDVALRES]] |
2157 |
| - %oldval = atomicrmw nand ptr %addr, i256 1 seq_cst |
2158 |
| - ; FIXME: We currently can't lower 'ret i256' and it's not the purpose of this |
2159 |
| - ; test so work around it by truncating to i32 for now. |
2160 |
| - %oldval.trunc = trunc i256 %oldval to i32 |
2161 |
| - ret i32 %oldval.trunc |
| 2135 | +; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 |
| 2136 | +; CHECK-NEXT: [[NEG1:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1 |
| 2137 | +; CHECK-NEXT: [[OLDVALSTART:%[0-9]+]]:_(s32) = G_LOAD [[ADDR]](p0) :: (load (s32) from %ir.addr) |
| 2138 | +; CHECK: bb.2.atomicrmw.start: |
| 2139 | +; CHECK-NEXT: successors: %bb.3({{[^)]+}}), %bb.2({{[^)]+}}) |
| 2140 | +; CHECK: [[OLDVAL:%[0-9]+]]:_(s32) = G_PHI [[OLDVALSTART]](s32), %bb.1, [[OLDVALRES:%[0-9]+]](s32), %bb.2 |
| 2141 | +; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[OLDVAL]], [[VAL]] |
| 2142 | +; CHECK-NEXT: [[NEWVAL:%[0-9]+]]:_(s32) = G_XOR [[AND]], [[NEG1]] |
| 2143 | +; CHECK: [[OLDVALRES]]:_(s32), [[SUCCESS:%[0-9]+]]:_(s1) = G_ATOMIC_CMPXCHG_WITH_SUCCESS [[ADDR]](p0), [[OLDVAL]], [[NEWVAL]] :: (load store seq_cst seq_cst (s32) on %ir.addr) |
| 2144 | +; CHECK-NEXT: G_BRCOND [[SUCCESS]](s1), %bb.3 |
| 2145 | +; CHECK-NEXT: G_BR %bb.2 |
| 2146 | +; CHECK: bb.3.atomicrmw.end: |
| 2147 | + %oldval = atomicrmw nand ptr %addr, i32 1 seq_cst |
| 2148 | + ret i32 %oldval |
2162 | 2149 | }
|
2163 | 2150 |
|
2164 | 2151 | ; Try an seq_cst atomicrmw or
|
2165 |
| -; AArch64 will expand some atomicrmw's at the LLVM-IR level so we use a wide type to avoid this. |
2166 | 2152 | define i32 @test_atomicrmw_or(ptr %addr) {
|
2167 | 2153 | ; CHECK-LABEL: name: test_atomicrmw_or
|
2168 | 2154 | ; CHECK: bb.1 (%ir-block.{{[0-9]+}}):
|
2169 | 2155 | ; CHECK-NEXT: liveins: $x0
|
2170 | 2156 | ; CHECK: [[ADDR:%[0-9]+]]:_(p0) = COPY $x0
|
2171 |
| -; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s256) = G_CONSTANT i256 1 |
2172 |
| -; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s256) = G_ATOMICRMW_OR [[ADDR]](p0), [[VAL]] :: (load store seq_cst (s256) on %ir.addr) |
2173 |
| -; CHECK-NEXT: [[RES:%[0-9]+]]:_(s32) = G_TRUNC [[OLDVALRES]] |
2174 |
| - %oldval = atomicrmw or ptr %addr, i256 1 seq_cst |
2175 |
| - ; FIXME: We currently can't lower 'ret i256' and it's not the purpose of this |
2176 |
| - ; test so work around it by truncating to i32 for now. |
2177 |
| - %oldval.trunc = trunc i256 %oldval to i32 |
2178 |
| - ret i32 %oldval.trunc |
| 2157 | +; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 |
| 2158 | +; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s32) = G_ATOMICRMW_OR [[ADDR]](p0), [[VAL]] :: (load store seq_cst (s32) on %ir.addr) |
| 2159 | + %oldval = atomicrmw or ptr %addr, i32 1 seq_cst |
| 2160 | + ret i32 %oldval |
2179 | 2161 | }
|
2180 | 2162 |
|
2181 | 2163 | ; Try an seq_cst atomicrmw xor
|
2182 |
| -; AArch64 will expand some atomicrmw's at the LLVM-IR level so we use a wide type to avoid this. |
2183 | 2164 | define i32 @test_atomicrmw_xor(ptr %addr) {
|
2184 | 2165 | ; CHECK-LABEL: name: test_atomicrmw_xor
|
2185 | 2166 | ; CHECK: bb.1 (%ir-block.{{[0-9]+}}):
|
2186 | 2167 | ; CHECK-NEXT: liveins: $x0
|
2187 | 2168 | ; CHECK: [[ADDR:%[0-9]+]]:_(p0) = COPY $x0
|
2188 |
| -; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s256) = G_CONSTANT i256 1 |
2189 |
| -; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s256) = G_ATOMICRMW_XOR [[ADDR]](p0), [[VAL]] :: (load store seq_cst (s256) on %ir.addr) |
2190 |
| -; CHECK-NEXT: [[RES:%[0-9]+]]:_(s32) = G_TRUNC [[OLDVALRES]] |
2191 |
| - %oldval = atomicrmw xor ptr %addr, i256 1 seq_cst |
2192 |
| - ; FIXME: We currently can't lower 'ret i256' and it's not the purpose of this |
2193 |
| - ; test so work around it by truncating to i32 for now. |
2194 |
| - %oldval.trunc = trunc i256 %oldval to i32 |
2195 |
| - ret i32 %oldval.trunc |
| 2169 | +; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 |
| 2170 | +; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s32) = G_ATOMICRMW_XOR [[ADDR]](p0), [[VAL]] :: (load store seq_cst (s32) on %ir.addr) |
| 2171 | + %oldval = atomicrmw xor ptr %addr, i32 1 seq_cst |
| 2172 | + ret i32 %oldval |
2196 | 2173 | }
|
2197 | 2174 |
|
2198 | 2175 | ; Try an seq_cst atomicrmw min
|
2199 |
| -; AArch64 will expand some atomicrmw's at the LLVM-IR level so we use a wide type to avoid this. |
2200 | 2176 | define i32 @test_atomicrmw_min(ptr %addr) {
|
2201 | 2177 | ; CHECK-LABEL: name: test_atomicrmw_min
|
2202 | 2178 | ; CHECK: bb.1 (%ir-block.{{[0-9]+}}):
|
2203 | 2179 | ; CHECK-NEXT: liveins: $x0
|
2204 | 2180 | ; CHECK: [[ADDR:%[0-9]+]]:_(p0) = COPY $x0
|
2205 |
| -; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s256) = G_CONSTANT i256 1 |
2206 |
| -; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s256) = G_ATOMICRMW_MIN [[ADDR]](p0), [[VAL]] :: (load store seq_cst (s256) on %ir.addr) |
2207 |
| -; CHECK-NEXT: [[RES:%[0-9]+]]:_(s32) = G_TRUNC [[OLDVALRES]] |
2208 |
| - %oldval = atomicrmw min ptr %addr, i256 1 seq_cst |
2209 |
| - ; FIXME: We currently can't lower 'ret i256' and it's not the purpose of this |
2210 |
| - ; test so work around it by truncating to i32 for now. |
2211 |
| - %oldval.trunc = trunc i256 %oldval to i32 |
2212 |
| - ret i32 %oldval.trunc |
| 2181 | +; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 |
| 2182 | +; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s32) = G_ATOMICRMW_MIN [[ADDR]](p0), [[VAL]] :: (load store seq_cst (s32) on %ir.addr) |
| 2183 | + %oldval = atomicrmw min ptr %addr, i32 1 seq_cst |
| 2184 | + ret i32 %oldval |
2213 | 2185 | }
|
2214 | 2186 |
|
2215 | 2187 | ; Try an seq_cst atomicrmw max
|
2216 |
| -; AArch64 will expand some atomicrmw's at the LLVM-IR level so we use a wide type to avoid this. |
2217 | 2188 | define i32 @test_atomicrmw_max(ptr %addr) {
|
2218 | 2189 | ; CHECK-LABEL: name: test_atomicrmw_max
|
2219 | 2190 | ; CHECK: bb.1 (%ir-block.{{[0-9]+}}):
|
2220 | 2191 | ; CHECK-NEXT: liveins: $x0
|
2221 | 2192 | ; CHECK: [[ADDR:%[0-9]+]]:_(p0) = COPY $x0
|
2222 |
| -; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s256) = G_CONSTANT i256 1 |
2223 |
| -; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s256) = G_ATOMICRMW_MAX [[ADDR]](p0), [[VAL]] :: (load store seq_cst (s256) on %ir.addr) |
2224 |
| -; CHECK-NEXT: [[RES:%[0-9]+]]:_(s32) = G_TRUNC [[OLDVALRES]] |
2225 |
| - %oldval = atomicrmw max ptr %addr, i256 1 seq_cst |
2226 |
| - ; FIXME: We currently can't lower 'ret i256' and it's not the purpose of this |
2227 |
| - ; test so work around it by truncating to i32 for now. |
2228 |
| - %oldval.trunc = trunc i256 %oldval to i32 |
2229 |
| - ret i32 %oldval.trunc |
| 2193 | +; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 |
| 2194 | +; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s32) = G_ATOMICRMW_MAX [[ADDR]](p0), [[VAL]] :: (load store seq_cst (s32) on %ir.addr) |
| 2195 | + %oldval = atomicrmw max ptr %addr, i32 1 seq_cst |
| 2196 | + ret i32 %oldval |
2230 | 2197 | }
|
2231 | 2198 |
|
2232 | 2199 | ; Try an seq_cst atomicrmw unsigned min
|
2233 |
| -; AArch64 will expand some atomicrmw's at the LLVM-IR level so we use a wide type to avoid this. |
2234 | 2200 | define i32 @test_atomicrmw_umin(ptr %addr) {
|
2235 | 2201 | ; CHECK-LABEL: name: test_atomicrmw_umin
|
2236 | 2202 | ; CHECK: bb.1 (%ir-block.{{[0-9]+}}):
|
2237 | 2203 | ; CHECK-NEXT: liveins: $x0
|
2238 | 2204 | ; CHECK: [[ADDR:%[0-9]+]]:_(p0) = COPY $x0
|
2239 |
| -; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s256) = G_CONSTANT i256 1 |
2240 |
| -; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s256) = G_ATOMICRMW_UMIN [[ADDR]](p0), [[VAL]] :: (load store seq_cst (s256) on %ir.addr) |
2241 |
| -; CHECK-NEXT: [[RES:%[0-9]+]]:_(s32) = G_TRUNC [[OLDVALRES]] |
2242 |
| - %oldval = atomicrmw umin ptr %addr, i256 1 seq_cst |
2243 |
| - ; FIXME: We currently can't lower 'ret i256' and it's not the purpose of this |
2244 |
| - ; test so work around it by truncating to i32 for now. |
2245 |
| - %oldval.trunc = trunc i256 %oldval to i32 |
2246 |
| - ret i32 %oldval.trunc |
| 2205 | +; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 |
| 2206 | +; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s32) = G_ATOMICRMW_UMIN [[ADDR]](p0), [[VAL]] :: (load store seq_cst (s32) on %ir.addr) |
| 2207 | + %oldval = atomicrmw umin ptr %addr, i32 1 seq_cst |
| 2208 | + ret i32 %oldval |
2247 | 2209 | }
|
2248 | 2210 |
|
2249 | 2211 | ; Try an seq_cst atomicrmw unsigned max
|
2250 |
| -; AArch64 will expand some atomicrmw's at the LLVM-IR level so we use a wide type to avoid this. |
2251 | 2212 | define i32 @test_atomicrmw_umax(ptr %addr) {
|
2252 | 2213 | ; CHECK-LABEL: name: test_atomicrmw_umax
|
2253 | 2214 | ; CHECK: bb.1 (%ir-block.{{[0-9]+}}):
|
2254 | 2215 | ; CHECK-NEXT: liveins: $x0
|
2255 | 2216 | ; CHECK: [[ADDR:%[0-9]+]]:_(p0) = COPY $x0
|
2256 |
| -; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s256) = G_CONSTANT i256 1 |
2257 |
| -; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s256) = G_ATOMICRMW_UMAX [[ADDR]](p0), [[VAL]] :: (load store seq_cst (s256) on %ir.addr) |
2258 |
| -; CHECK-NEXT: [[RES:%[0-9]+]]:_(s32) = G_TRUNC [[OLDVALRES]] |
2259 |
| - %oldval = atomicrmw umax ptr %addr, i256 1 seq_cst |
2260 |
| - ; FIXME: We currently can't lower 'ret i256' and it's not the purpose of this |
2261 |
| - ; test so work around it by truncating to i32 for now. |
2262 |
| - %oldval.trunc = trunc i256 %oldval to i32 |
2263 |
| - ret i32 %oldval.trunc |
| 2217 | +; CHECK-NEXT: [[VAL:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 |
| 2218 | +; CHECK-NEXT: [[OLDVALRES:%[0-9]+]]:_(s32) = G_ATOMICRMW_UMAX [[ADDR]](p0), [[VAL]] :: (load store seq_cst (s32) on %ir.addr) |
| 2219 | + %oldval = atomicrmw umax ptr %addr, i32 1 seq_cst |
| 2220 | + ret i32 %oldval |
2264 | 2221 | }
|
2265 | 2222 |
|
2266 | 2223 | @addr = global ptr null
|
|
0 commit comments