492 lines · plain
1; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel -fast-isel-abort=1 -verify-machineinstrs < %s | FileCheck %s2 3;4; Test that we only use the sign/zero extend in the address calculation when5; necessary.6;7; SHIFT8;9define i64 @load_addr_shift_zext1(i32 %a, i64 %b) {10; CHECK-LABEL: load_addr_shift_zext111; CHECK: ldr {{x[0-9]+}}, [x1, w0, uxtw #3]12 %1 = zext i32 %a to i6413 %2 = shl i64 %1, 314 %3 = add i64 %b, %215 %4 = inttoptr i64 %3 to ptr16 %5 = load i64, ptr %417 ret i64 %518}19 20define i64 @load_addr_shift_zext2(i32 zeroext %a, i64 %b) {21; CHECK-LABEL: load_addr_shift_zext222; CHECK: ldr {{x[0-9]+}}, [x1, x0, lsl #3]23 %1 = zext i32 %a to i6424 %2 = shl i64 %1, 325 %3 = add i64 %b, %226 %4 = inttoptr i64 %3 to ptr27 %5 = load i64, ptr %428 ret i64 %529}30 31define i64 @load_addr_shift_zext3(i32 signext %a, i64 %b) {32; CHECK-LABEL: load_addr_shift_zext333; CHECK: ldr {{x[0-9]+}}, [x1, w0, uxtw #3]34 %1 = zext i32 %a to i6435 %2 = shl i64 %1, 336 %3 = add i64 %b, %237 %4 = inttoptr i64 %3 to ptr38 %5 = load i64, ptr %439 ret i64 %540}41 42define i64 @load_addr_shift_sext1(i32 %a, i64 %b) {43; CHECK-LABEL: load_addr_shift_sext144; CHECK: ldr {{x[0-9]+}}, [x1, w0, sxtw #3]45 %1 = sext i32 %a to i6446 %2 = shl i64 %1, 347 %3 = add i64 %b, %248 %4 = inttoptr i64 %3 to ptr49 %5 = load i64, ptr %450 ret i64 %551}52 53define i64 @load_addr_shift_sext2(i32 zeroext %a, i64 %b) {54; CHECK-LABEL: load_addr_shift_sext255; CHECK: ldr {{x[0-9]+}}, [x1, w0, sxtw #3]56 %1 = sext i32 %a to i6457 %2 = shl i64 %1, 358 %3 = add i64 %b, %259 %4 = inttoptr i64 %3 to ptr60 %5 = load i64, ptr %461 ret i64 %562}63 64define i64 @load_addr_shift_sext3(i32 signext %a, i64 %b) {65; CHECK-LABEL: load_addr_shift_sext366; CHECK: ldr {{x[0-9]+}}, [x1, x0, lsl #3]67 %1 = sext i32 %a to i6468 %2 = shl i64 %1, 369 %3 = add i64 %b, %270 %4 = inttoptr i64 %3 to ptr71 %5 = load i64, ptr %472 ret i64 %573}74 75;76; MUL77;78define i64 @load_addr_mul_zext1(i32 %a, i64 %b) {79; CHECK-LABEL: load_addr_mul_zext180; CHECK: ldr {{x[0-9]+}}, [x1, w0, uxtw #3]81 %1 = zext i32 %a to i6482 %2 = mul i64 %1, 883 %3 = add i64 %b, %284 %4 = inttoptr i64 %3 to ptr85 %5 = load i64, ptr %486 ret i64 %587}88 89define i64 @load_addr_mul_zext2(i32 zeroext %a, i64 %b) {90; CHECK-LABEL: load_addr_mul_zext291; CHECK: ldr {{x[0-9]+}}, [x1, x0, lsl #3]92 %1 = zext i32 %a to i6493 %2 = mul i64 %1, 894 %3 = add i64 %b, %295 %4 = inttoptr i64 %3 to ptr96 %5 = load i64, ptr %497 ret i64 %598}99 100define i64 @load_addr_mul_zext3(i32 signext %a, i64 %b) {101; CHECK-LABEL: load_addr_mul_zext3102; CHECK: ldr {{x[0-9]+}}, [x1, w0, uxtw #3]103 %1 = zext i32 %a to i64104 %2 = mul i64 %1, 8105 %3 = add i64 %b, %2106 %4 = inttoptr i64 %3 to ptr107 %5 = load i64, ptr %4108 ret i64 %5109}110 111define i64 @load_addr_mul_sext1(i32 %a, i64 %b) {112; CHECK-LABEL: load_addr_mul_sext1113; CHECK: ldr {{x[0-9]+}}, [x1, w0, sxtw #3]114 %1 = sext i32 %a to i64115 %2 = mul i64 %1, 8116 %3 = add i64 %b, %2117 %4 = inttoptr i64 %3 to ptr118 %5 = load i64, ptr %4119 ret i64 %5120}121 122define i64 @load_addr_mul_sext2(i32 zeroext %a, i64 %b) {123; CHECK-LABEL: load_addr_mul_sext2124; CHECK: ldr {{x[0-9]+}}, [x1, w0, sxtw #3]125 %1 = sext i32 %a to i64126 %2 = mul i64 %1, 8127 %3 = add i64 %b, %2128 %4 = inttoptr i64 %3 to ptr129 %5 = load i64, ptr %4130 ret i64 %5131}132 133define i64 @load_addr_mul_sext3(i32 signext %a, i64 %b) {134; CHECK-LABEL: load_addr_mul_sext3135; CHECK: ldr {{x[0-9]+}}, [x1, x0, lsl #3]136 %1 = sext i32 %a to i64137 %2 = mul i64 %1, 8138 %3 = add i64 %b, %2139 %4 = inttoptr i64 %3 to ptr140 %5 = load i64, ptr %4141 ret i64 %5142}143 144 145;146; Test folding of the sign-/zero-extend into the load instruction.147;148 149; Unscaled150define i32 @load_unscaled_zext_i8_to_i32(i64 %a) {151; CHECK-LABEL: load_unscaled_zext_i8_to_i32152; CHECK: ldurb w0, [x0, #-8]153; CHECK-NOT: uxtb154 %1 = sub i64 %a, 8155 %2 = inttoptr i64 %1 to ptr156 %3 = load i8, ptr %2157 %4 = zext i8 %3 to i32158 ret i32 %4159}160 161define i32 @load_unscaled_zext_i16_to_i32(i64 %a) {162; CHECK-LABEL: load_unscaled_zext_i16_to_i32163; CHECK: ldurh w0, [x0, #-8]164; CHECK-NOT: uxth165 %1 = sub i64 %a, 8166 %2 = inttoptr i64 %1 to ptr167 %3 = load i16, ptr %2168 %4 = zext i16 %3 to i32169 ret i32 %4170}171 172define i64 @load_unscaled_zext_i8_to_i64(i64 %a) {173; CHECK-LABEL: load_unscaled_zext_i8_to_i64174; CHECK: ldurb w0, [x0, #-8]175; CHECK-NOT: uxtb176 %1 = sub i64 %a, 8177 %2 = inttoptr i64 %1 to ptr178 %3 = load i8, ptr %2179 %4 = zext i8 %3 to i64180 ret i64 %4181}182 183define i64 @load_unscaled_zext_i16_to_i64(i64 %a) {184; CHECK-LABEL: load_unscaled_zext_i16_to_i64185; CHECK: ldurh w0, [x0, #-8]186; CHECK-NOT: uxth187 %1 = sub i64 %a, 8188 %2 = inttoptr i64 %1 to ptr189 %3 = load i16, ptr %2190 %4 = zext i16 %3 to i64191 ret i64 %4192}193 194define i64 @load_unscaled_zext_i32_to_i64(i64 %a) {195; CHECK-LABEL: load_unscaled_zext_i32_to_i64196; CHECK: ldur w0, [x0, #-8]197; CHECK-NOT: uxtw198 %1 = sub i64 %a, 8199 %2 = inttoptr i64 %1 to ptr200 %3 = load i32, ptr %2201 %4 = zext i32 %3 to i64202 ret i64 %4203}204 205define i32 @load_unscaled_sext_i8_to_i32(i64 %a) {206; CHECK-LABEL: load_unscaled_sext_i8_to_i32207; CHECK: ldursb w0, [x0, #-8]208; CHECK-NOT: sxtb209 %1 = sub i64 %a, 8210 %2 = inttoptr i64 %1 to ptr211 %3 = load i8, ptr %2212 %4 = sext i8 %3 to i32213 ret i32 %4214}215 216define i32 @load_unscaled_sext_i16_to_i32(i64 %a) {217; CHECK-LABEL: load_unscaled_sext_i16_to_i32218; CHECK: ldursh w0, [x0, #-8]219; CHECK-NOT: sxth220 %1 = sub i64 %a, 8221 %2 = inttoptr i64 %1 to ptr222 %3 = load i16, ptr %2223 %4 = sext i16 %3 to i32224 ret i32 %4225}226 227define i64 @load_unscaled_sext_i8_to_i64(i64 %a) {228; CHECK-LABEL: load_unscaled_sext_i8_to_i64229; CHECK: ldursb x0, [x0, #-8]230; CHECK-NOT: sxtb231 %1 = sub i64 %a, 8232 %2 = inttoptr i64 %1 to ptr233 %3 = load i8, ptr %2234 %4 = sext i8 %3 to i64235 ret i64 %4236}237 238define i64 @load_unscaled_sext_i16_to_i64(i64 %a) {239; CHECK-LABEL: load_unscaled_sext_i16_to_i64240; CHECK: ldursh x0, [x0, #-8]241; CHECK-NOT: sxth242 %1 = sub i64 %a, 8243 %2 = inttoptr i64 %1 to ptr244 %3 = load i16, ptr %2245 %4 = sext i16 %3 to i64246 ret i64 %4247}248 249define i64 @load_unscaled_sext_i32_to_i64(i64 %a) {250; CHECK-LABEL: load_unscaled_sext_i32_to_i64251; CHECK: ldursw x0, [x0, #-8]252; CHECK-NOT: sxtw253 %1 = sub i64 %a, 8254 %2 = inttoptr i64 %1 to ptr255 %3 = load i32, ptr %2256 %4 = sext i32 %3 to i64257 ret i64 %4258}259 260; Register261define i32 @load_register_zext_i8_to_i32(i64 %a, i64 %b) {262; CHECK-LABEL: load_register_zext_i8_to_i32263; CHECK: ldrb w0, [x0, x1]264; CHECK-NOT: uxtb265 %1 = add i64 %a, %b266 %2 = inttoptr i64 %1 to ptr267 %3 = load i8, ptr %2268 %4 = zext i8 %3 to i32269 ret i32 %4270}271 272define i32 @load_register_zext_i16_to_i32(i64 %a, i64 %b) {273; CHECK-LABEL: load_register_zext_i16_to_i32274; CHECK: ldrh w0, [x0, x1]275; CHECK-NOT: uxth276 %1 = add i64 %a, %b277 %2 = inttoptr i64 %1 to ptr278 %3 = load i16, ptr %2279 %4 = zext i16 %3 to i32280 ret i32 %4281}282 283define i64 @load_register_zext_i8_to_i64(i64 %a, i64 %b) {284; CHECK-LABEL: load_register_zext_i8_to_i64285; CHECK: ldrb w0, [x0, x1]286; CHECK-NOT: uxtb287 %1 = add i64 %a, %b288 %2 = inttoptr i64 %1 to ptr289 %3 = load i8, ptr %2290 %4 = zext i8 %3 to i64291 ret i64 %4292}293 294define i64 @load_register_zext_i16_to_i64(i64 %a, i64 %b) {295; CHECK-LABEL: load_register_zext_i16_to_i64296; CHECK: ldrh w0, [x0, x1]297; CHECK-NOT: uxth298 %1 = add i64 %a, %b299 %2 = inttoptr i64 %1 to ptr300 %3 = load i16, ptr %2301 %4 = zext i16 %3 to i64302 ret i64 %4303}304 305define i64 @load_register_zext_i32_to_i64(i64 %a, i64 %b) {306; CHECK-LABEL: load_register_zext_i32_to_i64307; CHECK: ldr w0, [x0, x1]308; CHECK-NOT: uxtw309 %1 = add i64 %a, %b310 %2 = inttoptr i64 %1 to ptr311 %3 = load i32, ptr %2312 %4 = zext i32 %3 to i64313 ret i64 %4314}315 316define i32 @load_register_sext_i8_to_i32(i64 %a, i64 %b) {317; CHECK-LABEL: load_register_sext_i8_to_i32318; CHECK: ldrsb w0, [x0, x1]319; CHECK-NOT: sxtb320 %1 = add i64 %a, %b321 %2 = inttoptr i64 %1 to ptr322 %3 = load i8, ptr %2323 %4 = sext i8 %3 to i32324 ret i32 %4325}326 327define i32 @load_register_sext_i16_to_i32(i64 %a, i64 %b) {328; CHECK-LABEL: load_register_sext_i16_to_i32329; CHECK: ldrsh w0, [x0, x1]330; CHECK-NOT: sxth331 %1 = add i64 %a, %b332 %2 = inttoptr i64 %1 to ptr333 %3 = load i16, ptr %2334 %4 = sext i16 %3 to i32335 ret i32 %4336}337 338define i64 @load_register_sext_i8_to_i64(i64 %a, i64 %b) {339; CHECK-LABEL: load_register_sext_i8_to_i64340; CHECK: ldrsb x0, [x0, x1]341; CHECK-NOT: sxtb342 %1 = add i64 %a, %b343 %2 = inttoptr i64 %1 to ptr344 %3 = load i8, ptr %2345 %4 = sext i8 %3 to i64346 ret i64 %4347}348 349define i64 @load_register_sext_i16_to_i64(i64 %a, i64 %b) {350; CHECK-LABEL: load_register_sext_i16_to_i64351; CHECK: ldrsh x0, [x0, x1]352; CHECK-NOT: sxth353 %1 = add i64 %a, %b354 %2 = inttoptr i64 %1 to ptr355 %3 = load i16, ptr %2356 %4 = sext i16 %3 to i64357 ret i64 %4358}359 360define i64 @load_register_sext_i32_to_i64(i64 %a, i64 %b) {361; CHECK-LABEL: load_register_sext_i32_to_i64362; CHECK: ldrsw x0, [x0, x1]363; CHECK-NOT: sxtw364 %1 = add i64 %a, %b365 %2 = inttoptr i64 %1 to ptr366 %3 = load i32, ptr %2367 %4 = sext i32 %3 to i64368 ret i64 %4369}370 371; Extend372define i32 @load_extend_zext_i8_to_i32(i64 %a, i32 %b) {373; CHECK-LABEL: load_extend_zext_i8_to_i32374; CHECK: ldrb w0, [x0, w1, sxtw]375; CHECK-NOT: uxtb376 %1 = sext i32 %b to i64377 %2 = add i64 %a, %1378 %3 = inttoptr i64 %2 to ptr379 %4 = load i8, ptr %3380 %5 = zext i8 %4 to i32381 ret i32 %5382}383 384define i32 @load_extend_zext_i16_to_i32(i64 %a, i32 %b) {385; CHECK-LABEL: load_extend_zext_i16_to_i32386; CHECK: ldrh w0, [x0, w1, sxtw]387; CHECK-NOT: uxth388 %1 = sext i32 %b to i64389 %2 = add i64 %a, %1390 %3 = inttoptr i64 %2 to ptr391 %4 = load i16, ptr %3392 %5 = zext i16 %4 to i32393 ret i32 %5394}395 396define i64 @load_extend_zext_i8_to_i64(i64 %a, i32 %b) {397; CHECK-LABEL: load_extend_zext_i8_to_i64398; CHECK: ldrb w0, [x0, w1, sxtw]399; CHECK-NOT: uxtb400 %1 = sext i32 %b to i64401 %2 = add i64 %a, %1402 %3 = inttoptr i64 %2 to ptr403 %4 = load i8, ptr %3404 %5 = zext i8 %4 to i64405 ret i64 %5406}407 408define i64 @load_extend_zext_i16_to_i64(i64 %a, i32 %b) {409; CHECK-LABEL: load_extend_zext_i16_to_i64410; CHECK: ldrh w0, [x0, w1, sxtw]411; CHECK-NOT: uxth412 %1 = sext i32 %b to i64413 %2 = add i64 %a, %1414 %3 = inttoptr i64 %2 to ptr415 %4 = load i16, ptr %3416 %5 = zext i16 %4 to i64417 ret i64 %5418}419 420define i64 @load_extend_zext_i32_to_i64(i64 %a, i32 %b) {421; CHECK-LABEL: load_extend_zext_i32_to_i64422; CHECK: ldr w0, [x0, w1, sxtw]423; CHECK-NOT: uxtw424 %1 = sext i32 %b to i64425 %2 = add i64 %a, %1426 %3 = inttoptr i64 %2 to ptr427 %4 = load i32, ptr %3428 %5 = zext i32 %4 to i64429 ret i64 %5430}431 432define i32 @load_extend_sext_i8_to_i32(i64 %a, i32 %b) {433; CHECK-LABEL: load_extend_sext_i8_to_i32434; CHECK: ldrsb w0, [x0, w1, sxtw]435; CHECK-NOT: sxtb436 %1 = sext i32 %b to i64437 %2 = add i64 %a, %1438 %3 = inttoptr i64 %2 to ptr439 %4 = load i8, ptr %3440 %5 = sext i8 %4 to i32441 ret i32 %5442}443 444define i32 @load_extend_sext_i16_to_i32(i64 %a, i32 %b) {445; CHECK-LABEL: load_extend_sext_i16_to_i32446; CHECK: ldrsh w0, [x0, w1, sxtw]447; CHECK-NOT: sxth448 %1 = sext i32 %b to i64449 %2 = add i64 %a, %1450 %3 = inttoptr i64 %2 to ptr451 %4 = load i16, ptr %3452 %5 = sext i16 %4 to i32453 ret i32 %5454}455 456define i64 @load_extend_sext_i8_to_i64(i64 %a, i32 %b) {457; CHECK-LABEL: load_extend_sext_i8_to_i64458; CHECK: ldrsb x0, [x0, w1, sxtw]459; CHECK-NOT: sxtb460 %1 = sext i32 %b to i64461 %2 = add i64 %a, %1462 %3 = inttoptr i64 %2 to ptr463 %4 = load i8, ptr %3464 %5 = sext i8 %4 to i64465 ret i64 %5466}467 468define i64 @load_extend_sext_i16_to_i64(i64 %a, i32 %b) {469; CHECK-LABEL: load_extend_sext_i16_to_i64470; CHECK: ldrsh x0, [x0, w1, sxtw]471; CHECK-NOT: sxth472 %1 = sext i32 %b to i64473 %2 = add i64 %a, %1474 %3 = inttoptr i64 %2 to ptr475 %4 = load i16, ptr %3476 %5 = sext i16 %4 to i64477 ret i64 %5478}479 480define i64 @load_extend_sext_i32_to_i64(i64 %a, i32 %b) {481; CHECK-LABEL: load_extend_sext_i32_to_i64482; CHECK: ldrsw x0, [x0, w1, sxtw]483; CHECK-NOT: sxtw484 %1 = sext i32 %b to i64485 %2 = add i64 %a, %1486 %3 = inttoptr i64 %2 to ptr487 %4 = load i32, ptr %3488 %5 = sext i32 %4 to i64489 ret i64 %5490}491 492