brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.8 KiB · 039025d Raw
384 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s --mattr=+complxnum,+neon -o - | FileCheck %s3 4target triple = "aarch64"5; Expected to transform6;   *p = (a * b);7;   return (a * b) * a;8define <4 x float> @mul_triangle(<4 x float> %a, <4 x float> %b, ptr %p) {9; CHECK-LABEL: mul_triangle:10; CHECK:       // %bb.0: // %entry11; CHECK-NEXT:    movi v3.2d, #000000000000000012; CHECK-NEXT:    movi v2.2d, #000000000000000013; CHECK-NEXT:    fcmla v3.4s, v0.4s, v1.4s, #014; CHECK-NEXT:    fcmla v3.4s, v0.4s, v1.4s, #9015; CHECK-NEXT:    fcmla v2.4s, v3.4s, v0.4s, #016; CHECK-NEXT:    str q3, [x0]17; CHECK-NEXT:    fcmla v2.4s, v3.4s, v0.4s, #9018; CHECK-NEXT:    mov v0.16b, v2.16b19; CHECK-NEXT:    ret20entry:21  %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>22  %strided.vec35 = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>23  %strided.vec37 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>24  %strided.vec38 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>25  %0 = fmul fast <2 x float> %strided.vec37, %strided.vec26  %1 = fmul fast <2 x float> %strided.vec38, %strided.vec3527  %2 = fsub fast <2 x float> %0, %128  %3 = fmul fast <2 x float> %2, %strided.vec3529  %4 = fmul fast <2 x float> %strided.vec38, %strided.vec30  %5 = fmul fast <2 x float> %strided.vec35, %strided.vec3731  %6 = fadd fast <2 x float> %4, %532  %otheruse = shufflevector <2 x float> %2, <2 x float> %6, <4 x i32> <i32 0, i32 2, i32 1, i32 3>33  store <4 x float> %otheruse, ptr %p34  %7 = fmul fast <2 x float> %6, %strided.vec35  %8 = fadd fast <2 x float> %3, %736  %9 = fmul fast <2 x float> %2, %strided.vec37  %10 = fmul fast <2 x float> %6, %strided.vec3538  %11 = fsub fast <2 x float> %9, %1039  %interleaved.vec = shufflevector <2 x float> %11, <2 x float> %8, <4 x i32> <i32 0, i32 2, i32 1, i32 3>40  ret <4 x float> %interleaved.vec41}42 43; Expected to not transform. Shows that external use prevents deinterleaving.44;   *p = (a * b).real();45;   return (a * b) * a;46define <4 x float> @mul_triangle_external_use(<4 x float> %a, <4 x float> %b, ptr %p) {47; CHECK-LABEL: mul_triangle_external_use:48; CHECK:       // %bb.0: // %entry49; CHECK-NEXT:    ext v2.16b, v0.16b, v0.16b, #850; CHECK-NEXT:    ext v3.16b, v1.16b, v1.16b, #851; CHECK-NEXT:    zip2 v4.2s, v0.2s, v2.2s52; CHECK-NEXT:    zip1 v5.2s, v1.2s, v3.2s53; CHECK-NEXT:    zip1 v0.2s, v0.2s, v2.2s54; CHECK-NEXT:    zip2 v1.2s, v1.2s, v3.2s55; CHECK-NEXT:    fmul v2.2s, v4.2s, v5.2s56; CHECK-NEXT:    fmul v3.2s, v1.2s, v4.2s57; CHECK-NEXT:    fmla v2.2s, v0.2s, v1.2s58; CHECK-NEXT:    fneg v1.2s, v3.2s59; CHECK-NEXT:    fmul v3.2s, v2.2s, v4.2s60; CHECK-NEXT:    str d2, [x0]61; CHECK-NEXT:    fmla v1.2s, v0.2s, v5.2s62; CHECK-NEXT:    fmul v5.2s, v2.2s, v0.2s63; CHECK-NEXT:    fneg v3.2s, v3.2s64; CHECK-NEXT:    fmla v5.2s, v4.2s, v1.2s65; CHECK-NEXT:    fmla v3.2s, v0.2s, v1.2s66; CHECK-NEXT:    zip1 v0.4s, v3.4s, v5.4s67; CHECK-NEXT:    ret68entry:69  %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>70  %strided.vec35 = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>71  %strided.vec37 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>72  %strided.vec38 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>73  %0 = fmul fast <2 x float> %strided.vec37, %strided.vec74  %1 = fmul fast <2 x float> %strided.vec38, %strided.vec3575  %2 = fsub fast <2 x float> %0, %176  %3 = fmul fast <2 x float> %2, %strided.vec3577  %4 = fmul fast <2 x float> %strided.vec38, %strided.vec78  %5 = fmul fast <2 x float> %strided.vec35, %strided.vec3779  %6 = fadd fast <2 x float> %4, %580  store <2 x float> %6, ptr %p81  %7 = fmul fast <2 x float> %6, %strided.vec82  %8 = fadd fast <2 x float> %3, %783  %9 = fmul fast <2 x float> %2, %strided.vec84  %10 = fmul fast <2 x float> %6, %strided.vec3585  %11 = fsub fast <2 x float> %9, %1086  %interleaved.vec = shufflevector <2 x float> %11, <2 x float> %8, <4 x i32> <i32 0, i32 2, i32 1, i32 3>87  ret <4 x float> %interleaved.vec88}89 90; Expected to transform partially (only d * c). Shows that external use of shufflevector does not prevent deinterleaving.91;   *p1 = (a * b).real();92;   *p2 = (a * b) * c;93;   return d * c;94define <4 x float> @multiple_muls_shuffle_external(<4 x float> %a, <4 x float> %b, <4 x float> %c, <4 x float> %d, ptr %p1, ptr %p2) {95; CHECK-LABEL: multiple_muls_shuffle_external:96; CHECK:       // %bb.0: // %entry97; CHECK-NEXT:    ext v5.16b, v0.16b, v0.16b, #898; CHECK-NEXT:    ext v6.16b, v1.16b, v1.16b, #899; CHECK-NEXT:    ext v4.16b, v2.16b, v2.16b, #8100; CHECK-NEXT:    zip2 v7.2s, v0.2s, v5.2s101; CHECK-NEXT:    zip1 v16.2s, v1.2s, v6.2s102; CHECK-NEXT:    zip2 v1.2s, v1.2s, v6.2s103; CHECK-NEXT:    zip1 v0.2s, v0.2s, v5.2s104; CHECK-NEXT:    fmul v5.2s, v16.2s, v7.2s105; CHECK-NEXT:    fmul v6.2s, v1.2s, v7.2s106; CHECK-NEXT:    fmla v5.2s, v0.2s, v1.2s107; CHECK-NEXT:    fneg v1.2s, v6.2s108; CHECK-NEXT:    zip1 v6.2s, v2.2s, v4.2s109; CHECK-NEXT:    zip2 v4.2s, v2.2s, v4.2s110; CHECK-NEXT:    fmla v1.2s, v0.2s, v16.2s111; CHECK-NEXT:    fmul v17.2s, v6.2s, v5.2s112; CHECK-NEXT:    movi v0.2d, #0000000000000000113; CHECK-NEXT:    fmul v5.2s, v4.2s, v5.2s114; CHECK-NEXT:    fmla v17.2s, v1.2s, v4.2s115; CHECK-NEXT:    fcmla v0.4s, v2.4s, v3.4s, #0116; CHECK-NEXT:    str d1, [x0]117; CHECK-NEXT:    fneg v16.2s, v5.2s118; CHECK-NEXT:    fcmla v0.4s, v2.4s, v3.4s, #90119; CHECK-NEXT:    fmla v16.2s, v1.2s, v6.2s120; CHECK-NEXT:    st2 { v16.2s, v17.2s }, [x1]121; CHECK-NEXT:    ret122entry:123  %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>124  %strided.vec88 = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>125  %strided.vec90 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>126  %strided.vec91 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>127  %0 = fmul fast <2 x float> %strided.vec91, %strided.vec128  %1 = fmul fast <2 x float> %strided.vec90, %strided.vec88129  %2 = fadd fast <2 x float> %0, %1130  %3 = fmul fast <2 x float> %strided.vec90, %strided.vec131  %4 = fmul fast <2 x float> %strided.vec91, %strided.vec88132  %5 = fsub fast <2 x float> %3, %4133  store <2 x float> %5, ptr %p1134  %strided.vec93 = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>135  %strided.vec94 = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>136  %6 = fmul fast <2 x float> %strided.vec94, %5137  %7 = fmul fast <2 x float> %strided.vec93, %2138  %8 = fadd fast <2 x float> %6, %7139  %9 = fmul fast <2 x float> %strided.vec93, %5140  %10 = fmul fast <2 x float> %strided.vec94, %2141  %11 = fsub fast <2 x float> %9, %10142  %interleaved.vec = shufflevector <2 x float> %11, <2 x float> %8, <4 x i32> <i32 0, i32 2, i32 1, i32 3>143  store <4 x float> %interleaved.vec, ptr %p2144  %strided.vec96 = shufflevector <4 x float> %d, <4 x float> poison, <2 x i32> <i32 0, i32 2>145  %strided.vec97 = shufflevector <4 x float> %d, <4 x float> poison, <2 x i32> <i32 1, i32 3>146  %12 = fmul fast <2 x float> %strided.vec96, %strided.vec94147  %13 = fmul fast <2 x float> %strided.vec97, %strided.vec93148  %14 = fadd fast <2 x float> %13, %12149  %15 = fmul fast <2 x float> %strided.vec96, %strided.vec93150  %16 = fmul fast <2 x float> %strided.vec97, %strided.vec94151  %17 = fsub fast <2 x float> %15, %16152  %interleaved.vec98 = shufflevector <2 x float> %17, <2 x float> %14, <4 x i32> <i32 0, i32 2, i32 1, i32 3>153  ret <4 x float> %interleaved.vec98154}155 156; Same as above but data are loaded from memory instead of being passes as arguments.157; Expected to transform partially (only d * c).158; Shows that ld2 is not generated for `c` although it used by both complex `d * c` and non-complex `(a * b) * c` instruction chains.159define <4 x float> @multiple_muls_shuffle_external_with_loads(ptr %ptr_a, ptr %ptr_b, ptr %ptr_c, ptr %ptr_d, ptr %p1, ptr %p2) {160; CHECK-LABEL: multiple_muls_shuffle_external_with_loads:161; CHECK:       // %bb.0: // %entry162; CHECK-NEXT:    ld2 { v0.2s, v1.2s }, [x0]163; CHECK-NEXT:    ld2 { v2.2s, v3.2s }, [x1]164; CHECK-NEXT:    fmul v4.2s, v3.2s, v1.2s165; CHECK-NEXT:    fmul v6.2s, v2.2s, v1.2s166; CHECK-NEXT:    fneg v4.2s, v4.2s167; CHECK-NEXT:    fmla v6.2s, v0.2s, v3.2s168; CHECK-NEXT:    fmla v4.2s, v0.2s, v2.2s169; CHECK-NEXT:    str d4, [x4]170; CHECK-NEXT:    ldr q5, [x2]171; CHECK-NEXT:    ext v7.16b, v5.16b, v5.16b, #8172; CHECK-NEXT:    zip1 v0.2s, v5.2s, v7.2s173; CHECK-NEXT:    zip2 v1.2s, v5.2s, v7.2s174; CHECK-NEXT:    fmul v3.2s, v0.2s, v6.2s175; CHECK-NEXT:    fmul v6.2s, v1.2s, v6.2s176; CHECK-NEXT:    fmla v3.2s, v4.2s, v1.2s177; CHECK-NEXT:    fneg v2.2s, v6.2s178; CHECK-NEXT:    fmla v2.2s, v4.2s, v0.2s179; CHECK-NEXT:    movi v0.2d, #0000000000000000180; CHECK-NEXT:    st2 { v2.2s, v3.2s }, [x5]181; CHECK-NEXT:    ldr q1, [x3]182; CHECK-NEXT:    fcmla v0.4s, v5.4s, v1.4s, #0183; CHECK-NEXT:    fcmla v0.4s, v5.4s, v1.4s, #90184; CHECK-NEXT:    ret185entry:186  %a = load <4 x float>, ptr %ptr_a187  %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>188  %strided.vec88 = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>189  %b = load <4 x float>, ptr %ptr_b190  %strided.vec90 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>191  %strided.vec91 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>192  %0 = fmul fast <2 x float> %strided.vec91, %strided.vec193  %1 = fmul fast <2 x float> %strided.vec90, %strided.vec88194  %2 = fadd fast <2 x float> %0, %1195  %3 = fmul fast <2 x float> %strided.vec90, %strided.vec196  %4 = fmul fast <2 x float> %strided.vec91, %strided.vec88197  %5 = fsub fast <2 x float> %3, %4198  store <2 x float> %5, ptr %p1199  %c = load <4 x float>, ptr %ptr_c200  %strided.vec93 = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>201  %strided.vec94 = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>202  %6 = fmul fast <2 x float> %strided.vec94, %5203  %7 = fmul fast <2 x float> %strided.vec93, %2204  %8 = fadd fast <2 x float> %6, %7205  %9 = fmul fast <2 x float> %strided.vec93, %5206  %10 = fmul fast <2 x float> %strided.vec94, %2207  %11 = fsub fast <2 x float> %9, %10208  %interleaved.vec = shufflevector <2 x float> %11, <2 x float> %8, <4 x i32> <i32 0, i32 2, i32 1, i32 3>209  store <4 x float> %interleaved.vec, ptr %p2210  %d = load <4 x float>, ptr %ptr_d211  %strided.vec96 = shufflevector <4 x float> %d, <4 x float> poison, <2 x i32> <i32 0, i32 2>212  %strided.vec97 = shufflevector <4 x float> %d, <4 x float> poison, <2 x i32> <i32 1, i32 3>213  %12 = fmul fast <2 x float> %strided.vec96, %strided.vec94214  %13 = fmul fast <2 x float> %strided.vec97, %strided.vec93215  %14 = fadd fast <2 x float> %13, %12216  %15 = fmul fast <2 x float> %strided.vec96, %strided.vec93217  %16 = fmul fast <2 x float> %strided.vec97, %strided.vec94218  %17 = fsub fast <2 x float> %15, %16219  %interleaved.vec98 = shufflevector <2 x float> %17, <2 x float> %14, <4 x i32> <i32 0, i32 2, i32 1, i32 3>220  ret <4 x float> %interleaved.vec98221}222 223; Expected to not transform. Shows that external use prevents deinterleaving whole chain.224;   *p1 = (a * b).real();225;   *p2 = (a * b) * (d * c);226;   return d * c;227define <4 x float> @multiple_muls_mul_external(<4 x float> %a, <4 x float> %b, <4 x float> %c, <4 x float> %d, ptr %p1, ptr %p2) {228; CHECK-LABEL: multiple_muls_mul_external:229; CHECK:       // %bb.0: // %entry230; CHECK-NEXT:    ext v4.16b, v0.16b, v0.16b, #8231; CHECK-NEXT:    ext v5.16b, v1.16b, v1.16b, #8232; CHECK-NEXT:    ext v16.16b, v2.16b, v2.16b, #8233; CHECK-NEXT:    ext v17.16b, v3.16b, v3.16b, #8234; CHECK-NEXT:    zip2 v6.2s, v0.2s, v4.2s235; CHECK-NEXT:    zip2 v7.2s, v1.2s, v5.2s236; CHECK-NEXT:    zip1 v19.2s, v2.2s, v16.2s237; CHECK-NEXT:    zip2 v2.2s, v2.2s, v16.2s238; CHECK-NEXT:    zip2 v16.2s, v3.2s, v17.2s239; CHECK-NEXT:    zip1 v0.2s, v0.2s, v4.2s240; CHECK-NEXT:    zip1 v1.2s, v1.2s, v5.2s241; CHECK-NEXT:    zip1 v3.2s, v3.2s, v17.2s242; CHECK-NEXT:    fmul v18.2s, v6.2s, v7.2s243; CHECK-NEXT:    fmul v5.2s, v19.2s, v16.2s244; CHECK-NEXT:    fmul v16.2s, v2.2s, v16.2s245; CHECK-NEXT:    fmul v7.2s, v0.2s, v7.2s246; CHECK-NEXT:    fneg v4.2s, v18.2s247; CHECK-NEXT:    fmla v5.2s, v3.2s, v2.2s248; CHECK-NEXT:    fneg v2.2s, v16.2s249; CHECK-NEXT:    fmla v7.2s, v1.2s, v6.2s250; CHECK-NEXT:    fmla v4.2s, v1.2s, v0.2s251; CHECK-NEXT:    fmla v2.2s, v3.2s, v19.2s252; CHECK-NEXT:    fmul v0.2s, v7.2s, v5.2s253; CHECK-NEXT:    fmul v17.2s, v4.2s, v5.2s254; CHECK-NEXT:    str d4, [x0]255; CHECK-NEXT:    fmla v17.2s, v2.2s, v7.2s256; CHECK-NEXT:    fneg v16.2s, v0.2s257; CHECK-NEXT:    zip1 v0.4s, v2.4s, v5.4s258; CHECK-NEXT:    fmla v16.2s, v2.2s, v4.2s259; CHECK-NEXT:    st2 { v16.2s, v17.2s }, [x1]260; CHECK-NEXT:    ret261entry:262  %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>263  %strided.vec126 = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>264  %strided.vec128 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>265  %strided.vec129 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>266  %0 = fmul nnan ninf contract <2 x float> %strided.vec, %strided.vec129267  %1 = fmul nnan ninf contract <2 x float> %strided.vec126, %strided.vec128268  %2 = fadd nnan ninf contract <2 x float> %1, %0269  %3 = fmul nnan ninf contract <2 x float> %strided.vec, %strided.vec128270  %4 = fmul nnan ninf contract <2 x float> %strided.vec126, %strided.vec129271  %5 = fsub nnan ninf contract <2 x float> %3, %4272  store <2 x float> %5, ptr %p1273  %strided.vec131 = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>274  %strided.vec132 = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>275  %strided.vec134 = shufflevector <4 x float> %d, <4 x float> poison, <2 x i32> <i32 0, i32 2>276  %strided.vec135 = shufflevector <4 x float> %d, <4 x float> poison, <2 x i32> <i32 1, i32 3>277  %6 = fmul nnan ninf contract <2 x float> %strided.vec131, %strided.vec135278  %7 = fmul nnan ninf contract <2 x float> %strided.vec132, %strided.vec134279  %8 = fadd nnan ninf contract <2 x float> %7, %6280  %9 = fmul nnan ninf contract <2 x float> %strided.vec131, %strided.vec134281  %10 = fmul nnan ninf contract <2 x float> %strided.vec132, %strided.vec135282  %11 = fsub nnan ninf contract <2 x float> %9, %10283  %12 = fmul nnan ninf contract <2 x float> %5, %8284  %13 = fmul nnan ninf contract <2 x float> %2, %11285  %14 = fadd nnan ninf contract <2 x float> %13, %12286  %15 = fmul nnan ninf contract <2 x float> %5, %11287  %16 = fmul nnan ninf contract <2 x float> %2, %8288  %17 = fsub nnan ninf contract <2 x float> %15, %16289  %interleaved.vec = shufflevector <2 x float> %17, <2 x float> %14, <4 x i32> <i32 0, i32 2, i32 1, i32 3>290  store <4 x float> %interleaved.vec, ptr %p2291  %interleaved.vec136 = shufflevector <2 x float> %11, <2 x float> %8, <4 x i32> <i32 0, i32 2, i32 1, i32 3>292  ret <4 x float> %interleaved.vec136293}294 295; Expected to transform. Shows that composite common subexpression is not generated twice.296;  u[i] = a[i] * b[i] - (c[i] * d[i] + g[i] * h[i]);297;  v[i] = e[i] * f[i] + (c[i] * d[i] + g[i] * h[i]);298define void @mul_add_common_mul_add_mul(<4 x double> %a, <4 x double> %b, <4 x double> %c, <4 x double> %d, <4 x double> %e, <4 x double> %f, <4 x double> %g, <4 x double> %h, ptr %p1, ptr %p2) {299; CHECK-LABEL: mul_add_common_mul_add_mul:300; CHECK:       // %bb.0: // %entry301; CHECK-NEXT:    movi v16.2d, #0000000000000000302; CHECK-NEXT:    movi v17.2d, #0000000000000000303; CHECK-NEXT:    ldr q19, [sp, #112]304; CHECK-NEXT:    ldp q18, q20, [sp, #80]305; CHECK-NEXT:    ldr q21, [sp, #64]306; CHECK-NEXT:    movi v22.2d, #0000000000000000307; CHECK-NEXT:    fcmla v16.2d, v18.2d, v19.2d, #0308; CHECK-NEXT:    fcmla v17.2d, v21.2d, v20.2d, #0309; CHECK-NEXT:    fcmla v22.2d, v1.2d, v3.2d, #0310; CHECK-NEXT:    fcmla v16.2d, v18.2d, v19.2d, #90311; CHECK-NEXT:    movi v18.2d, #0000000000000000312; CHECK-NEXT:    fcmla v17.2d, v21.2d, v20.2d, #90313; CHECK-NEXT:    fcmla v22.2d, v1.2d, v3.2d, #90314; CHECK-NEXT:    fcmla v16.2d, v5.2d, v7.2d, #0315; CHECK-NEXT:    fcmla v18.2d, v0.2d, v2.2d, #0316; CHECK-NEXT:    fcmla v17.2d, v4.2d, v6.2d, #0317; CHECK-NEXT:    fcmla v16.2d, v5.2d, v7.2d, #90318; CHECK-NEXT:    fcmla v18.2d, v0.2d, v2.2d, #90319; CHECK-NEXT:    fcmla v17.2d, v4.2d, v6.2d, #90320; CHECK-NEXT:    ldp q3, q0, [sp, #32]321; CHECK-NEXT:    ldp q2, q1, [sp]322; CHECK-NEXT:    fsub v4.2d, v22.2d, v16.2d323; CHECK-NEXT:    fsub v5.2d, v18.2d, v17.2d324; CHECK-NEXT:    fcmla v16.2d, v0.2d, v1.2d, #0325; CHECK-NEXT:    fcmla v17.2d, v3.2d, v2.2d, #0326; CHECK-NEXT:    stp q5, q4, [x0]327; CHECK-NEXT:    fcmla v16.2d, v0.2d, v1.2d, #90328; CHECK-NEXT:    fcmla v17.2d, v3.2d, v2.2d, #90329; CHECK-NEXT:    stp q17, q16, [x1]330; CHECK-NEXT:    ret331entry:332  %strided.vec = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 0, i32 2>333  %strided.vec123 = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 1, i32 3>334  %strided.vec125 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 0, i32 2>335  %strided.vec126 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 1, i32 3>336  %0 = fmul fast <2 x double> %strided.vec125, %strided.vec337  %1 = fmul fast <2 x double> %strided.vec126, %strided.vec338  %2 = fmul fast <2 x double> %strided.vec125, %strided.vec123339  %3 = fadd fast <2 x double> %1, %2340  %strided.vec128 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 0, i32 2>341  %strided.vec129 = shufflevector <4 x double> %c, <4 x double> poison, <2 x i32> <i32 1, i32 3>342  %strided.vec131 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 0, i32 2>343  %strided.vec132 = shufflevector <4 x double> %d, <4 x double> poison, <2 x i32> <i32 1, i32 3>344  %4 = fmul fast <2 x double> %strided.vec131, %strided.vec128345  %5 = fmul fast <2 x double> %strided.vec132, %strided.vec129346  %6 = fmul fast <2 x double> %strided.vec132, %strided.vec128347  %7 = fmul fast <2 x double> %strided.vec131, %strided.vec129348  %8 = fsub fast <2 x double> %4, %5349  %strided.vec134 = shufflevector <4 x double> %g, <4 x double> poison, <2 x i32> <i32 0, i32 2>350  %strided.vec135 = shufflevector <4 x double> %g, <4 x double> poison, <2 x i32> <i32 1, i32 3>351  %strided.vec137 = shufflevector <4 x double> %h, <4 x double> poison, <2 x i32> <i32 0, i32 2>352  %strided.vec138 = shufflevector <4 x double> %h, <4 x double> poison, <2 x i32> <i32 1, i32 3>353  %9 = fmul fast <2 x double> %strided.vec138, %strided.vec134354  %10 = fmul fast <2 x double> %strided.vec137, %strided.vec135355  %11 = fmul fast <2 x double> %strided.vec137, %strided.vec134356  %12 = fmul fast <2 x double> %strided.vec135, %strided.vec138357  %13 = fsub fast <2 x double> %11, %12358  %14 = fadd fast <2 x double> %13, %8359  %15 = fadd fast <2 x double> %6, %7360  %16 = fadd fast <2 x double> %15, %9361  %17 = fadd fast <2 x double> %16, %10362  %18 = fmul fast <2 x double> %strided.vec126, %strided.vec123363  %19 = fadd fast <2 x double> %18, %14364  %20 = fsub fast <2 x double> %0, %19365  %21 = fsub fast <2 x double> %3, %17366  %interleaved.vec = shufflevector <2 x double> %20, <2 x double> %21, <4 x i32> <i32 0, i32 2, i32 1, i32 3>367  store <4 x double> %interleaved.vec, ptr %p1, align 8368  %strided.vec140 = shufflevector <4 x double> %e, <4 x double> poison, <2 x i32> <i32 0, i32 2>369  %strided.vec141 = shufflevector <4 x double> %e, <4 x double> poison, <2 x i32> <i32 1, i32 3>370  %strided.vec143 = shufflevector <4 x double> %f, <4 x double> poison, <2 x i32> <i32 0, i32 2>371  %strided.vec144 = shufflevector <4 x double> %f, <4 x double> poison, <2 x i32> <i32 1, i32 3>372  %22 = fmul fast <2 x double> %strided.vec143, %strided.vec140373  %23 = fmul fast <2 x double> %strided.vec144, %strided.vec140374  %24 = fmul fast <2 x double> %strided.vec143, %strided.vec141375  %25 = fadd fast <2 x double> %22, %14376  %26 = fmul fast <2 x double> %strided.vec144, %strided.vec141377  %27 = fsub fast <2 x double> %25, %26378  %28 = fadd fast <2 x double> %24, %17379  %29 = fadd fast <2 x double> %28, %23380  %interleaved.vec145 = shufflevector <2 x double> %27, <2 x double> %29, <4 x i32> <i32 0, i32 2, i32 1, i32 3>381  store <4 x double> %interleaved.vec145, ptr %p2, align 8382  ret void383}384