179 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_SHL into a G_SBFX/G_UBFX.5 6---7name: apply_ashr_shl_to_sbfx8legalized: true9body: |10 bb.0.entry:11 ; CHECK-LABEL: name: apply_ashr_shl_to_sbfx12 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w013 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1614 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1115 ; CHECK-NEXT: [[SBFX:%[0-9]+]]:_(s32) = G_SBFX [[COPY]], [[C1]](s32), [[C]]16 ; CHECK-NEXT: $w0 = COPY [[SBFX]](s32)17 %0:_(s32) = COPY $w018 %1:_(s32) = G_CONSTANT i32 519 %2:_(s32) = G_CONSTANT i32 1620 %3:_(s32) = G_SHL %0, %121 %4:_(s32) = G_ASHR %3, %222 $w0 = COPY %4(s32)23...24 25---26name: apply_ashr_shl_to_sbfx_lower_bound27legalized: true28body: |29 bb.0.entry:30 ; CHECK-LABEL: name: apply_ashr_shl_to_sbfx_lower_bound31 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w032 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 133 ; CHECK-NEXT: [[SBFX:%[0-9]+]]:_(s32) = G_SBFX [[COPY]], [[C]](s32), [[C]]34 ; CHECK-NEXT: $w0 = COPY [[SBFX]](s32)35 %0:_(s32) = COPY $w036 %1:_(s32) = G_CONSTANT i32 3037 %2:_(s32) = G_CONSTANT i32 3138 %3:_(s32) = G_SHL %0, %139 %4:_(s32) = G_ASHR %3, %240 $w0 = COPY %4(s32)41...42 43---44name: apply_ashr_shl_to_sbfx_upper_bound45legalized: true46body: |47 bb.0.entry:48 ; CHECK-LABEL: name: apply_ashr_shl_to_sbfx_upper_bound49 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w050 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 151 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 3052 ; CHECK-NEXT: [[SBFX:%[0-9]+]]:_(s32) = G_SBFX [[COPY]], [[C1]](s32), [[C]]53 ; CHECK-NEXT: $w0 = COPY [[SBFX]](s32)54 %0:_(s32) = COPY $w055 %1:_(s32) = G_CONSTANT i32 156 %2:_(s32) = G_CONSTANT i32 3157 %3:_(s32) = G_SHL %0, %158 %4:_(s32) = G_ASHR %3, %259 $w0 = COPY %4(s32)60...61 62---63name: apply_lshr_shl_to_ubfx64legalized: true65body: |66 bb.0.entry:67 ; CHECK-LABEL: name: apply_lshr_shl_to_ubfx68 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w069 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1670 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1171 ; CHECK-NEXT: [[UBFX:%[0-9]+]]:_(s32) = G_UBFX [[COPY]], [[C1]](s32), [[C]]72 ; CHECK-NEXT: $w0 = COPY [[UBFX]](s32)73 %0:_(s32) = COPY $w074 %1:_(s32) = G_CONSTANT i32 575 %2:_(s32) = G_CONSTANT i32 1676 %3:_(s32) = G_SHL %0, %177 %4:_(s32) = G_LSHR %3, %278 $w0 = COPY %4(s32)79...80 81---82name: apply_lshr_shl_to_ubfx_lower_bound83legalized: true84body: |85 bb.0.entry:86 ; CHECK-LABEL: name: apply_lshr_shl_to_ubfx_lower_bound87 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w088 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 189 ; CHECK-NEXT: [[UBFX:%[0-9]+]]:_(s32) = G_UBFX [[COPY]], [[C]](s32), [[C]]90 ; CHECK-NEXT: $w0 = COPY [[UBFX]](s32)91 %0:_(s32) = COPY $w092 %1:_(s32) = G_CONSTANT i32 3093 %2:_(s32) = G_CONSTANT i32 3194 %3:_(s32) = G_SHL %0, %195 %4:_(s32) = G_LSHR %3, %296 $w0 = COPY %4(s32)97...98 99---100name: apply_lshr_shl_to_ubfx_upper_bound101legalized: true102body: |103 bb.0.entry:104 ; CHECK-LABEL: name: apply_lshr_shl_to_ubfx_upper_bound105 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0106 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1107 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 30108 ; CHECK-NEXT: [[UBFX:%[0-9]+]]:_(s32) = G_UBFX [[COPY]], [[C1]](s32), [[C]]109 ; CHECK-NEXT: $w0 = COPY [[UBFX]](s32)110 %0:_(s32) = COPY $w0111 %1:_(s32) = G_CONSTANT i32 1112 %2:_(s32) = G_CONSTANT i32 31113 %3:_(s32) = G_SHL %0, %1114 %4:_(s32) = G_LSHR %3, %2115 $w0 = COPY %4(s32)116...117 118---119name: dont_apply_pos_out_of_bounds120legalized: true121body: |122 bb.0.entry:123 ; CHECK-LABEL: name: dont_apply_pos_out_of_bounds124 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0125 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 5126 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 2127 ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[C]](s32)128 ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32)129 ; CHECK-NEXT: $w0 = COPY [[ASHR]](s32)130 %0:_(s32) = COPY $w0131 %1:_(s32) = G_CONSTANT i32 5132 %2:_(s32) = G_CONSTANT i32 2133 %3:_(s32) = G_SHL %0, %1134 %4:_(s32) = G_ASHR %3, %2135 $w0 = COPY %4(s32)136...137 138---139name: dont_apply_no_constant140legalized: true141body: |142 bb.0.entry:143 ; CHECK-LABEL: name: dont_apply_no_constant144 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0145 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $w1146 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 2147 ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[COPY1]](s32)148 ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)149 ; CHECK-NEXT: $w0 = COPY [[ASHR]](s32)150 %0:_(s32) = COPY $w0151 %1:_(s32) = COPY $w1152 %2:_(s32) = G_CONSTANT i32 2153 %3:_(s32) = G_SHL %0, %1154 %4:_(s32) = G_ASHR %3, %2155 $w0 = COPY %4(s32)156...157 158---159name: dont_apply_more_than_one_use160legalized: true161body: |162 bb.0.entry:163 ; CHECK-LABEL: name: dont_apply_more_than_one_use164 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0165 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 5166 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16167 ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[C]](s32)168 ; CHECK-NEXT: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32)169 ; CHECK-NEXT: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[SHL]], [[ASHR]]170 ; CHECK-NEXT: $w0 = COPY [[MUL]](s32)171 %0:_(s32) = COPY $w0172 %1:_(s32) = G_CONSTANT i32 5173 %2:_(s32) = G_CONSTANT i32 16174 %3:_(s32) = G_SHL %0, %1175 %4:_(s32) = G_ASHR %3, %2176 %5:_(s32) = G_MUL %3, %4177 $w0 = COPY %5(s32)178...179