brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.6 KiB · a7809f2 Raw
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