371 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -mtriple aarch64 -run-pass=aarch64-prelegalizer-combiner -aarch64prelegalizercombiner-only-enable-rule="load_and_mask" -verify-machineinstrs %s -o - | FileCheck %s3 4# REQUIRES: asserts5 6# Check that we can fold and ({any,zext,sext}load, mask) -> zextload7 8---9name: test_anyext_110tracksRegLiveness: true11body: |12 bb.0:13 liveins: $x014 ; CHECK-LABEL: name: test_anyext_115 ; CHECK: liveins: $x016 ; CHECK-NEXT: {{ $}}17 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x018 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 119 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s8) = G_LOAD [[COPY]](p0) :: (load (s8))20 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s8) = G_AND [[LOAD]], [[C]]21 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[AND]](s8)22 ; CHECK-NEXT: $w0 = COPY [[ANYEXT]](s32)23 %0:_(p0) = COPY $x024 %1:_(s8) = G_CONSTANT i8 125 %2:_(s8) = G_LOAD %0 :: (load (s8))26 %3:_(s8) = G_AND %2, %127 %4:_(s32) = G_ANYEXT %328 $w0 = COPY %429...30 31---32name: test_anyext_s1633tracksRegLiveness: true34body: |35 bb.0:36 liveins: $x037 ; CHECK-LABEL: name: test_anyext_s1638 ; CHECK: liveins: $x039 ; CHECK-NEXT: {{ $}}40 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x041 ; CHECK-NEXT: [[ZEXTLOAD:%[0-9]+]]:_(s16) = G_ZEXTLOAD [[COPY]](p0) :: (load (s8))42 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[ZEXTLOAD]](s16)43 ; CHECK-NEXT: $w0 = COPY [[ANYEXT]](s32)44 %0:_(p0) = COPY $x045 %1:_(s16) = G_CONSTANT i16 25546 %2:_(s16) = G_LOAD %0 :: (load (s8))47 %3:_(s16) = G_AND %2, %148 %4:_(s32) = G_ANYEXT %349 $w0 = COPY %450...51 52---53name: test_anyext_s3254tracksRegLiveness: true55body: |56 bb.0:57 liveins: $x058 ; CHECK-LABEL: name: test_anyext_s3259 ; CHECK: liveins: $x060 ; CHECK-NEXT: {{ $}}61 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x062 ; CHECK-NEXT: [[ZEXTLOAD:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[COPY]](p0) :: (load (s8))63 ; CHECK-NEXT: $w0 = COPY [[ZEXTLOAD]](s32)64 %0:_(p0) = COPY $x065 %1:_(s32) = G_CONSTANT i32 25566 %2:_(s32) = G_LOAD %0 :: (load (s8))67 %3:_(s32) = G_AND %2, %168 $w0 = COPY %369...70 71---72name: test_load_s3273tracksRegLiveness: true74body: |75 bb.0:76 liveins: $x077 ; CHECK-LABEL: name: test_load_s3278 ; CHECK: liveins: $x079 ; CHECK-NEXT: {{ $}}80 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x081 ; CHECK-NEXT: [[ZEXTLOAD:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[COPY]](p0) :: (load (s8), align 4)82 ; CHECK-NEXT: $w0 = COPY [[ZEXTLOAD]](s32)83 %0:_(p0) = COPY $x084 %1:_(s32) = G_CONSTANT i32 25585 %2:_(s32) = G_LOAD %0 :: (load (s32))86 %3:_(s32) = G_AND %2, %187 $w0 = COPY %388...89 90---91name: test_load_mask_s8_s32_atomic92tracksRegLiveness: true93body: |94 bb.0:95 liveins: $x096 ; CHECK-LABEL: name: test_load_mask_s8_s32_atomic97 ; CHECK: liveins: $x098 ; CHECK-NEXT: {{ $}}99 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0100 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 255101 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load seq_cst (s32))102 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[LOAD]], [[C]]103 ; CHECK-NEXT: $w0 = COPY [[AND]](s32)104 %0:_(p0) = COPY $x0105 %1:_(s32) = G_CONSTANT i32 255106 %2:_(s32) = G_LOAD %0 :: (load seq_cst (s32))107 %3:_(s32) = G_AND %2, %1108 $w0 = COPY %3109...110 111# The mask is equal to the memory size.112---113name: test_load_mask_s16_s16_atomic114tracksRegLiveness: true115body: |116 bb.0:117 liveins: $x0118 ; CHECK-LABEL: name: test_load_mask_s16_s16_atomic119 ; CHECK: liveins: $x0120 ; CHECK-NEXT: {{ $}}121 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0122 ; CHECK-NEXT: [[ZEXTLOAD:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[COPY]](p0) :: (load seq_cst (s16))123 ; CHECK-NEXT: $w0 = COPY [[ZEXTLOAD]](s32)124 %0:_(p0) = COPY $x0125 %1:_(s32) = G_CONSTANT i32 65535126 %2:_(s32) = G_LOAD %0 :: (load seq_cst (s16))127 %3:_(s32) = G_AND %2, %1128 $w0 = COPY %3129...130 131# The mask is smaller than the memory size which must be preserved, so132# there's little point to folding.133---134name: test_load_mask_s8_s16_atomic135tracksRegLiveness: true136body: |137 bb.0:138 liveins: $x0139 ; CHECK-LABEL: name: test_load_mask_s8_s16_atomic140 ; CHECK: liveins: $x0141 ; CHECK-NEXT: {{ $}}142 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0143 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 255144 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load seq_cst (s16))145 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[LOAD]], [[C]]146 ; CHECK-NEXT: $w0 = COPY [[AND]](s32)147 %0:_(p0) = COPY $x0148 %1:_(s32) = G_CONSTANT i32 255149 %2:_(s32) = G_LOAD %0 :: (load seq_cst (s16))150 %3:_(s32) = G_AND %2, %1151 $w0 = COPY %3152...153 154---155name: test_load_mask_size_equals_dst_size156tracksRegLiveness: true157body: |158 bb.0:159 liveins: $x0160 161 ; The combine should only apply if the mask zeroes actual bits of the dst type162 ; If it doesn't, the mask is redundant and we have other combines to fold it away163 164 ; CHECK-LABEL: name: test_load_mask_size_equals_dst_size165 ; CHECK: liveins: $x0166 ; CHECK-NEXT: {{ $}}167 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0168 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1169 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s32))170 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[LOAD]], [[C]]171 ; CHECK-NEXT: $w0 = COPY [[AND]](s32)172 %0:_(p0) = COPY $x0173 %1:_(s32) = G_CONSTANT i32 4294967295174 %2:_(s32) = G_LOAD %0 :: (load (s32))175 %3:_(s32) = G_AND %2, %1176 $w0 = COPY %3177...178 179---180name: test_zext181tracksRegLiveness: true182body: |183 bb.0:184 liveins: $x0185 ; CHECK-LABEL: name: test_zext186 ; CHECK: liveins: $x0187 ; CHECK-NEXT: {{ $}}188 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0189 ; CHECK-NEXT: [[ZEXTLOAD:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[COPY]](p0) :: (load (s8), align 2)190 ; CHECK-NEXT: $w0 = COPY [[ZEXTLOAD]](s32)191 %0:_(p0) = COPY $x0192 %1:_(s32) = G_CONSTANT i32 255193 %2:_(s32) = G_ZEXTLOAD %0 :: (load (s16))194 %3:_(s32) = G_AND %2, %1195 $w0 = COPY %3196...197 198---199name: test_zext_mask_larger_memsize200tracksRegLiveness: true201body: |202 bb.0:203 liveins: $x0204 205 ; The combine should only apply if the mask narrows the memory size.206 ; We have another combine that folds redundant masks207 208 ; CHECK-LABEL: name: test_zext_mask_larger_memsize209 ; CHECK: liveins: $x0210 ; CHECK-NEXT: {{ $}}211 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0212 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535213 ; CHECK-NEXT: [[ZEXTLOAD:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[COPY]](p0) :: (load (s8))214 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[ZEXTLOAD]], [[C]]215 ; CHECK-NEXT: $w0 = COPY [[AND]](s32)216 %0:_(p0) = COPY $x0217 %1:_(s32) = G_CONSTANT i32 65535218 %2:_(s32) = G_ZEXTLOAD %0 :: (load (s8))219 %3:_(s32) = G_AND %2, %1220 $w0 = COPY %3221...222 223---224name: test_sext225tracksRegLiveness: true226body: |227 bb.0:228 liveins: $x0229 ; CHECK-LABEL: name: test_sext230 ; CHECK: liveins: $x0231 ; CHECK-NEXT: {{ $}}232 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0233 ; CHECK-NEXT: [[ZEXTLOAD:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[COPY]](p0) :: (load (s8), align 2)234 ; CHECK-NEXT: $w0 = COPY [[ZEXTLOAD]](s32)235 %0:_(p0) = COPY $x0236 %1:_(s32) = G_CONSTANT i32 255237 %2:_(s32) = G_SEXTLOAD %0 :: (load (s16))238 %3:_(s32) = G_AND %2, %1239 $w0 = COPY %3240...241 242---243name: test_sext_mask_larger_memsize244tracksRegLiveness: true245body: |246 bb.0:247 liveins: $x0248 ; CHECK-LABEL: name: test_sext_mask_larger_memsize249 ; CHECK: liveins: $x0250 ; CHECK-NEXT: {{ $}}251 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0252 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535253 ; CHECK-NEXT: [[SEXTLOAD:%[0-9]+]]:_(s32) = G_SEXTLOAD [[COPY]](p0) :: (load (s8))254 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[SEXTLOAD]], [[C]]255 ; CHECK-NEXT: $w0 = COPY [[AND]](s32)256 %0:_(p0) = COPY $x0257 %1:_(s32) = G_CONSTANT i32 65535258 %2:_(s32) = G_SEXTLOAD %0 :: (load (s8))259 %3:_(s32) = G_AND %2, %1260 $w0 = COPY %3261...262 263---264name: test_non_pow2_memtype265tracksRegLiveness: true266body: |267 bb.0:268 liveins: $x0269 ; CHECK-LABEL: name: test_non_pow2_memtype270 ; CHECK: liveins: $x0271 ; CHECK-NEXT: {{ $}}272 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0273 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s24) = G_CONSTANT i24 7274 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s24) = G_LOAD [[COPY]](p0) :: (load (s24), align 4)275 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s24) = G_AND [[LOAD]], [[C]]276 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[AND]](s24)277 ; CHECK-NEXT: $w0 = COPY [[ANYEXT]](s32)278 %0:_(p0) = COPY $x0279 %1:_(s24) = G_CONSTANT i24 7280 %2:_(s24) = G_LOAD %0 :: (load (s24))281 %3:_(s24) = G_AND %2, %1282 %4:_(s32) = G_ANYEXT %3283 $w0 = COPY %4284...285 286 287---288name: test_no_mask289tracksRegLiveness: true290body: |291 bb.0:292 liveins: $x0293 ; CHECK-LABEL: name: test_no_mask294 ; CHECK: liveins: $x0295 ; CHECK-NEXT: {{ $}}296 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0297 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 510298 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s8))299 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[LOAD]], [[C]]300 ; CHECK-NEXT: $w0 = COPY [[AND]](s32)301 %0:_(p0) = COPY $x0302 %1:_(s32) = G_CONSTANT i32 510303 %2:_(s32) = G_LOAD %0 :: (load (s8))304 %3:_(s32) = G_AND %2, %1305 $w0 = COPY %3306...307 308---309name: test_volatile310tracksRegLiveness: true311body: |312 bb.0:313 liveins: $x0314 ; CHECK-LABEL: name: test_volatile315 ; CHECK: liveins: $x0316 ; CHECK-NEXT: {{ $}}317 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0318 ; CHECK-NEXT: [[ZEXTLOAD:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[COPY]](p0) :: (volatile load (s8))319 ; CHECK-NEXT: $w0 = COPY [[ZEXTLOAD]](s32)320 %0:_(p0) = COPY $x0321 %1:_(s32) = G_CONSTANT i32 255322 %2:_(s32) = G_LOAD %0 :: (volatile load (s8))323 %3:_(s32) = G_AND %2, %1324 $w0 = COPY %3325...326 327---328name: test_volatile_mask_smaller_mem329tracksRegLiveness: true330body: |331 bb.0:332 liveins: $x0333 ; CHECK-LABEL: name: test_volatile_mask_smaller_mem334 ; CHECK: liveins: $x0335 ; CHECK-NEXT: {{ $}}336 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0337 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 255338 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (volatile load (s16))339 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[LOAD]], [[C]]340 ; CHECK-NEXT: $w0 = COPY [[AND]](s32)341 %0:_(p0) = COPY $x0342 %1:_(s32) = G_CONSTANT i32 255343 %2:_(s32) = G_LOAD %0 :: (volatile load (s16))344 %3:_(s32) = G_AND %2, %1345 $w0 = COPY %3346...347---348name: test_no_lookthrough_copies_multi_uses349tracksRegLiveness: true350body: |351 bb.0:352 liveins: $x0353 ; CHECK-LABEL: name: test_no_lookthrough_copies_multi_uses354 ; CHECK: liveins: $x0355 ; CHECK-NEXT: {{ $}}356 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0357 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 255358 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load (s16))359 ; CHECK-NEXT: %v:_(s32) = G_ASSERT_ZEXT [[LOAD]], 16360 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND %v, [[C]]361 ; CHECK-NEXT: $w1 = COPY %v(s32)362 ; CHECK-NEXT: $w0 = COPY [[AND]](s32)363 %0:_(p0) = COPY $x0364 %1:_(s32) = G_CONSTANT i32 255365 %2:_(s32) = G_LOAD %0 :: (load (s16))366 %v:_(s32) = G_ASSERT_ZEXT %2, 16367 %3:_(s32) = G_AND %v, %1368 $w1 = COPY %v369 $w0 = COPY %3370...371