316 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -o - -mtriple=aarch64-unknown-unknown -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s | FileCheck %s3 4# Truncs with a single use get folded.5 6# and(trunc(x), trunc(y)) -> trunc(and(x, y))7---8name: and_trunc9body: |10 bb.0:11 liveins: $w0, $w112 ; CHECK-LABEL: name: and_trunc13 ; CHECK: liveins: $w0, $w114 ; CHECK-NEXT: {{ $}}15 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w016 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $w117 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[COPY1]]18 ; CHECK-NEXT: $w0 = COPY [[AND]](s32)19 %0:_(s32) = COPY $w020 %1:_(s32) = COPY $w121 %2:_(s16) = G_TRUNC %022 %3:_(s16) = G_TRUNC %123 %4:_(s16) = G_AND %2, %324 %5:_(s32) = G_ANYEXT %425 $w0 = COPY %526...27---28name: and_trunc_vector29body: |30 bb.0:31 liveins: $q0, $q132 ; CHECK-LABEL: name: and_trunc_vector33 ; CHECK: liveins: $q0, $q134 ; CHECK-NEXT: {{ $}}35 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q036 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q137 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(<4 x s32>) = G_AND [[COPY]], [[COPY1]]38 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(<4 x s16>) = G_TRUNC [[AND]](<4 x s32>)39 ; CHECK-NEXT: $x0 = COPY [[TRUNC]](<4 x s16>)40 %0:_(<4 x s32>) = COPY $q041 %1:_(<4 x s32>) = COPY $q142 %2:_(<4 x s16>) = G_TRUNC %043 %3:_(<4 x s16>) = G_TRUNC %144 %4:_(<4 x s16>) = G_AND %2, %345 $x0 = COPY %446...47 48# or(trunc(x), trunc(y)) -> trunc(or(x, y))49---50name: or_trunc51body: |52 bb.0:53 liveins: $w0, $w154 ; CHECK-LABEL: name: or_trunc55 ; CHECK: liveins: $w0, $w156 ; CHECK-NEXT: {{ $}}57 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w058 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $w159 ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[COPY]], [[COPY1]]60 ; CHECK-NEXT: $w0 = COPY [[OR]](s32)61 %0:_(s32) = COPY $w062 %1:_(s32) = COPY $w163 %2:_(s16) = G_TRUNC %064 %3:_(s16) = G_TRUNC %165 %4:_(s16) = G_OR %2, %366 %5:_(s32) = G_ANYEXT %467 $w0 = COPY %568...69---70name: or_trunc_vector71body: |72 bb.0:73 liveins: $q0, $q174 ; CHECK-LABEL: name: or_trunc_vector75 ; CHECK: liveins: $q0, $q176 ; CHECK-NEXT: {{ $}}77 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q078 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q179 ; CHECK-NEXT: [[OR:%[0-9]+]]:_(<4 x s32>) = G_OR [[COPY]], [[COPY1]]80 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(<4 x s16>) = G_TRUNC [[OR]](<4 x s32>)81 ; CHECK-NEXT: $x0 = COPY [[TRUNC]](<4 x s16>)82 %0:_(<4 x s32>) = COPY $q083 %1:_(<4 x s32>) = COPY $q184 %2:_(<4 x s16>) = G_TRUNC %085 %3:_(<4 x s16>) = G_TRUNC %186 %4:_(<4 x s16>) = G_OR %2, %387 $x0 = COPY %488...89 90# xor(trunc(x), trunc(y)) -> trunc(xor(x, y))91---92name: xor_trunc93body: |94 bb.0:95 liveins: $w0, $w196 ; CHECK-LABEL: name: xor_trunc97 ; CHECK: liveins: $w0, $w198 ; CHECK-NEXT: {{ $}}99 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0100 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $w1101 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[COPY]], [[COPY1]]102 ; CHECK-NEXT: $w0 = COPY [[XOR]](s32)103 %0:_(s32) = COPY $w0104 %1:_(s32) = COPY $w1105 %2:_(s16) = G_TRUNC %0106 %3:_(s16) = G_TRUNC %1107 %4:_(s16) = G_XOR %2, %3108 %5:_(s32) = G_ANYEXT %4109 $w0 = COPY %5110...111---112name: xor_trunc_vector113body: |114 bb.0:115 liveins: $q0, $q1116 ; CHECK-LABEL: name: xor_trunc_vector117 ; CHECK: liveins: $q0, $q1118 ; CHECK-NEXT: {{ $}}119 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0120 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1121 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(<4 x s32>) = G_XOR [[COPY]], [[COPY1]]122 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(<4 x s16>) = G_TRUNC [[XOR]](<4 x s32>)123 ; CHECK-NEXT: $x0 = COPY [[TRUNC]](<4 x s16>)124 %0:_(<4 x s32>) = COPY $q0125 %1:_(<4 x s32>) = COPY $q1126 %2:_(<4 x s16>) = G_TRUNC %0127 %3:_(<4 x s16>) = G_TRUNC %1128 %4:_(<4 x s16>) = G_XOR %2, %3129 $x0 = COPY %4130...131 132# Truncs with multiple uses do not get folded.133---134name: or_trunc_multiuse_1135body: |136 bb.0:137 liveins: $w0, $w1, $x2138 ; CHECK-LABEL: name: or_trunc_multiuse_1139 ; CHECK: liveins: $w0, $w1, $x2140 ; CHECK-NEXT: {{ $}}141 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0142 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $w1143 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(p0) = COPY $x2144 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)145 ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[COPY1]](s32)146 ; CHECK-NEXT: G_STORE [[TRUNC]](s16), [[COPY2]](p0) :: (store (s16))147 ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s16) = G_OR [[TRUNC]], [[TRUNC1]]148 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[OR]](s16)149 ; CHECK-NEXT: $w0 = COPY [[ANYEXT]](s32)150 %0:_(s32) = COPY $w0151 %1:_(s32) = COPY $w1152 %5:_(p0) = COPY $x2153 %2:_(s16) = G_TRUNC %0154 %3:_(s16) = G_TRUNC %1155 G_STORE %2, %5 :: (store (s16))156 %4:_(s16) = G_OR %2, %3157 %6:_(s32) = G_ANYEXT %4158 $w0 = COPY %6159...160---161name: and_trunc_multiuse_2162body: |163 bb.0:164 liveins: $w0, $w1, $x2165 ; CHECK-LABEL: name: and_trunc_multiuse_2166 ; CHECK: liveins: $w0, $w1, $x2167 ; CHECK-NEXT: {{ $}}168 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0169 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $w1170 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(p0) = COPY $x2171 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)172 ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[COPY1]](s32)173 ; CHECK-NEXT: G_STORE [[TRUNC]](s16), [[COPY2]](p0) :: (store (s16))174 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s16) = G_AND [[TRUNC]], [[TRUNC1]]175 ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[AND]](s16)176 ; CHECK-NEXT: $w0 = COPY [[ANYEXT]](s32)177 %0:_(s32) = COPY $w0178 %1:_(s32) = COPY $w1179 %5:_(p0) = COPY $x2180 %2:_(s16) = G_TRUNC %0181 %3:_(s16) = G_TRUNC %1182 G_STORE %2, %5 :: (store (s16))183 %4:_(s16) = G_AND %2, %3184 %6:_(s32) = G_ANYEXT %4185 $w0 = COPY %6186...187---188name: xor_trunc_vector_multiuse189body: |190 bb.0:191 liveins: $w0, $w1, $x2192 ; CHECK-LABEL: name: xor_trunc_vector_multiuse193 ; CHECK: liveins: $w0, $w1, $x2194 ; CHECK-NEXT: {{ $}}195 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0196 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1197 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(p0) = COPY $x2198 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(<4 x s16>) = G_TRUNC [[COPY]](<4 x s32>)199 ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(<4 x s16>) = G_TRUNC [[COPY1]](<4 x s32>)200 ; CHECK-NEXT: G_STORE [[TRUNC]](<4 x s16>), [[COPY2]](p0) :: (store (<4 x s16>))201 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(<4 x s16>) = G_XOR [[TRUNC]], [[TRUNC1]]202 ; CHECK-NEXT: $x0 = COPY [[XOR]](<4 x s16>)203 %0:_(<4 x s32>) = COPY $q0204 %1:_(<4 x s32>) = COPY $q1205 %5:_(p0) = COPY $x2206 %2:_(<4 x s16>) = G_TRUNC %0207 %3:_(<4 x s16>) = G_TRUNC %1208 G_STORE %2, %5 :: (store (<4 x s16>))209 %4:_(<4 x s16>) = G_XOR %2, %3210 $x0 = COPY %4211...212 213# Freezes should get pushed through truncs.214 215# This optimizes the pattern where `select(cond, T, 0)` gets converted to216# `and(cond, freeze(T))`.217 218# and(freeze(trunc(x)), trunc(y)) -> trunc(and(freeze(x), y))219---220name: and_trunc_freeze221body: |222 bb.0:223 liveins: $w0, $w1224 ; CHECK-LABEL: name: and_trunc_freeze225 ; CHECK: liveins: $w0, $w1226 ; CHECK-NEXT: {{ $}}227 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0228 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $w1229 ; CHECK-NEXT: [[FREEZE:%[0-9]+]]:_(s32) = G_FREEZE [[COPY]]230 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[FREEZE]], [[COPY1]]231 ; CHECK-NEXT: $w0 = COPY [[AND]](s32)232 %0:_(s32) = COPY $w0233 %1:_(s32) = COPY $w1234 %2:_(s16) = G_TRUNC %0235 %3:_(s16) = G_TRUNC %1236 %6:_(s16) = G_FREEZE %2237 %4:_(s16) = G_AND %6, %3238 %5:_(s32) = G_ANYEXT %4239 $w0 = COPY %5240...241 242# and(freeze(trunc(x)), freeze(trunc(y))) -> trunc(and(freeze(x), freeze(y)))243---244name: and_trunc_freeze_both245body: |246 bb.0:247 liveins: $w0, $w1248 ; CHECK-LABEL: name: and_trunc_freeze_both249 ; CHECK: liveins: $w0, $w1250 ; CHECK-NEXT: {{ $}}251 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0252 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $w1253 ; CHECK-NEXT: [[FREEZE:%[0-9]+]]:_(s32) = G_FREEZE [[COPY]]254 ; CHECK-NEXT: [[FREEZE1:%[0-9]+]]:_(s32) = G_FREEZE [[COPY1]]255 ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[FREEZE]], [[FREEZE1]]256 ; CHECK-NEXT: $w0 = COPY [[AND]](s32)257 %0:_(s32) = COPY $w0258 %1:_(s32) = COPY $w1259 %2:_(s16) = G_TRUNC %0260 %3:_(s16) = G_TRUNC %1261 %6:_(s16) = G_FREEZE %2262 %7:_(s16) = G_FREEZE %3263 %4:_(s16) = G_AND %6, %7264 %5:_(s32) = G_ANYEXT %4265 $w0 = COPY %5266...267 268# The freeze fold is less important for G_OR and G_XOR, however it can still269# trigger.270---271name: or_trunc_freeze272body: |273 bb.0:274 liveins: $w0, $w1275 ; CHECK-LABEL: name: or_trunc_freeze276 ; CHECK: liveins: $w0, $w1277 ; CHECK-NEXT: {{ $}}278 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0279 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $w1280 ; CHECK-NEXT: [[FREEZE:%[0-9]+]]:_(s32) = G_FREEZE [[COPY]]281 ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[FREEZE]], [[COPY1]]282 ; CHECK-NEXT: $w0 = COPY [[OR]](s32)283 %0:_(s32) = COPY $w0284 %1:_(s32) = COPY $w1285 %2:_(s16) = G_TRUNC %0286 %3:_(s16) = G_TRUNC %1287 %6:_(s16) = G_FREEZE %2288 %4:_(s16) = G_OR %6, %3289 %5:_(s32) = G_ANYEXT %4290 $w0 = COPY %5291...292---293name: xor_trunc_freeze_both294body: |295 bb.0:296 liveins: $w0, $w1297 ; CHECK-LABEL: name: xor_trunc_freeze_both298 ; CHECK: liveins: $w0, $w1299 ; CHECK-NEXT: {{ $}}300 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0301 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $w1302 ; CHECK-NEXT: [[FREEZE:%[0-9]+]]:_(s32) = G_FREEZE [[COPY]]303 ; CHECK-NEXT: [[FREEZE1:%[0-9]+]]:_(s32) = G_FREEZE [[COPY1]]304 ; CHECK-NEXT: [[XOR:%[0-9]+]]:_(s32) = G_XOR [[FREEZE]], [[FREEZE1]]305 ; CHECK-NEXT: $w0 = COPY [[XOR]](s32)306 %0:_(s32) = COPY $w0307 %1:_(s32) = COPY $w1308 %2:_(s16) = G_TRUNC %0309 %3:_(s16) = G_TRUNC %1310 %6:_(s16) = G_FREEZE %2311 %7:_(s16) = G_FREEZE %3312 %4:_(s16) = G_XOR %6, %7313 %5:_(s32) = G_ANYEXT %4314 $w0 = COPY %5315...316