brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.5 KiB · 16dc5a8 Raw
571 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s --mattr=+mve.fp,+fp64 -o - | FileCheck %s3 4target triple = "thumbv8.1m.main-none-none-eabi"5 6; Expected to transform7define arm_aapcs_vfpcc <4 x float> @mul_mul(<4 x float> %a, <4 x float> %b, <4 x float> %c) {8; CHECK-LABEL: mul_mul:9; CHECK:       @ %bb.0: @ %entry10; CHECK-NEXT:    vcmul.f32 q3, q0, q1, #011; CHECK-NEXT:    vcmla.f32 q3, q0, q1, #9012; CHECK-NEXT:    vcmul.f32 q0, q3, q2, #013; CHECK-NEXT:    vcmla.f32 q0, q3, q2, #9014; CHECK-NEXT:    bx lr15entry:16  %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>17  %strided.vec151 = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>18  %strided.vec153 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>19  %strided.vec154 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>20  %0 = fmul fast <2 x float> %strided.vec154, %strided.vec15121  %1 = fmul fast <2 x float> %strided.vec153, %strided.vec22  %2 = fmul fast <2 x float> %strided.vec154, %strided.vec23  %3 = fmul fast <2 x float> %strided.vec153, %strided.vec15124  %4 = fadd fast <2 x float> %3, %225  %5 = fsub fast <2 x float> %1, %026  %strided.vec156 = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>27  %strided.vec157 = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>28  %6 = fmul fast <2 x float> %4, %strided.vec15629  %7 = fmul fast <2 x float> %5, %strided.vec15730  %8 = fadd fast <2 x float> %6, %731  %9 = fmul fast <2 x float> %strided.vec156, %532  %10 = fmul fast <2 x float> %4, %strided.vec15733  %11 = fsub fast <2 x float> %9, %1034  %interleaved.vec = shufflevector <2 x float> %11, <2 x float> %8, <4 x i32> <i32 0, i32 2, i32 1, i32 3>35  ret <4 x float> %interleaved.vec36}37 38; Expected to not transform39define arm_aapcs_vfpcc <4 x float> @add_mul(<4 x float> %a, <4 x float> %b, <4 x float> %c) {40; CHECK-LABEL: add_mul:41; CHECK:       @ %bb.0: @ %entry42; CHECK-NEXT:    .vsave {d8, d9}43; CHECK-NEXT:    vpush {d8, d9}44; CHECK-NEXT:    vsub.f32 q3, q1, q245; CHECK-NEXT:    vsub.f32 q0, q1, q046; CHECK-NEXT:    vmov.f32 s4, s947; CHECK-NEXT:    vmov.f32 s13, s1448; CHECK-NEXT:    vmov.f32 s5, s1149; CHECK-NEXT:    vmov.f32 s0, s150; CHECK-NEXT:    vmul.f32 q4, q3, q151; CHECK-NEXT:    vmov.f32 s1, s352; CHECK-NEXT:    vmov.f32 s9, s1053; CHECK-NEXT:    vfma.f32 q4, q2, q054; CHECK-NEXT:    vmul.f32 q0, q1, q055; CHECK-NEXT:    vneg.f32 q1, q056; CHECK-NEXT:    vmov.f32 s1, s1657; CHECK-NEXT:    vfma.f32 q1, q2, q358; CHECK-NEXT:    vmov.f32 s3, s1759; CHECK-NEXT:    vmov.f32 s0, s460; CHECK-NEXT:    vmov.f32 s2, s561; CHECK-NEXT:    vpop {d8, d9}62; CHECK-NEXT:    bx lr63entry:64  %0 = fsub fast <4 x float> %b, %c65  %1 = shufflevector <4 x float> %0, <4 x float> poison, <2 x i32> <i32 0, i32 2>66  %strided.vec58 = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>67  %strided.vec59 = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>68  %2 = fmul fast <2 x float> %1, %strided.vec5969  %3 = fsub fast <4 x float> %b, %a70  %4 = shufflevector <4 x float> %3, <4 x float> poison, <2 x i32> <i32 1, i32 3>71  %5 = fmul fast <2 x float> %strided.vec58, %472  %6 = fadd fast <2 x float> %5, %273  %7 = fmul fast <2 x float> %strided.vec58, %174  %8 = fmul fast <2 x float> %strided.vec59, %475  %9 = fsub fast <2 x float> %7, %876  %interleaved.vec = shufflevector <2 x float> %9, <2 x float> %6, <4 x i32> <i32 0, i32 2, i32 1, i32 3>77  ret <4 x float> %interleaved.vec78}79 80; Expected to not transform81define arm_aapcs_vfpcc <4 x float> @mul_mul270_mul(<4 x float> %a, <4 x float> %b, <4 x float> %c) {82; CHECK-LABEL: mul_mul270_mul:83; CHECK:       @ %bb.0: @ %entry84; CHECK-NEXT:    .vsave {d8, d9, d10}85; CHECK-NEXT:    vpush {d8, d9, d10}86; CHECK-NEXT:    vmov.f32 s16, s887; CHECK-NEXT:    vmov.f32 s20, s488; CHECK-NEXT:    vmov.f32 s17, s1089; CHECK-NEXT:    vmov.f32 s21, s690; CHECK-NEXT:    vmul.f32 q3, q5, q491; CHECK-NEXT:    vmov.f32 s4, s592; CHECK-NEXT:    vmov.f32 s5, s793; CHECK-NEXT:    vneg.f32 q3, q394; CHECK-NEXT:    vmov.f32 s8, s995; CHECK-NEXT:    vmul.f32 q4, q1, q496; CHECK-NEXT:    vmov.f32 s9, s1197; CHECK-NEXT:    vfma.f32 q3, q1, q298; CHECK-NEXT:    vfma.f32 q4, q5, q299; CHECK-NEXT:    vmov.f32 s8, s0100; CHECK-NEXT:    vmov.f32 s9, s2101; CHECK-NEXT:    vmov.f32 s0, s1102; CHECK-NEXT:    vmul.f32 q1, q3, q2103; CHECK-NEXT:    vmov.f32 s1, s3104; CHECK-NEXT:    vfma.f32 q1, q4, q0105; CHECK-NEXT:    vmul.f32 q0, q3, q0106; CHECK-NEXT:    vneg.f32 q3, q0107; CHECK-NEXT:    vmov.f32 s1, s4108; CHECK-NEXT:    vfma.f32 q3, q4, q2109; CHECK-NEXT:    vmov.f32 s3, s5110; CHECK-NEXT:    vmov.f32 s0, s12111; CHECK-NEXT:    vmov.f32 s2, s13112; CHECK-NEXT:    vpop {d8, d9, d10}113; CHECK-NEXT:    bx lr114entry:115  %strided.vec = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>116  %strided.vec81 = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>117  %strided.vec83 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>118  %strided.vec84 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>119  %0 = fmul fast <2 x float> %strided.vec84, %strided.vec120  %1 = fmul fast <2 x float> %strided.vec83, %strided.vec81121  %2 = fadd fast <2 x float> %1, %0122  %strided.vec86 = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>123  %strided.vec87 = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>124  %3 = fmul fast <2 x float> %2, %strided.vec87125  %4 = fmul fast <2 x float> %strided.vec84, %strided.vec81126  %5 = fmul fast <2 x float> %strided.vec83, %strided.vec127  %6 = fsub fast <2 x float> %4, %5128  %7 = fmul fast <2 x float> %6, %strided.vec86129  %8 = fadd fast <2 x float> %3, %7130  %9 = fmul fast <2 x float> %2, %strided.vec86131  %10 = fmul fast <2 x float> %6, %strided.vec87132  %11 = fsub fast <2 x float> %9, %10133  %interleaved.vec = shufflevector <2 x float> %11, <2 x float> %8, <4 x i32> <i32 0, i32 2, i32 1, i32 3>134  ret <4 x float> %interleaved.vec135}136 137; (a * b) * a138; Expected to transform139define arm_aapcs_vfpcc <4 x float> @mul_triangle(<4 x float> %a, <4 x float> %b) {140; CHECK-LABEL: mul_triangle:141; CHECK:       @ %bb.0: @ %entry142; CHECK-NEXT:    vcmul.f32 q2, q1, q0, #0143; CHECK-NEXT:    vcmla.f32 q2, q1, q0, #90144; CHECK-NEXT:    vcmul.f32 q1, q0, q2, #0145; CHECK-NEXT:    vcmla.f32 q1, q0, q2, #90146; CHECK-NEXT:    vmov q0, q1147; CHECK-NEXT:    bx lr148entry:149  %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>150  %strided.vec35 = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>151  %strided.vec37 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>152  %strided.vec38 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>153  %0 = fmul fast <2 x float> %strided.vec37, %strided.vec154  %1 = fmul fast <2 x float> %strided.vec38, %strided.vec35155  %2 = fsub fast <2 x float> %0, %1156  %3 = fmul fast <2 x float> %2, %strided.vec35157  %4 = fmul fast <2 x float> %strided.vec38, %strided.vec158  %5 = fmul fast <2 x float> %strided.vec35, %strided.vec37159  %6 = fadd fast <2 x float> %4, %5160  %7 = fmul fast <2 x float> %6, %strided.vec161  %8 = fadd fast <2 x float> %3, %7162  %9 = fmul fast <2 x float> %2, %strided.vec163  %10 = fmul fast <2 x float> %6, %strided.vec35164  %11 = fsub fast <2 x float> %9, %10165  %interleaved.vec = shufflevector <2 x float> %11, <2 x float> %8, <4 x i32> <i32 0, i32 2, i32 1, i32 3>166  ret <4 x float> %interleaved.vec167}168 169 170; d * (b * a) * (c * a)171; Expected to transform172define arm_aapcs_vfpcc <4 x float> @mul_diamond(<4 x float> %a, <4 x float> %b, <4 x float> %c, <4 x float> %d) {173; CHECK-LABEL: mul_diamond:174; CHECK:       @ %bb.0: @ %entry175; CHECK-NEXT:    .vsave {d8, d9}176; CHECK-NEXT:    vpush {d8, d9}177; CHECK-NEXT:    vcmul.f32 q4, q1, q0, #0178; CHECK-NEXT:    vcmla.f32 q4, q1, q0, #90179; CHECK-NEXT:    vcmul.f32 q1, q4, q3, #0180; CHECK-NEXT:    vcmla.f32 q1, q4, q3, #90181; CHECK-NEXT:    vcmul.f32 q3, q2, q0, #0182; CHECK-NEXT:    vcmla.f32 q3, q2, q0, #90183; CHECK-NEXT:    vcmul.f32 q0, q3, q1, #0184; CHECK-NEXT:    vcmla.f32 q0, q3, q1, #90185; CHECK-NEXT:    vpop {d8, d9}186; CHECK-NEXT:    bx lr187entry:188  %a.real = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>189  %a.imag = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>190  %b.real = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>191  %b.imag = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>192  %c.real = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>193  %c.imag = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>194  %d.real = shufflevector <4 x float> %d, <4 x float> poison, <2 x i32> <i32 0, i32 2>195  %d.imag = shufflevector <4 x float> %d, <4 x float> poison, <2 x i32> <i32 1, i32 3>196  %0 = fmul fast <2 x float> %a.imag, %b.real197  %1 = fmul fast <2 x float> %a.real, %b.imag198  %2 = fadd fast <2 x float> %1, %0199  %3 = fmul fast <2 x float> %a.real, %b.real200  %4 = fmul fast <2 x float> %b.imag, %a.imag201  %5 = fsub fast <2 x float> %3, %4202  %6 = fmul fast <2 x float> %d.real, %5203  %7 = fmul fast <2 x float> %2, %d.imag204  %8 = fmul fast <2 x float> %d.real, %2205  %9 = fmul fast <2 x float> %5, %d.imag206  %10 = fsub fast <2 x float> %6, %7207  %11 = fadd fast <2 x float> %8, %9208  %12 = fmul fast <2 x float> %c.real, %a.imag209  %13 = fmul fast <2 x float> %c.imag, %a.real210  %14 = fadd fast <2 x float> %13, %12211  %15 = fmul fast <2 x float> %14, %10212  %16 = fmul fast <2 x float> %c.real, %a.real213  %17 = fmul fast <2 x float> %c.imag, %a.imag214  %18 = fsub fast <2 x float> %16, %17215  %19 = fmul fast <2 x float> %18, %11216  %20 = fadd fast <2 x float> %15, %19217  %21 = fmul fast <2 x float> %18, %10218  %22 = fmul fast <2 x float> %14, %11219  %23 = fsub fast <2 x float> %21, %22220  %interleaved.vec = shufflevector <2 x float> %23, <2 x float> %20, <4 x i32> <i32 0, i32 2, i32 1, i32 3>221  ret <4 x float> %interleaved.vec222}223 224; Expected to transform225define arm_aapcs_vfpcc <4 x float> @mul_add90_mul(<4 x float> %a, <4 x float> %b, <4 x float> %c) {226; CHECK-LABEL: mul_add90_mul:227; CHECK:       @ %bb.0: @ %entry228; CHECK-NEXT:    .vsave {d8, d9}229; CHECK-NEXT:    vpush {d8, d9}230; CHECK-NEXT:    vcmul.f32 q3, q2, q0, #0231; CHECK-NEXT:    vcmul.f32 q4, q1, q0, #0232; CHECK-NEXT:    vcmla.f32 q4, q1, q0, #90233; CHECK-NEXT:    vcmla.f32 q3, q2, q0, #90234; CHECK-NEXT:    vcadd.f32 q0, q3, q4, #90235; CHECK-NEXT:    vpop {d8, d9}236; CHECK-NEXT:    bx lr237entry:238  %ar = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>239  %ai = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>240  %br = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>241  %bi = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>242  %cr = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>243  %ci = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>244 245  %i6 = fmul fast <2 x float> %br, %ar246  %i7 = fmul fast <2 x float> %bi, %ai247  %xr = fsub fast <2 x float> %i6, %i7248  %i9 = fmul fast <2 x float> %bi, %ar249  %i10 = fmul fast <2 x float> %br, %ai250  %xi = fadd fast <2 x float> %i9, %i10251 252  %j6 = fmul fast <2 x float> %cr, %ar253  %j7 = fmul fast <2 x float> %ci, %ai254  %yr = fsub fast <2 x float> %j6, %j7255  %j9 = fmul fast <2 x float> %ci, %ar256  %j10 = fmul fast <2 x float> %cr, %ai257  %yi = fadd fast <2 x float> %j9, %j10258 259  %zr = fsub fast <2 x float> %yr, %xi260  %zi = fadd fast <2 x float> %yi, %xr261  %interleaved.vec = shufflevector <2 x float> %zr, <2 x float> %zi, <4 x i32> <i32 0, i32 2, i32 1, i32 3>262  ret <4 x float> %interleaved.vec263}264 265; Expected to not transform266define arm_aapcs_vfpcc <4 x float> @mul_triangle_addmul(<4 x float> %a, <4 x float> %b, <4 x float> %c) {267; CHECK-LABEL: mul_triangle_addmul:268; CHECK:       @ %bb.0: @ %entry269; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13, d14, d15}270; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13, d14, d15}271; CHECK-NEXT:    vmov.f32 s16, s0272; CHECK-NEXT:    vmov.f32 s20, s5273; CHECK-NEXT:    vmov.f32 s17, s2274; CHECK-NEXT:    vmov.f32 s21, s7275; CHECK-NEXT:    vmov.f32 s5, s6276; CHECK-NEXT:    vmul.f32 q3, q5, q4277; CHECK-NEXT:    vmul.f32 q4, q1, q4278; CHECK-NEXT:    vmov.f32 s0, s1279; CHECK-NEXT:    vmov.f32 s1, s3280; CHECK-NEXT:    vmov q6, q4281; CHECK-NEXT:    vfms.f32 q6, q5, q0282; CHECK-NEXT:    vmov q7, q3283; CHECK-NEXT:    vfma.f32 q3, q1, q0284; CHECK-NEXT:    vmov.f32 s20, s8285; CHECK-NEXT:    vmov.f32 s21, s10286; CHECK-NEXT:    vmov.f32 s4, s9287; CHECK-NEXT:    vfma.f32 q7, q5, q0288; CHECK-NEXT:    vmov.f32 s5, s11289; CHECK-NEXT:    vadd.f32 q5, q7, q6290; CHECK-NEXT:    vfms.f32 q4, q1, q0291; CHECK-NEXT:    vmov.f32 s1, s20292; CHECK-NEXT:    vsub.f32 q1, q4, q3293; CHECK-NEXT:    vmov.f32 s3, s21294; CHECK-NEXT:    vmov.f32 s0, s4295; CHECK-NEXT:    vmov.f32 s2, s5296; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13, d14, d15}297; CHECK-NEXT:    bx lr298entry:299  %ar = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>300  %ai = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>301  %br = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>302  %bi = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>303  %cr = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>304  %ci = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>305 306  %i6 = fmul fast <2 x float> %br, %ar307  %i7 = fmul fast <2 x float> %bi, %ai308  %xr = fsub fast <2 x float> %i6, %i7309  %i9 = fmul fast <2 x float> %bi, %ar310  %i10 = fmul fast <2 x float> %br, %ai311  %xi = fadd fast <2 x float> %i9, %i10312 313  ;%j6 = fmul fast <2 x float> %cr, %ar314  %j7 = fmul fast <2 x float> %ci, %ai315  %yr = fsub fast <2 x float> %i6, %j7316  ;%j9 = fmul fast <2 x float> %ci, %ar317  %j10 = fmul fast <2 x float> %cr, %ai318  %yi = fadd fast <2 x float> %i9, %j10319 320  %zr = fsub fast <2 x float> %yr, %xi321  %zi = fadd fast <2 x float> %yi, %xr322  %interleaved.vec = shufflevector <2 x float> %zr, <2 x float> %zi, <4 x i32> <i32 0, i32 2, i32 1, i32 3>323  ret <4 x float> %interleaved.vec324}325 326; Expected to not transform327define arm_aapcs_vfpcc <4 x float> @mul_triangle_multiuses(<4 x float> %a, <4 x float> %b, ptr %p) {328; CHECK-LABEL: mul_triangle_multiuses:329; CHECK:       @ %bb.0: @ %entry330; CHECK-NEXT:    .vsave {d8, d9}331; CHECK-NEXT:    vpush {d8, d9}332; CHECK-NEXT:    vmov.f32 s16, s4333; CHECK-NEXT:    vmov.f32 s8, s1334; CHECK-NEXT:    vmov.f32 s17, s6335; CHECK-NEXT:    vmov.f32 s9, s3336; CHECK-NEXT:    vmov.f32 s4, s5337; CHECK-NEXT:    vmul.f32 q3, q2, q4338; CHECK-NEXT:    vmov.f32 s1, s2339; CHECK-NEXT:    vmov.f32 s5, s7340; CHECK-NEXT:    vfma.f32 q3, q1, q0341; CHECK-NEXT:    vmul.f32 q1, q1, q2342; CHECK-NEXT:    vneg.f32 q1, q1343; CHECK-NEXT:    vfma.f32 q1, q4, q0344; CHECK-NEXT:    vmov.f32 s18, s12345; CHECK-NEXT:    vmov.f32 s16, s4346; CHECK-NEXT:    vmov.f32 s17, s5347; CHECK-NEXT:    vmov.f32 s19, s13348; CHECK-NEXT:    vstrw.32 q4, [r0]349; CHECK-NEXT:    vmul.f32 q4, q3, q0350; CHECK-NEXT:    vfma.f32 q4, q1, q2351; CHECK-NEXT:    vmul.f32 q2, q3, q2352; CHECK-NEXT:    vneg.f32 q2, q2353; CHECK-NEXT:    vfma.f32 q2, q1, q0354; CHECK-NEXT:    vmov.f32 s1, s16355; CHECK-NEXT:    vmov.f32 s0, s8356; CHECK-NEXT:    vmov.f32 s2, s9357; CHECK-NEXT:    vmov.f32 s3, s17358; CHECK-NEXT:    vpop {d8, d9}359; CHECK-NEXT:    bx lr360entry:361  %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>362  %strided.vec35 = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>363  %strided.vec37 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>364  %strided.vec38 = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>365  %0 = fmul fast <2 x float> %strided.vec37, %strided.vec366  %1 = fmul fast <2 x float> %strided.vec38, %strided.vec35367  %2 = fsub fast <2 x float> %0, %1368  %3 = fmul fast <2 x float> %2, %strided.vec35369  %4 = fmul fast <2 x float> %strided.vec38, %strided.vec370  %5 = fmul fast <2 x float> %strided.vec35, %strided.vec37371  %6 = fadd fast <2 x float> %4, %5372  %otheruse = shufflevector <2 x float> %2, <2 x float> %6, <4 x i32> <i32 0, i32 1, i32 2, i32 3>373  store <4 x float> %otheruse, ptr %p374  %7 = fmul fast <2 x float> %6, %strided.vec375  %8 = fadd fast <2 x float> %3, %7376  %9 = fmul fast <2 x float> %2, %strided.vec377  %10 = fmul fast <2 x float> %6, %strided.vec35378  %11 = fsub fast <2 x float> %9, %10379  %interleaved.vec = shufflevector <2 x float> %11, <2 x float> %8, <4 x i32> <i32 0, i32 2, i32 1, i32 3>380  ret <4 x float> %interleaved.vec381}382 383; Expected to transform384define <4 x float> @mul_addequal(<4 x float> %a, <4 x float> %b, <4 x float> %c) {385; CHECK-LABEL: mul_addequal:386; CHECK:       @ %bb.0: @ %entry387; CHECK-NEXT:    add.w r12, sp, #16388; CHECK-NEXT:    vmov d0, r0, r1389; CHECK-NEXT:    mov r0, sp390; CHECK-NEXT:    vldrw.u32 q2, [r12]391; CHECK-NEXT:    vldrw.u32 q1, [r0]392; CHECK-NEXT:    vmov d1, r2, r3393; CHECK-NEXT:    vcmla.f32 q2, q0, q1, #0394; CHECK-NEXT:    vcmla.f32 q2, q0, q1, #90395; CHECK-NEXT:    vmov r0, r1, d4396; CHECK-NEXT:    vmov r2, r3, d5397; CHECK-NEXT:    bx lr398entry:399  %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>400  %a.imag = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>401  %b.real = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>402  %b.imag = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>403  %0 = fmul fast <2 x float> %b.imag, %strided.vec404  %1 = fmul fast <2 x float> %b.real, %a.imag405  %2 = fadd fast <2 x float> %1, %0406  %3 = fmul fast <2 x float> %b.real, %strided.vec407  %4 = fmul fast <2 x float> %a.imag, %b.imag408  %5 = fsub fast <2 x float> %3, %4409  %c.real = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>410  %c.imag = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>411  %6 = fadd fast <2 x float> %5, %c.real412  %7 = fadd fast <2 x float> %2, %c.imag413  %interleaved.vec = shufflevector <2 x float> %6, <2 x float> %7, <4 x i32> <i32 0, i32 2, i32 1, i32 3>414  ret <4 x float> %interleaved.vec415}416 417; Expected to transform418define <4 x float> @mul_subequal(<4 x float> %a, <4 x float> %b, <4 x float> %c) {419; CHECK-LABEL: mul_subequal:420; CHECK:       @ %bb.0: @ %entry421; CHECK-NEXT:    vmov d0, r0, r1422; CHECK-NEXT:    mov r1, sp423; CHECK-NEXT:    vldrw.u32 q2, [r1]424; CHECK-NEXT:    vmov d1, r2, r3425; CHECK-NEXT:    add r0, sp, #16426; CHECK-NEXT:    vcmul.f32 q3, q0, q2, #0427; CHECK-NEXT:    vldrw.u32 q1, [r0]428; CHECK-NEXT:    vcmla.f32 q3, q0, q2, #90429; CHECK-NEXT:    vsub.f32 q0, q3, q1430; CHECK-NEXT:    vmov r0, r1, d0431; CHECK-NEXT:    vmov r2, r3, d1432; CHECK-NEXT:    bx lr433entry:434  %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>435  %a.imag = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>436  %b.real = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>437  %b.imag = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>438  %0 = fmul fast <2 x float> %b.imag, %strided.vec439  %1 = fmul fast <2 x float> %b.real, %a.imag440  %2 = fadd fast <2 x float> %1, %0441  %3 = fmul fast <2 x float> %b.real, %strided.vec442  %4 = fmul fast <2 x float> %a.imag, %b.imag443  %5 = fsub fast <2 x float> %3, %4444  %c.real = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>445  %c.imag = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>446  %6 = fsub fast <2 x float> %5, %c.real447  %7 = fsub fast <2 x float> %2, %c.imag448  %interleaved.vec = shufflevector <2 x float> %6, <2 x float> %7, <4 x i32> <i32 0, i32 2, i32 1, i32 3>449  ret <4 x float> %interleaved.vec450}451 452 453; Expected to transform454define <4 x float> @mul_mulequal(<4 x float> %a, <4 x float> %b, <4 x float> %c) {455; CHECK-LABEL: mul_mulequal:456; CHECK:       @ %bb.0: @ %entry457; CHECK-NEXT:    vmov d0, r0, r1458; CHECK-NEXT:    mov r1, sp459; CHECK-NEXT:    vldrw.u32 q2, [r1]460; CHECK-NEXT:    vmov d1, r2, r3461; CHECK-NEXT:    add r0, sp, #16462; CHECK-NEXT:    vcmul.f32 q3, q0, q2, #0463; CHECK-NEXT:    vldrw.u32 q1, [r0]464; CHECK-NEXT:    vcmla.f32 q3, q0, q2, #90465; CHECK-NEXT:    vmul.f32 q0, q3, q1466; CHECK-NEXT:    vmov r0, r1, d0467; CHECK-NEXT:    vmov r2, r3, d1468; CHECK-NEXT:    bx lr469entry:470  %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>471  %a.imag = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>472  %b.real = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>473  %b.imag = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>474  %0 = fmul fast <2 x float> %b.imag, %strided.vec475  %1 = fmul fast <2 x float> %b.real, %a.imag476  %2 = fadd fast <2 x float> %1, %0477  %3 = fmul fast <2 x float> %b.real, %strided.vec478  %4 = fmul fast <2 x float> %a.imag, %b.imag479  %5 = fsub fast <2 x float> %3, %4480  %c.real = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>481  %c.imag = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>482  %6 = fmul fast <2 x float> %5, %c.real483  %7 = fmul fast <2 x float> %2, %c.imag484  %interleaved.vec = shufflevector <2 x float> %6, <2 x float> %7, <4 x i32> <i32 0, i32 2, i32 1, i32 3>485  ret <4 x float> %interleaved.vec486}487 488; Expected to not transform489define <4 x float> @mul_divequal(<4 x float> %a, <4 x float> %b, <4 x float> %c) {490; CHECK-LABEL: mul_divequal:491; CHECK:       @ %bb.0: @ %entry492; CHECK-NEXT:    .vsave {d10, d11}493; CHECK-NEXT:    vpush {d10, d11}494; CHECK-NEXT:    .vsave {d8}495; CHECK-NEXT:    vpush {d8}496; CHECK-NEXT:    vmov d0, r0, r1497; CHECK-NEXT:    add r0, sp, #24498; CHECK-NEXT:    vldrw.u32 q1, [r0]499; CHECK-NEXT:    vmov d1, r2, r3500; CHECK-NEXT:    vmov.f32 s16, s1501; CHECK-NEXT:    add.w r12, sp, #40502; CHECK-NEXT:    vmov.f32 s12, s5503; CHECK-NEXT:    vmov.f32 s13, s7504; CHECK-NEXT:    vmov.f32 s1, s2505; CHECK-NEXT:    vmov.f32 s8, s4506; CHECK-NEXT:    vmul.f32 q5, q3, q0507; CHECK-NEXT:    vmov.f32 s9, s6508; CHECK-NEXT:    vldrw.u32 q1, [r12]509; CHECK-NEXT:    vmov.f32 s17, s3510; CHECK-NEXT:    vfma.f32 q5, q2, q4511; CHECK-NEXT:    vmul.f32 q3, q4, q3512; CHECK-NEXT:    vdiv.f32 s3, s21, s7513; CHECK-NEXT:    vneg.f32 q3, q3514; CHECK-NEXT:    vfma.f32 q3, q2, q0515; CHECK-NEXT:    vdiv.f32 s1, s20, s5516; CHECK-NEXT:    vdiv.f32 s2, s13, s6517; CHECK-NEXT:    vdiv.f32 s0, s12, s4518; CHECK-NEXT:    vmov r0, r1, d0519; CHECK-NEXT:    vmov r2, r3, d1520; CHECK-NEXT:    vpop {d8}521; CHECK-NEXT:    vpop {d10, d11}522; CHECK-NEXT:    bx lr523entry:524  %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>525  %a.imag = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>526  %b.real = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>527  %b.imag = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>528  %0 = fmul fast <2 x float> %b.imag, %strided.vec529  %1 = fmul fast <2 x float> %b.real, %a.imag530  %2 = fadd fast <2 x float> %1, %0531  %3 = fmul fast <2 x float> %b.real, %strided.vec532  %4 = fmul fast <2 x float> %a.imag, %b.imag533  %5 = fsub fast <2 x float> %3, %4534  %c.real = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 0, i32 2>535  %c.imag = shufflevector <4 x float> %c, <4 x float> poison, <2 x i32> <i32 1, i32 3>536  %6 = fdiv fast <2 x float> %5, %c.real537  %7 = fdiv fast <2 x float> %2, %c.imag538  %interleaved.vec = shufflevector <2 x float> %6, <2 x float> %7, <4 x i32> <i32 0, i32 2, i32 1, i32 3>539  ret <4 x float> %interleaved.vec540}541 542; Expected to transform543define <4 x float> @mul_negequal(<4 x float> %a, <4 x float> %b) {544; CHECK-LABEL: mul_negequal:545; CHECK:       @ %bb.0: @ %entry546; CHECK-NEXT:    vmov d0, r0, r1547; CHECK-NEXT:    mov r0, sp548; CHECK-NEXT:    vldrw.u32 q1, [r0]549; CHECK-NEXT:    vmov d1, r2, r3550; CHECK-NEXT:    vcmul.f32 q2, q0, q1, #180551; CHECK-NEXT:    vcmla.f32 q2, q0, q1, #270552; CHECK-NEXT:    vmov r0, r1, d4553; CHECK-NEXT:    vmov r2, r3, d5554; CHECK-NEXT:    bx lr555entry:556  %strided.vec = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 0, i32 2>557  %a.imag = shufflevector <4 x float> %a, <4 x float> poison, <2 x i32> <i32 1, i32 3>558  %b.real = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 0, i32 2>559  %b.imag = shufflevector <4 x float> %b, <4 x float> poison, <2 x i32> <i32 1, i32 3>560  %0 = fmul fast <2 x float> %b.imag, %strided.vec561  %1 = fmul fast <2 x float> %b.real, %a.imag562  %2 = fadd fast <2 x float> %1, %0563  %3 = fmul fast <2 x float> %b.real, %strided.vec564  %4 = fmul fast <2 x float> %a.imag, %b.imag565  %5 = fsub fast <2 x float> %3, %4566  %6 = fneg fast <2 x float> %5567  %7 = fneg fast <2 x float> %2568  %interleaved.vec = shufflevector <2 x float> %6, <2 x float> %7, <4 x i32> <i32 0, i32 2, i32 1, i32 3>569  ret <4 x float> %interleaved.vec570}571