brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.9 KiB · 4eea79a Raw
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