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