662 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu | FileCheck %s3 4define i8 @scalarize_v16i8(ptr %p) {5; CHECK-LABEL: scalarize_v16i8:6; CHECK: // %bb.0:7; CHECK-NEXT: ldrb w8, [x0, #3]8; CHECK-NEXT: ldrb w9, [x0, #2]9; CHECK-NEXT: ldrb w10, [x0, #1]10; CHECK-NEXT: ldrb w11, [x0]11; CHECK-NEXT: ldrb w13, [x0, #5]12; CHECK-NEXT: ldrb w14, [x0, #4]13; CHECK-NEXT: add w8, w9, w814; CHECK-NEXT: ldrb w12, [x0, #15]15; CHECK-NEXT: ldrb w15, [x0, #11]16; CHECK-NEXT: add w10, w11, w1017; CHECK-NEXT: add w9, w14, w1318; CHECK-NEXT: ldrb w11, [x0, #10]19; CHECK-NEXT: ldrb w13, [x0, #9]20; CHECK-NEXT: add w8, w10, w821; CHECK-NEXT: ldrb w14, [x0, #8]22; CHECK-NEXT: ldrb w16, [x0, #7]23; CHECK-NEXT: add w11, w11, w1524; CHECK-NEXT: ldrb w17, [x0, #6]25; CHECK-NEXT: ldrb w18, [x0, #14]26; CHECK-NEXT: add w13, w14, w1327; CHECK-NEXT: ldrb w1, [x0, #13]28; CHECK-NEXT: ldrb w0, [x0, #12]29; CHECK-NEXT: add w16, w17, w1630; CHECK-NEXT: add w10, w13, w1131; CHECK-NEXT: add w12, w18, w1232; CHECK-NEXT: add w9, w9, w1633; CHECK-NEXT: add w14, w0, w134; CHECK-NEXT: add w8, w8, w935; CHECK-NEXT: add w11, w14, w1236; CHECK-NEXT: add w9, w10, w1137; CHECK-NEXT: add w0, w8, w938; CHECK-NEXT: ret39 %wide.load = load <16 x i8>, ptr %p, align 440 %l0 = extractelement <16 x i8> %wide.load, i32 041 %l1 = extractelement <16 x i8> %wide.load, i32 142 %l2 = extractelement <16 x i8> %wide.load, i32 243 %l3 = extractelement <16 x i8> %wide.load, i32 344 %l4 = extractelement <16 x i8> %wide.load, i32 445 %l5 = extractelement <16 x i8> %wide.load, i32 546 %l6 = extractelement <16 x i8> %wide.load, i32 647 %l7 = extractelement <16 x i8> %wide.load, i32 748 %l8 = extractelement <16 x i8> %wide.load, i32 849 %l9 = extractelement <16 x i8> %wide.load, i32 950 %l10 = extractelement <16 x i8> %wide.load, i32 1051 %l11 = extractelement <16 x i8> %wide.load, i32 1152 %l12 = extractelement <16 x i8> %wide.load, i32 1253 %l13 = extractelement <16 x i8> %wide.load, i32 1354 %l14 = extractelement <16 x i8> %wide.load, i32 1455 %l15 = extractelement <16 x i8> %wide.load, i32 1556 %a0 = add i8 %l0, %l157 %a1 = add i8 %l2, %l358 %a2 = add i8 %l4, %l559 %a3 = add i8 %l6, %l760 %a4 = add i8 %l8, %l961 %a5 = add i8 %l10, %l1162 %a6 = add i8 %l12, %l1363 %a7 = add i8 %l14, %l1564 %b0 = add i8 %a0, %a165 %b1 = add i8 %a2, %a366 %b2 = add i8 %a4, %a567 %b3 = add i8 %a6, %a768 %c0 = add i8 %b0, %b169 %c1 = add i8 %b2, %b370 %r = add i8 %c0, %c171 ret i8 %r72}73 74define i8 @scalarize_v8i8(ptr %p) {75; CHECK-LABEL: scalarize_v8i8:76; CHECK: // %bb.0:77; CHECK-NEXT: ldrb w8, [x0, #7]78; CHECK-NEXT: ldrb w9, [x0, #6]79; CHECK-NEXT: ldrb w10, [x0, #5]80; CHECK-NEXT: ldrb w11, [x0, #1]81; CHECK-NEXT: ldrb w12, [x0]82; CHECK-NEXT: ldrb w13, [x0, #4]83; CHECK-NEXT: add w8, w9, w884; CHECK-NEXT: ldrb w14, [x0, #3]85; CHECK-NEXT: ldrb w15, [x0, #2]86; CHECK-NEXT: add w11, w12, w1187; CHECK-NEXT: add w10, w13, w1088; CHECK-NEXT: add w12, w15, w1489; CHECK-NEXT: add w8, w10, w890; CHECK-NEXT: add w9, w11, w1291; CHECK-NEXT: add w0, w9, w892; CHECK-NEXT: ret93 %wide.load = load <8 x i8>, ptr %p, align 494 %l0 = extractelement <8 x i8> %wide.load, i32 095 %l1 = extractelement <8 x i8> %wide.load, i32 196 %l2 = extractelement <8 x i8> %wide.load, i32 297 %l3 = extractelement <8 x i8> %wide.load, i32 398 %l4 = extractelement <8 x i8> %wide.load, i32 499 %l5 = extractelement <8 x i8> %wide.load, i32 5100 %l6 = extractelement <8 x i8> %wide.load, i32 6101 %l7 = extractelement <8 x i8> %wide.load, i32 7102 %a0 = add i8 %l0, %l1103 %a1 = add i8 %l2, %l3104 %a2 = add i8 %l4, %l5105 %a3 = add i8 %l6, %l7106 %b0 = add i8 %a0, %a1107 %b1 = add i8 %a2, %a3108 %r = add i8 %b0, %b1109 ret i8 %r110}111 112define i16 @scalarize_v8i16(ptr %p) {113; CHECK-LABEL: scalarize_v8i16:114; CHECK: // %bb.0:115; CHECK-NEXT: ldrh w8, [x0, #14]116; CHECK-NEXT: ldrh w9, [x0, #12]117; CHECK-NEXT: ldrh w10, [x0, #10]118; CHECK-NEXT: ldrh w11, [x0, #2]119; CHECK-NEXT: ldrh w12, [x0]120; CHECK-NEXT: ldrh w13, [x0, #8]121; CHECK-NEXT: add w8, w9, w8122; CHECK-NEXT: ldrh w14, [x0, #6]123; CHECK-NEXT: ldrh w15, [x0, #4]124; CHECK-NEXT: add w11, w12, w11125; CHECK-NEXT: add w10, w13, w10126; CHECK-NEXT: add w12, w15, w14127; CHECK-NEXT: add w8, w10, w8128; CHECK-NEXT: add w9, w11, w12129; CHECK-NEXT: add w0, w9, w8130; CHECK-NEXT: ret131 %wide.load = load <8 x i16>, ptr %p, align 4132 %l0 = extractelement <8 x i16> %wide.load, i32 0133 %l1 = extractelement <8 x i16> %wide.load, i32 1134 %l2 = extractelement <8 x i16> %wide.load, i32 2135 %l3 = extractelement <8 x i16> %wide.load, i32 3136 %l4 = extractelement <8 x i16> %wide.load, i32 4137 %l5 = extractelement <8 x i16> %wide.load, i32 5138 %l6 = extractelement <8 x i16> %wide.load, i32 6139 %l7 = extractelement <8 x i16> %wide.load, i32 7140 %a0 = add i16 %l0, %l1141 %a1 = add i16 %l2, %l3142 %a2 = add i16 %l4, %l5143 %a3 = add i16 %l6, %l7144 %b0 = add i16 %a0, %a1145 %b1 = add i16 %a2, %a3146 %r = add i16 %b0, %b1147 ret i16 %r148}149 150define i16 @scalarize_v4i16(ptr %p) {151; CHECK-LABEL: scalarize_v4i16:152; CHECK: // %bb.0:153; CHECK-NEXT: ldrh w8, [x0, #6]154; CHECK-NEXT: ldrh w9, [x0, #4]155; CHECK-NEXT: ldrh w10, [x0, #2]156; CHECK-NEXT: ldrh w11, [x0]157; CHECK-NEXT: add w8, w9, w8158; CHECK-NEXT: add w10, w11, w10159; CHECK-NEXT: add w0, w10, w8160; CHECK-NEXT: ret161 %wide.load = load <4 x i16>, ptr %p, align 4162 %l0 = extractelement <4 x i16> %wide.load, i32 0163 %l1 = extractelement <4 x i16> %wide.load, i32 1164 %l2 = extractelement <4 x i16> %wide.load, i32 2165 %l3 = extractelement <4 x i16> %wide.load, i32 3166 %a0 = add i16 %l0, %l1167 %a1 = add i16 %l2, %l3168 %r = add i16 %a0, %a1169 ret i16 %r170}171 172define i32 @scalarize_v4i32(ptr %p) {173; CHECK-LABEL: scalarize_v4i32:174; CHECK: // %bb.0:175; CHECK-NEXT: ldp w9, w8, [x0]176; CHECK-NEXT: ldp w10, w11, [x0, #8]177; CHECK-NEXT: add w8, w9, w8178; CHECK-NEXT: add w9, w10, w11179; CHECK-NEXT: add w0, w8, w9180; CHECK-NEXT: ret181 %wide.load = load <4 x i32>, ptr %p, align 4182 %l0 = extractelement <4 x i32> %wide.load, i32 0183 %l1 = extractelement <4 x i32> %wide.load, i32 1184 %l2 = extractelement <4 x i32> %wide.load, i32 2185 %l3 = extractelement <4 x i32> %wide.load, i32 3186 %a0 = add i32 %l0, %l1187 %a1 = add i32 %l2, %l3188 %r = add i32 %a0, %a1189 ret i32 %r190}191 192define i64 @scalarize_v4i64(ptr %p) {193; CHECK-LABEL: scalarize_v4i64:194; CHECK: // %bb.0:195; CHECK-NEXT: ldp x8, x9, [x0]196; CHECK-NEXT: ldp x10, x11, [x0, #16]197; CHECK-NEXT: add x8, x8, x9198; CHECK-NEXT: add x9, x10, x11199; CHECK-NEXT: add x0, x8, x9200; CHECK-NEXT: ret201 %wide.load = load <4 x i64>, ptr %p, align 4202 %l0 = extractelement <4 x i64> %wide.load, i32 0203 %l1 = extractelement <4 x i64> %wide.load, i32 1204 %l2 = extractelement <4 x i64> %wide.load, i32 2205 %l3 = extractelement <4 x i64> %wide.load, i32 3206 %a0 = add i64 %l0, %l1207 %a1 = add i64 %l2, %l3208 %r = add i64 %a0, %a1209 ret i64 %r210}211 212define i64 @scalarize_v4i32_sext(ptr %p) {213; CHECK-LABEL: scalarize_v4i32_sext:214; CHECK: // %bb.0:215; CHECK-NEXT: ldpsw x9, x8, [x0, #8]216; CHECK-NEXT: ldpsw x11, x10, [x0]217; CHECK-NEXT: add x8, x9, x8218; CHECK-NEXT: add x10, x11, x10219; CHECK-NEXT: add x0, x10, x8220; CHECK-NEXT: ret221 %wide.load = load <4 x i32>, ptr %p, align 4222 %ext = sext <4 x i32> %wide.load to <4 x i64>223 %l0 = extractelement <4 x i64> %ext, i32 0224 %l1 = extractelement <4 x i64> %ext, i32 1225 %l2 = extractelement <4 x i64> %ext, i32 2226 %l3 = extractelement <4 x i64> %ext, i32 3227 %a0 = add i64 %l0, %l1228 %a1 = add i64 %l2, %l3229 %r = add i64 %a0, %a1230 ret i64 %r231}232 233define i64 @scalarize_v4i32_zext(ptr %p) {234; CHECK-LABEL: scalarize_v4i32_zext:235; CHECK: // %bb.0:236; CHECK-NEXT: ldp w9, w8, [x0, #8]237; CHECK-NEXT: ldp w11, w10, [x0]238; CHECK-NEXT: add x8, x9, x8239; CHECK-NEXT: add x10, x11, x10240; CHECK-NEXT: add x0, x10, x8241; CHECK-NEXT: ret242 %wide.load = load <4 x i32>, ptr %p, align 4243 %ext = zext <4 x i32> %wide.load to <4 x i64>244 %l0 = extractelement <4 x i64> %ext, i32 0245 %l1 = extractelement <4 x i64> %ext, i32 1246 %l2 = extractelement <4 x i64> %ext, i32 2247 %l3 = extractelement <4 x i64> %ext, i32 3248 %a0 = add i64 %l0, %l1249 %a1 = add i64 %l2, %l3250 %r = add i64 %a0, %a1251 ret i64 %r252}253 254define half @scalarize_v4f16(ptr %p) {255; CHECK-LABEL: scalarize_v4f16:256; CHECK: // %bb.0:257; CHECK-NEXT: ldr d0, [x0]258; CHECK-NEXT: mov h1, v0.h[1]259; CHECK-NEXT: mov h2, v0.h[2]260; CHECK-NEXT: mov h3, v0.h[3]261; CHECK-NEXT: fcvt s0, h0262; CHECK-NEXT: fcvt s1, h1263; CHECK-NEXT: fcvt s3, h3264; CHECK-NEXT: fcvt s2, h2265; CHECK-NEXT: fadd s0, s0, s1266; CHECK-NEXT: fadd s1, s2, s3267; CHECK-NEXT: fcvt h0, s0268; CHECK-NEXT: fcvt h1, s1269; CHECK-NEXT: fcvt s1, h1270; CHECK-NEXT: fcvt s0, h0271; CHECK-NEXT: fadd s0, s0, s1272; CHECK-NEXT: fcvt h0, s0273; CHECK-NEXT: ret274 %wide.load = load <4 x half>, ptr %p, align 4275 %l0 = extractelement <4 x half> %wide.load, i32 0276 %l1 = extractelement <4 x half> %wide.load, i32 1277 %l2 = extractelement <4 x half> %wide.load, i32 2278 %l3 = extractelement <4 x half> %wide.load, i32 3279 %a0 = fadd half %l0, %l1280 %a1 = fadd half %l2, %l3281 %r = fadd half %a0, %a1282 ret half %r283}284 285define float @scalarize_v4f32(ptr %p) {286; CHECK-LABEL: scalarize_v4f32:287; CHECK: // %bb.0:288; CHECK-NEXT: ldr q0, [x0]289; CHECK-NEXT: mov s1, v0.s[2]290; CHECK-NEXT: mov s2, v0.s[3]291; CHECK-NEXT: faddp s0, v0.2s292; CHECK-NEXT: fadd s1, s1, s2293; CHECK-NEXT: fadd s0, s0, s1294; CHECK-NEXT: ret295 %wide.load = load <4 x float>, ptr %p, align 4296 %l0 = extractelement <4 x float> %wide.load, i32 0297 %l1 = extractelement <4 x float> %wide.load, i32 1298 %l2 = extractelement <4 x float> %wide.load, i32 2299 %l3 = extractelement <4 x float> %wide.load, i32 3300 %a0 = fadd float %l0, %l1301 %a1 = fadd float %l2, %l3302 %r = fadd float %a0, %a1303 ret float %r304}305 306define double @scalarize_v4f64(ptr %p) {307; CHECK-LABEL: scalarize_v4f64:308; CHECK: // %bb.0:309; CHECK-NEXT: ldp q1, q0, [x0]310; CHECK-NEXT: faddp d1, v1.2d311; CHECK-NEXT: faddp d0, v0.2d312; CHECK-NEXT: fadd d0, d1, d0313; CHECK-NEXT: ret314 %wide.load = load <4 x double>, ptr %p, align 4315 %l0 = extractelement <4 x double> %wide.load, i32 0316 %l1 = extractelement <4 x double> %wide.load, i32 1317 %l2 = extractelement <4 x double> %wide.load, i32 2318 %l3 = extractelement <4 x double> %wide.load, i32 3319 %a0 = fadd double %l0, %l1320 %a1 = fadd double %l2, %l3321 %r = fadd double %a0, %a1322 ret double %r323}324 325 326define float @scalarize_into_load(i64 %22, ptr %23, ptr %rawA, ptr %rawB) {327; CHECK-LABEL: scalarize_into_load:328; CHECK: // %bb.0: // %entry329; CHECK-NEXT: ldp x8, x9, [x1]330; CHECK-NEXT: ldp x10, x11, [x1, #16]331; CHECK-NEXT: ldp x12, x13, [x1, #64]332; CHECK-NEXT: ldr s0, [x2, x8, lsl #2]333; CHECK-NEXT: ldr s1, [x2, x9, lsl #2]334; CHECK-NEXT: ldp x8, x9, [x1, #32]335; CHECK-NEXT: ldr s2, [x2, x10, lsl #2]336; CHECK-NEXT: ldr s3, [x2, x11, lsl #2]337; CHECK-NEXT: fadd s0, s0, s1338; CHECK-NEXT: ldr s6, [x2, x12, lsl #2]339; CHECK-NEXT: ldp x10, x11, [x1, #48]340; CHECK-NEXT: ldr s7, [x2, x13, lsl #2]341; CHECK-NEXT: fadd s1, s2, s3342; CHECK-NEXT: ldr s2, [x2, x8, lsl #2]343; CHECK-NEXT: ldr s3, [x2, x9, lsl #2]344; CHECK-NEXT: ldp x14, x15, [x1, #80]345; CHECK-NEXT: fadd s2, s2, s3346; CHECK-NEXT: ldr s4, [x2, x10, lsl #2]347; CHECK-NEXT: ldr s5, [x2, x11, lsl #2]348; CHECK-NEXT: ldp x16, x17, [x1, #96]349; CHECK-NEXT: fadd s3, s4, s5350; CHECK-NEXT: fadd s4, s6, s7351; CHECK-NEXT: fadd s0, s0, s1352; CHECK-NEXT: ldp x18, x0, [x1, #112]353; CHECK-NEXT: ldr s16, [x2, x14, lsl #2]354; CHECK-NEXT: ldr s17, [x2, x15, lsl #2]355; CHECK-NEXT: ldr s18, [x2, x16, lsl #2]356; CHECK-NEXT: ldr s19, [x2, x17, lsl #2]357; CHECK-NEXT: ldr s20, [x2, x18, lsl #2]358; CHECK-NEXT: ldr s21, [x2, x0, lsl #2]359; CHECK-NEXT: fadd s5, s16, s17360; CHECK-NEXT: fadd s6, s18, s19361; CHECK-NEXT: fadd s1, s2, s3362; CHECK-NEXT: fadd s7, s20, s21363; CHECK-NEXT: fadd s2, s4, s5364; CHECK-NEXT: fadd s0, s0, s1365; CHECK-NEXT: fadd s3, s6, s7366; CHECK-NEXT: fadd s1, s2, s3367; CHECK-NEXT: fadd s0, s0, s1368; CHECK-NEXT: ret369entry:370 %wide.load = load <16 x i64>, ptr %23, align 4371 %25 = extractelement <16 x i64> %wide.load, i32 0372 %26 = getelementptr inbounds float, ptr %rawA, i64 %25373 %27 = extractelement <16 x i64> %wide.load, i32 1374 %28 = getelementptr inbounds float, ptr %rawA, i64 %27375 %29 = extractelement <16 x i64> %wide.load, i32 2376 %30 = getelementptr inbounds float, ptr %rawA, i64 %29377 %31 = extractelement <16 x i64> %wide.load, i32 3378 %32 = getelementptr inbounds float, ptr %rawA, i64 %31379 %33 = extractelement <16 x i64> %wide.load, i32 4380 %34 = getelementptr inbounds float, ptr %rawA, i64 %33381 %35 = extractelement <16 x i64> %wide.load, i32 5382 %36 = getelementptr inbounds float, ptr %rawA, i64 %35383 %37 = extractelement <16 x i64> %wide.load, i32 6384 %38 = getelementptr inbounds float, ptr %rawA, i64 %37385 %39 = extractelement <16 x i64> %wide.load, i32 7386 %40 = getelementptr inbounds float, ptr %rawA, i64 %39387 %41 = extractelement <16 x i64> %wide.load, i32 8388 %42 = getelementptr inbounds float, ptr %rawA, i64 %41389 %43 = extractelement <16 x i64> %wide.load, i32 9390 %44 = getelementptr inbounds float, ptr %rawA, i64 %43391 %45 = extractelement <16 x i64> %wide.load, i32 10392 %46 = getelementptr inbounds float, ptr %rawA, i64 %45393 %47 = extractelement <16 x i64> %wide.load, i32 11394 %48 = getelementptr inbounds float, ptr %rawA, i64 %47395 %49 = extractelement <16 x i64> %wide.load, i32 12396 %50 = getelementptr inbounds float, ptr %rawA, i64 %49397 %51 = extractelement <16 x i64> %wide.load, i32 13398 %52 = getelementptr inbounds float, ptr %rawA, i64 %51399 %53 = extractelement <16 x i64> %wide.load, i32 14400 %54 = getelementptr inbounds float, ptr %rawA, i64 %53401 %55 = extractelement <16 x i64> %wide.load, i32 15402 %56 = getelementptr inbounds float, ptr %rawA, i64 %55403 %59 = load float, ptr %26, align 4404 %60 = load float, ptr %28, align 4405 %61 = load float, ptr %30, align 4406 %62 = load float, ptr %32, align 4407 %63 = load float, ptr %34, align 4408 %64 = load float, ptr %36, align 4409 %65 = load float, ptr %38, align 4410 %66 = load float, ptr %40, align 4411 %67 = load float, ptr %42, align 4412 %68 = load float, ptr %44, align 4413 %69 = load float, ptr %46, align 4414 %70 = load float, ptr %48, align 4415 %71 = load float, ptr %50, align 4416 %72 = load float, ptr %52, align 4417 %73 = load float, ptr %54, align 4418 %74 = load float, ptr %56, align 4419 %a1 = fadd float %59, %60420 %a2 = fadd float %61, %62421 %a3 = fadd float %63, %64422 %a4 = fadd float %65, %66423 %a5 = fadd float %67, %68424 %a6 = fadd float %69, %70425 %a7 = fadd float %71, %72426 %a8 = fadd float %73, %74427 %a9 = fadd float %a1, %a2428 %a10 = fadd float %a3, %a4429 %a11 = fadd float %a5, %a6430 %a12 = fadd float %a7, %a8431 %a13 = fadd float %a9, %a10432 %a14 = fadd float %a11, %a12433 %a15 = fadd float %a13, %a14434 ret float %a15435}436 437define float @scalarize_into_load_sext(i64 %22, ptr %23, ptr %rawA, ptr %rawB) {438; CHECK-LABEL: scalarize_into_load_sext:439; CHECK: // %bb.0: // %entry440; CHECK-NEXT: ldpsw x9, x8, [x1]441; CHECK-NEXT: ldpsw x11, x10, [x1, #8]442; CHECK-NEXT: ldpsw x13, x12, [x1, #24]443; CHECK-NEXT: ldr s0, [x2, x9, lsl #2]444; CHECK-NEXT: ldr s1, [x2, x8, lsl #2]445; CHECK-NEXT: ldpsw x9, x8, [x1, #56]446; CHECK-NEXT: ldr s2, [x2, x11, lsl #2]447; CHECK-NEXT: ldr s3, [x2, x10, lsl #2]448; CHECK-NEXT: fadd s0, s0, s1449; CHECK-NEXT: ldpsw x11, x10, [x1, #48]450; CHECK-NEXT: ldpsw x15, x14, [x1, #16]451; CHECK-NEXT: ldpsw x17, x16, [x1, #40]452; CHECK-NEXT: ldpsw x0, x18, [x1, #32]453; CHECK-NEXT: fadd s1, s2, s3454; CHECK-NEXT: ldr s2, [x2, x15, lsl #2]455; CHECK-NEXT: ldr s3, [x2, x14, lsl #2]456; CHECK-NEXT: ldr s4, [x2, x13, lsl #2]457; CHECK-NEXT: ldr s5, [x2, x12, lsl #2]458; CHECK-NEXT: ldr s16, [x2, x17, lsl #2]459; CHECK-NEXT: ldr s6, [x2, x0, lsl #2]460; CHECK-NEXT: fadd s2, s2, s3461; CHECK-NEXT: ldr s7, [x2, x18, lsl #2]462; CHECK-NEXT: ldr s17, [x2, x16, lsl #2]463; CHECK-NEXT: fadd s3, s4, s5464; CHECK-NEXT: ldr s18, [x2, x11, lsl #2]465; CHECK-NEXT: ldr s19, [x2, x10, lsl #2]466; CHECK-NEXT: fadd s4, s6, s7467; CHECK-NEXT: fadd s0, s0, s1468; CHECK-NEXT: ldr s20, [x2, x9, lsl #2]469; CHECK-NEXT: ldr s21, [x2, x8, lsl #2]470; CHECK-NEXT: fadd s5, s16, s17471; CHECK-NEXT: fadd s6, s18, s19472; CHECK-NEXT: fadd s7, s20, s21473; CHECK-NEXT: fadd s1, s2, s3474; CHECK-NEXT: fadd s2, s4, s5475; CHECK-NEXT: fadd s3, s6, s7476; CHECK-NEXT: fadd s0, s0, s1477; CHECK-NEXT: fadd s1, s2, s3478; CHECK-NEXT: fadd s0, s0, s1479; CHECK-NEXT: ret480entry:481 %wide.load = load <16 x i32>, ptr %23, align 4482 %24 = sext <16 x i32> %wide.load to <16 x i64>483 %25 = extractelement <16 x i64> %24, i32 0484 %26 = getelementptr inbounds float, ptr %rawA, i64 %25485 %27 = extractelement <16 x i64> %24, i32 1486 %28 = getelementptr inbounds float, ptr %rawA, i64 %27487 %29 = extractelement <16 x i64> %24, i32 2488 %30 = getelementptr inbounds float, ptr %rawA, i64 %29489 %31 = extractelement <16 x i64> %24, i32 3490 %32 = getelementptr inbounds float, ptr %rawA, i64 %31491 %33 = extractelement <16 x i64> %24, i32 4492 %34 = getelementptr inbounds float, ptr %rawA, i64 %33493 %35 = extractelement <16 x i64> %24, i32 5494 %36 = getelementptr inbounds float, ptr %rawA, i64 %35495 %37 = extractelement <16 x i64> %24, i32 6496 %38 = getelementptr inbounds float, ptr %rawA, i64 %37497 %39 = extractelement <16 x i64> %24, i32 7498 %40 = getelementptr inbounds float, ptr %rawA, i64 %39499 %41 = extractelement <16 x i64> %24, i32 8500 %42 = getelementptr inbounds float, ptr %rawA, i64 %41501 %43 = extractelement <16 x i64> %24, i32 9502 %44 = getelementptr inbounds float, ptr %rawA, i64 %43503 %45 = extractelement <16 x i64> %24, i32 10504 %46 = getelementptr inbounds float, ptr %rawA, i64 %45505 %47 = extractelement <16 x i64> %24, i32 11506 %48 = getelementptr inbounds float, ptr %rawA, i64 %47507 %49 = extractelement <16 x i64> %24, i32 12508 %50 = getelementptr inbounds float, ptr %rawA, i64 %49509 %51 = extractelement <16 x i64> %24, i32 13510 %52 = getelementptr inbounds float, ptr %rawA, i64 %51511 %53 = extractelement <16 x i64> %24, i32 14512 %54 = getelementptr inbounds float, ptr %rawA, i64 %53513 %55 = extractelement <16 x i64> %24, i32 15514 %56 = getelementptr inbounds float, ptr %rawA, i64 %55515 %59 = load float, ptr %26, align 4516 %60 = load float, ptr %28, align 4517 %61 = load float, ptr %30, align 4518 %62 = load float, ptr %32, align 4519 %63 = load float, ptr %34, align 4520 %64 = load float, ptr %36, align 4521 %65 = load float, ptr %38, align 4522 %66 = load float, ptr %40, align 4523 %67 = load float, ptr %42, align 4524 %68 = load float, ptr %44, align 4525 %69 = load float, ptr %46, align 4526 %70 = load float, ptr %48, align 4527 %71 = load float, ptr %50, align 4528 %72 = load float, ptr %52, align 4529 %73 = load float, ptr %54, align 4530 %74 = load float, ptr %56, align 4531 %a1 = fadd float %59, %60532 %a2 = fadd float %61, %62533 %a3 = fadd float %63, %64534 %a4 = fadd float %65, %66535 %a5 = fadd float %67, %68536 %a6 = fadd float %69, %70537 %a7 = fadd float %71, %72538 %a8 = fadd float %73, %74539 %a9 = fadd float %a1, %a2540 %a10 = fadd float %a3, %a4541 %a11 = fadd float %a5, %a6542 %a12 = fadd float %a7, %a8543 %a13 = fadd float %a9, %a10544 %a14 = fadd float %a11, %a12545 %a15 = fadd float %a13, %a14546 ret float %a15547}548 549define float @scalarize_into_load_zext(i64 %22, ptr %23, ptr %rawA, ptr %rawB) {550; CHECK-LABEL: scalarize_into_load_zext:551; CHECK: // %bb.0: // %entry552; CHECK-NEXT: ldp w9, w8, [x1]553; CHECK-NEXT: ldp w11, w10, [x1, #8]554; CHECK-NEXT: ldp w13, w12, [x1, #24]555; CHECK-NEXT: ldr s0, [x2, x9, lsl #2]556; CHECK-NEXT: ldr s1, [x2, x8, lsl #2]557; CHECK-NEXT: ldp w9, w8, [x1, #56]558; CHECK-NEXT: ldr s2, [x2, x11, lsl #2]559; CHECK-NEXT: ldr s3, [x2, x10, lsl #2]560; CHECK-NEXT: fadd s0, s0, s1561; CHECK-NEXT: ldp w11, w10, [x1, #48]562; CHECK-NEXT: ldp w15, w14, [x1, #16]563; CHECK-NEXT: ldp w17, w16, [x1, #40]564; CHECK-NEXT: ldp w0, w18, [x1, #32]565; CHECK-NEXT: fadd s1, s2, s3566; CHECK-NEXT: ldr s2, [x2, x15, lsl #2]567; CHECK-NEXT: ldr s3, [x2, x14, lsl #2]568; CHECK-NEXT: ldr s4, [x2, x13, lsl #2]569; CHECK-NEXT: ldr s5, [x2, x12, lsl #2]570; CHECK-NEXT: ldr s16, [x2, x17, lsl #2]571; CHECK-NEXT: ldr s6, [x2, x0, lsl #2]572; CHECK-NEXT: fadd s2, s2, s3573; CHECK-NEXT: ldr s7, [x2, x18, lsl #2]574; CHECK-NEXT: ldr s17, [x2, x16, lsl #2]575; CHECK-NEXT: fadd s3, s4, s5576; CHECK-NEXT: ldr s18, [x2, x11, lsl #2]577; CHECK-NEXT: ldr s19, [x2, x10, lsl #2]578; CHECK-NEXT: fadd s4, s6, s7579; CHECK-NEXT: fadd s0, s0, s1580; CHECK-NEXT: ldr s20, [x2, x9, lsl #2]581; CHECK-NEXT: ldr s21, [x2, x8, lsl #2]582; CHECK-NEXT: fadd s5, s16, s17583; CHECK-NEXT: fadd s6, s18, s19584; CHECK-NEXT: fadd s7, s20, s21585; CHECK-NEXT: fadd s1, s2, s3586; CHECK-NEXT: fadd s2, s4, s5587; CHECK-NEXT: fadd s3, s6, s7588; CHECK-NEXT: fadd s0, s0, s1589; CHECK-NEXT: fadd s1, s2, s3590; CHECK-NEXT: fadd s0, s0, s1591; CHECK-NEXT: ret592entry:593 %wide.load = load <16 x i32>, ptr %23, align 4594 %24 = zext <16 x i32> %wide.load to <16 x i64>595 %25 = extractelement <16 x i64> %24, i32 0596 %26 = getelementptr inbounds float, ptr %rawA, i64 %25597 %27 = extractelement <16 x i64> %24, i32 1598 %28 = getelementptr inbounds float, ptr %rawA, i64 %27599 %29 = extractelement <16 x i64> %24, i32 2600 %30 = getelementptr inbounds float, ptr %rawA, i64 %29601 %31 = extractelement <16 x i64> %24, i32 3602 %32 = getelementptr inbounds float, ptr %rawA, i64 %31603 %33 = extractelement <16 x i64> %24, i32 4604 %34 = getelementptr inbounds float, ptr %rawA, i64 %33605 %35 = extractelement <16 x i64> %24, i32 5606 %36 = getelementptr inbounds float, ptr %rawA, i64 %35607 %37 = extractelement <16 x i64> %24, i32 6608 %38 = getelementptr inbounds float, ptr %rawA, i64 %37609 %39 = extractelement <16 x i64> %24, i32 7610 %40 = getelementptr inbounds float, ptr %rawA, i64 %39611 %41 = extractelement <16 x i64> %24, i32 8612 %42 = getelementptr inbounds float, ptr %rawA, i64 %41613 %43 = extractelement <16 x i64> %24, i32 9614 %44 = getelementptr inbounds float, ptr %rawA, i64 %43615 %45 = extractelement <16 x i64> %24, i32 10616 %46 = getelementptr inbounds float, ptr %rawA, i64 %45617 %47 = extractelement <16 x i64> %24, i32 11618 %48 = getelementptr inbounds float, ptr %rawA, i64 %47619 %49 = extractelement <16 x i64> %24, i32 12620 %50 = getelementptr inbounds float, ptr %rawA, i64 %49621 %51 = extractelement <16 x i64> %24, i32 13622 %52 = getelementptr inbounds float, ptr %rawA, i64 %51623 %53 = extractelement <16 x i64> %24, i32 14624 %54 = getelementptr inbounds float, ptr %rawA, i64 %53625 %55 = extractelement <16 x i64> %24, i32 15626 %56 = getelementptr inbounds float, ptr %rawA, i64 %55627 %59 = load float, ptr %26, align 4628 %60 = load float, ptr %28, align 4629 %61 = load float, ptr %30, align 4630 %62 = load float, ptr %32, align 4631 %63 = load float, ptr %34, align 4632 %64 = load float, ptr %36, align 4633 %65 = load float, ptr %38, align 4634 %66 = load float, ptr %40, align 4635 %67 = load float, ptr %42, align 4636 %68 = load float, ptr %44, align 4637 %69 = load float, ptr %46, align 4638 %70 = load float, ptr %48, align 4639 %71 = load float, ptr %50, align 4640 %72 = load float, ptr %52, align 4641 %73 = load float, ptr %54, align 4642 %74 = load float, ptr %56, align 4643 %a1 = fadd float %59, %60644 %a2 = fadd float %61, %62645 %a3 = fadd float %63, %64646 %a4 = fadd float %65, %66647 %a5 = fadd float %67, %68648 %a6 = fadd float %69, %70649 %a7 = fadd float %71, %72650 %a8 = fadd float %73, %74651 %a9 = fadd float %a1, %a2652 %a10 = fadd float %a3, %a4653 %a11 = fadd float %a5, %a6654 %a12 = fadd float %a7, %a8655 %a13 = fadd float %a9, %a10656 %a14 = fadd float %a11, %a12657 %a15 = fadd float %a13, %a14658 ret float %a15659}660 661 662