208 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -mtriple aarch64 -run-pass=aarch64-postlegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s3 4# Check that we can fold a G_ASHR/G_LSHR fed by a G_AND into a G_SBFX/G_UBFX.5 6---7name: mask_extract_unsigned_328legalized: true9body: |10 bb.0.entry:11 ; CHECK-LABEL: name: mask_extract_unsigned_3212 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w013 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 214 ; CHECK-NEXT: [[UBFX:%[0-9]+]]:_(s32) = G_UBFX [[COPY]], [[C]](s32), [[C]]15 ; CHECK-NEXT: $w0 = COPY [[UBFX]](s32)16 %0:_(s32) = COPY $w017 %1:_(s32) = G_CONSTANT i32 1218 %2:_(s32) = G_CONSTANT i32 219 %3:_(s32) = G_AND %0, %120 %4:_(s32) = G_LSHR %3, %221 $w0 = COPY %4(s32)22...23---24name: mask_extract_unsigned_6425legalized: true26body: |27 bb.0.entry:28 ; CHECK-LABEL: name: mask_extract_unsigned_6429 ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x030 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 5631 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 432 ; CHECK-NEXT: [[UBFX:%[0-9]+]]:_(s64) = G_UBFX [[COPY]], [[C]](s64), [[C1]]33 ; CHECK-NEXT: $x0 = COPY [[UBFX]](s64)34 %0:_(s64) = COPY $x035 %1:_(s64) = G_CONSTANT i64 108086391056891904036 %2:_(s64) = G_CONSTANT i64 5637 %3:_(s64) = G_AND %0, %138 %4:_(s64) = G_LSHR %3, %239 $x0 = COPY %4(s64)40...41---42name: no_mask_extract_unsigned_12843legalized: true44body: |45 bb.0.entry:46 ; CHECK-LABEL: name: no_mask_extract_unsigned_12847 ; CHECK: [[COPY:%[0-9]+]]:_(s128) = COPY $q048 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s128) = G_CONSTANT i128 108086391056891904049 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s128) = G_CONSTANT i128 5650 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s128) = G_AND [[COPY]], [[C]]51 ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s128) = G_LSHR [[AND]], [[C1]](s128)52 ; CHECK-NEXT: $q0 = COPY [[LSHR]](s128)53 %0:_(s128) = COPY $q054 %1:_(s128) = G_CONSTANT i128 108086391056891904055 %2:_(s128) = G_CONSTANT i128 5656 %3:_(s128) = G_AND %0, %157 %4:_(s128) = G_LSHR %3, %258 $q0 = COPY %4(s128)59...60---61name: mask_extract_asr62legalized: true63body: |64 bb.0.entry:65 ; CHECK-LABEL: name: mask_extract_asr66 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w067 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 2968 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 269 ; CHECK-NEXT: [[UBFX:%[0-9]+]]:_(s32) = G_UBFX [[COPY]], [[C]](s32), [[C1]]70 ; CHECK-NEXT: $w0 = COPY [[UBFX]](s32)71 %0:_(s32) = COPY $w072 %1:_(s32) = G_CONSTANT i32 161061273673 %2:_(s32) = G_CONSTANT i32 2974 %3:_(s32) = G_AND %0, %175 %4:_(s32) = G_ASHR %3, %276 $w0 = COPY %4(s32)77...78---79name: no_mask_extract_asr80legalized: true81body: |82 bb.0.entry:83 ; CHECK-LABEL: name: no_mask_extract_asr84 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w085 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 -107374182486 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 3087 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]]88 ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[AND]], [[C1]](s32)89 ; CHECK-NEXT: $w0 = COPY [[ASHR]](s32)90 %0:_(s32) = COPY $w091 %1:_(s32) = G_CONSTANT i32 322122547292 %2:_(s32) = G_CONSTANT i32 3093 %3:_(s32) = G_AND %0, %194 %4:_(s32) = G_ASHR %3, %295 $w0 = COPY %4(s32)96...97---98name: mask_extract_signed_nonneg99legalized: true100body: |101 bb.0.entry:102 ; CHECK-LABEL: name: mask_extract_signed_nonneg103 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0104 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 29105 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 2106 ; CHECK-NEXT: [[UBFX:%[0-9]+]]:_(s32) = G_UBFX [[COPY]], [[C]](s32), [[C1]]107 ; CHECK-NEXT: $w0 = COPY [[UBFX]](s32)108 %0:_(s32) = COPY $w0109 %1:_(s32) = G_CONSTANT i32 2147483647110 %2:_(s32) = G_CONSTANT i32 29111 %3:_(s32) = G_AND %0, %1112 %4:_(s32) = G_ASHR %3, %2113 $w0 = COPY %4(s32)114...115---116name: no_mask_extract_large_shift117legalized: true118body: |119 bb.0.entry:120 ; CHECK-LABEL: name: no_mask_extract_large_shift121 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0122 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 12123 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 33124 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]]125 ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[AND]], [[C1]](s32)126 ; CHECK-NEXT: $w0 = COPY [[LSHR]](s32)127 %0:_(s32) = COPY $w0128 %1:_(s32) = G_CONSTANT i32 12129 %2:_(s32) = G_CONSTANT i32 33130 %3:_(s32) = G_AND %0, %1131 %4:_(s32) = G_LSHR %3, %2132 $w0 = COPY %4(s32)133...134---135name: no_mask_extract_negative_shift136legalized: true137body: |138 bb.0.entry:139 ; CHECK-LABEL: name: no_mask_extract_negative_shift140 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0141 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 12142 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1143 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]]144 ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[AND]], [[C1]](s32)145 ; CHECK-NEXT: $w0 = COPY [[LSHR]](s32)146 %0:_(s32) = COPY $w0147 %1:_(s32) = G_CONSTANT i32 12148 %2:_(s32) = G_CONSTANT i32 -1149 %3:_(s32) = G_AND %0, %1150 %4:_(s32) = G_LSHR %3, %2151 $w0 = COPY %4(s32)152...153---154name: no_mask_extract_disjoint155legalized: true156body: |157 bb.0.entry:158 ; CHECK-LABEL: name: no_mask_extract_disjoint159 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0160 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 26161 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1162 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]]163 ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[AND]], [[C1]](s32)164 ; CHECK-NEXT: $w0 = COPY [[LSHR]](s32)165 %0:_(s32) = COPY $w0166 %1:_(s32) = G_CONSTANT i32 26167 %2:_(s32) = G_CONSTANT i32 1168 %3:_(s32) = G_AND %0, %1169 %4:_(s32) = G_LSHR %3, %2170 $w0 = COPY %4(s32)171...172---173name: no_mask_extract_extra_bits174legalized: true175body: |176 bb.0.entry:177 ; CHECK-LABEL: name: no_mask_extract_extra_bits178 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0179 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 25180 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 2181 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]]182 ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[AND]], [[C1]](s32)183 ; CHECK-NEXT: $w0 = COPY [[LSHR]](s32)184 %0:_(s32) = COPY $w0185 %1:_(s32) = G_CONSTANT i32 25186 %2:_(s32) = G_CONSTANT i32 2187 %3:_(s32) = G_AND %0, %1188 %4:_(s32) = G_LSHR %3, %2189 $w0 = COPY %4(s32)190...191---192name: zero_from_large_shift193legalized: true194body: |195 bb.1.entry:196 ; CHECK-LABEL: name: zero_from_large_shift197 ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0198 ; CHECK-NEXT: $x0 = COPY [[C]](s64)199 %2:_(s32) = COPY $w0200 %1:_(s8) = G_TRUNC %2:_(s32)201 %3:_(s8) = G_ASSERT_ZEXT %1:_, 1202 %5:_(s64) = G_CONSTANT i64 1203 %7:_(s64) = G_ANYEXT %3:_(s8)204 %4:_(s64) = G_AND %7:_, %5:_205 %6:_(s64) = G_LSHR %4:_, %5:_(s64)206 $x0 = COPY %6:_(s64)207...208