654 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z15 -verify-machineinstrs -O3 \3; RUN: | FileCheck %s4 5; Test reassociation of fp add, subtract and multiply.6 7define double @fun0_fadd(ptr %x) {8; CHECK-LABEL: fun0_fadd:9; CHECK: # %bb.0: # %entry10; CHECK-NEXT: ld %f0, 0(%r2)11; CHECK-NEXT: adb %f0, 8(%r2)12; CHECK-NEXT: ld %f1, 24(%r2)13; CHECK-NEXT: adb %f1, 16(%r2)14; CHECK-NEXT: adbr %f0, %f115; CHECK-NEXT: ld %f1, 40(%r2)16; CHECK-NEXT: adb %f1, 32(%r2)17; CHECK-NEXT: adb %f1, 48(%r2)18; CHECK-NEXT: adbr %f0, %f119; CHECK-NEXT: adb %f0, 56(%r2)20; CHECK-NEXT: br %r1421entry:22 %0 = load double, ptr %x, align 823 %arrayidx1 = getelementptr inbounds double, ptr %x, i64 124 %1 = load double, ptr %arrayidx1, align 825 %add = fadd reassoc nsz arcp contract afn double %1, %026 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 227 %2 = load double, ptr %arrayidx2, align 828 %add3 = fadd reassoc nsz arcp contract afn double %add, %229 %arrayidx4 = getelementptr inbounds double, ptr %x, i64 330 %3 = load double, ptr %arrayidx4, align 831 %add5 = fadd reassoc nsz arcp contract afn double %add3, %332 %arrayidx6 = getelementptr inbounds double, ptr %x, i64 433 %4 = load double, ptr %arrayidx6, align 834 %add7 = fadd reassoc nsz arcp contract afn double %add5, %435 %arrayidx8 = getelementptr inbounds double, ptr %x, i64 536 %5 = load double, ptr %arrayidx8, align 837 %add9 = fadd reassoc nsz arcp contract afn double %add7, %538 %arrayidx10 = getelementptr inbounds double, ptr %x, i64 639 %6 = load double, ptr %arrayidx10, align 840 %add11 = fadd reassoc nsz arcp contract afn double %add9, %641 %arrayidx12 = getelementptr inbounds double, ptr %x, i64 742 %7 = load double, ptr %arrayidx12, align 843 %add13 = fadd reassoc nsz arcp contract afn double %add11, %744 ret double %add1345}46 47define float @fun1_fadd(ptr %x) {48; CHECK-LABEL: fun1_fadd:49; CHECK: # %bb.0: # %entry50; CHECK-NEXT: lde %f0, 0(%r2)51; CHECK-NEXT: aeb %f0, 4(%r2)52; CHECK-NEXT: lde %f1, 12(%r2)53; CHECK-NEXT: aeb %f1, 8(%r2)54; CHECK-NEXT: aebr %f0, %f155; CHECK-NEXT: lde %f1, 20(%r2)56; CHECK-NEXT: aeb %f1, 16(%r2)57; CHECK-NEXT: aeb %f1, 24(%r2)58; CHECK-NEXT: aebr %f0, %f159; CHECK-NEXT: aeb %f0, 28(%r2)60; CHECK-NEXT: br %r1461entry:62 %0 = load float, ptr %x, align 863 %arrayidx1 = getelementptr inbounds float, ptr %x, i64 164 %1 = load float, ptr %arrayidx1, align 865 %add = fadd reassoc nsz arcp contract afn float %1, %066 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 267 %2 = load float, ptr %arrayidx2, align 868 %add3 = fadd reassoc nsz arcp contract afn float %add, %269 %arrayidx4 = getelementptr inbounds float, ptr %x, i64 370 %3 = load float, ptr %arrayidx4, align 871 %add5 = fadd reassoc nsz arcp contract afn float %add3, %372 %arrayidx6 = getelementptr inbounds float, ptr %x, i64 473 %4 = load float, ptr %arrayidx6, align 874 %add7 = fadd reassoc nsz arcp contract afn float %add5, %475 %arrayidx8 = getelementptr inbounds float, ptr %x, i64 576 %5 = load float, ptr %arrayidx8, align 877 %add9 = fadd reassoc nsz arcp contract afn float %add7, %578 %arrayidx10 = getelementptr inbounds float, ptr %x, i64 679 %6 = load float, ptr %arrayidx10, align 880 %add11 = fadd reassoc nsz arcp contract afn float %add9, %681 %arrayidx12 = getelementptr inbounds float, ptr %x, i64 782 %7 = load float, ptr %arrayidx12, align 883 %add13 = fadd reassoc nsz arcp contract afn float %add11, %784 ret float %add1385}86 87define fp128 @fun2_fadd(ptr %x) {88; CHECK-LABEL: fun2_fadd:89; CHECK: # %bb.0: # %entry90; CHECK-NEXT: vl %v0, 0(%r3), 391; CHECK-NEXT: vl %v1, 16(%r3), 392; CHECK-NEXT: wfaxb %v0, %v1, %v093; CHECK-NEXT: vl %v1, 32(%r3), 394; CHECK-NEXT: vl %v2, 48(%r3), 395; CHECK-NEXT: wfaxb %v1, %v1, %v296; CHECK-NEXT: wfaxb %v0, %v0, %v197; CHECK-NEXT: vl %v1, 64(%r3), 398; CHECK-NEXT: vl %v2, 80(%r3), 399; CHECK-NEXT: wfaxb %v1, %v1, %v2100; CHECK-NEXT: vl %v2, 96(%r3), 3101; CHECK-NEXT: wfaxb %v1, %v1, %v2102; CHECK-NEXT: wfaxb %v0, %v0, %v1103; CHECK-NEXT: vl %v1, 112(%r3), 3104; CHECK-NEXT: wfaxb %v0, %v0, %v1105; CHECK-NEXT: vst %v0, 0(%r2), 3106; CHECK-NEXT: br %r14107entry:108 %0 = load fp128, ptr %x, align 8109 %arrayidx1 = getelementptr inbounds fp128, ptr %x, i64 1110 %1 = load fp128, ptr %arrayidx1, align 8111 %add = fadd reassoc nsz arcp contract afn fp128 %1, %0112 %arrayidx2 = getelementptr inbounds fp128, ptr %x, i64 2113 %2 = load fp128, ptr %arrayidx2, align 8114 %add3 = fadd reassoc nsz arcp contract afn fp128 %add, %2115 %arrayidx4 = getelementptr inbounds fp128, ptr %x, i64 3116 %3 = load fp128, ptr %arrayidx4, align 8117 %add5 = fadd reassoc nsz arcp contract afn fp128 %add3, %3118 %arrayidx6 = getelementptr inbounds fp128, ptr %x, i64 4119 %4 = load fp128, ptr %arrayidx6, align 8120 %add7 = fadd reassoc nsz arcp contract afn fp128 %add5, %4121 %arrayidx8 = getelementptr inbounds fp128, ptr %x, i64 5122 %5 = load fp128, ptr %arrayidx8, align 8123 %add9 = fadd reassoc nsz arcp contract afn fp128 %add7, %5124 %arrayidx10 = getelementptr inbounds fp128, ptr %x, i64 6125 %6 = load fp128, ptr %arrayidx10, align 8126 %add11 = fadd reassoc nsz arcp contract afn fp128 %add9, %6127 %arrayidx12 = getelementptr inbounds fp128, ptr %x, i64 7128 %7 = load fp128, ptr %arrayidx12, align 8129 %add13 = fadd reassoc nsz arcp contract afn fp128 %add11, %7130 ret fp128 %add13131}132 133define <2 x double> @fun3_fadd(ptr %x) {134; CHECK-LABEL: fun3_fadd:135; CHECK: # %bb.0: # %entry136; CHECK-NEXT: vl %v0, 0(%r2), 3137; CHECK-NEXT: vl %v1, 16(%r2), 3138; CHECK-NEXT: vfadb %v0, %v1, %v0139; CHECK-NEXT: vl %v1, 32(%r2), 3140; CHECK-NEXT: vl %v2, 48(%r2), 3141; CHECK-NEXT: vfadb %v1, %v1, %v2142; CHECK-NEXT: vfadb %v0, %v0, %v1143; CHECK-NEXT: vl %v1, 64(%r2), 3144; CHECK-NEXT: vl %v2, 80(%r2), 3145; CHECK-NEXT: vfadb %v1, %v1, %v2146; CHECK-NEXT: vl %v2, 96(%r2), 3147; CHECK-NEXT: vfadb %v1, %v1, %v2148; CHECK-NEXT: vfadb %v0, %v0, %v1149; CHECK-NEXT: vl %v1, 112(%r2), 3150; CHECK-NEXT: vfadb %v24, %v0, %v1151; CHECK-NEXT: br %r14152entry:153 %0 = load <2 x double>, ptr %x, align 8154 %arrayidx1 = getelementptr inbounds <2 x double>, ptr %x, i64 1155 %1 = load <2 x double>, ptr %arrayidx1, align 8156 %add = fadd reassoc nsz arcp contract afn <2 x double> %1, %0157 %arrayidx2 = getelementptr inbounds <2 x double>, ptr %x, i64 2158 %2 = load <2 x double>, ptr %arrayidx2, align 8159 %add3 = fadd reassoc nsz arcp contract afn <2 x double> %add, %2160 %arrayidx4 = getelementptr inbounds <2 x double>, ptr %x, i64 3161 %3 = load <2 x double>, ptr %arrayidx4, align 8162 %add5 = fadd reassoc nsz arcp contract afn <2 x double> %add3, %3163 %arrayidx6 = getelementptr inbounds <2 x double>, ptr %x, i64 4164 %4 = load <2 x double>, ptr %arrayidx6, align 8165 %add7 = fadd reassoc nsz arcp contract afn <2 x double> %add5, %4166 %arrayidx8 = getelementptr inbounds <2 x double>, ptr %x, i64 5167 %5 = load <2 x double>, ptr %arrayidx8, align 8168 %add9 = fadd reassoc nsz arcp contract afn <2 x double> %add7, %5169 %arrayidx10 = getelementptr inbounds <2 x double>, ptr %x, i64 6170 %6 = load <2 x double>, ptr %arrayidx10, align 8171 %add11 = fadd reassoc nsz arcp contract afn <2 x double> %add9, %6172 %arrayidx12 = getelementptr inbounds <2 x double>, ptr %x, i64 7173 %7 = load <2 x double>, ptr %arrayidx12, align 8174 %add13 = fadd reassoc nsz arcp contract afn <2 x double> %add11, %7175 ret <2 x double> %add13176}177 178define <4 x float> @fun4_fadd(ptr %x) {179; CHECK-LABEL: fun4_fadd:180; CHECK: # %bb.0: # %entry181; CHECK-NEXT: vl %v0, 0(%r2), 3182; CHECK-NEXT: vl %v1, 16(%r2), 3183; CHECK-NEXT: vfasb %v0, %v1, %v0184; CHECK-NEXT: vl %v1, 32(%r2), 3185; CHECK-NEXT: vl %v2, 48(%r2), 3186; CHECK-NEXT: vfasb %v1, %v1, %v2187; CHECK-NEXT: vfasb %v0, %v0, %v1188; CHECK-NEXT: vl %v1, 64(%r2), 3189; CHECK-NEXT: vl %v2, 80(%r2), 3190; CHECK-NEXT: vfasb %v1, %v1, %v2191; CHECK-NEXT: vl %v2, 96(%r2), 3192; CHECK-NEXT: vfasb %v1, %v1, %v2193; CHECK-NEXT: vfasb %v0, %v0, %v1194; CHECK-NEXT: vl %v1, 112(%r2), 3195; CHECK-NEXT: vfasb %v24, %v0, %v1196; CHECK-NEXT: br %r14197entry:198 %0 = load <4 x float>, ptr %x, align 8199 %arrayidx1 = getelementptr inbounds <4 x float>, ptr %x, i64 1200 %1 = load <4 x float>, ptr %arrayidx1, align 8201 %add = fadd reassoc nsz arcp contract afn <4 x float> %1, %0202 %arrayidx2 = getelementptr inbounds <4 x float>, ptr %x, i64 2203 %2 = load <4 x float>, ptr %arrayidx2, align 8204 %add3 = fadd reassoc nsz arcp contract afn <4 x float> %add, %2205 %arrayidx4 = getelementptr inbounds <4 x float>, ptr %x, i64 3206 %3 = load <4 x float>, ptr %arrayidx4, align 8207 %add5 = fadd reassoc nsz arcp contract afn <4 x float> %add3, %3208 %arrayidx6 = getelementptr inbounds <4 x float>, ptr %x, i64 4209 %4 = load <4 x float>, ptr %arrayidx6, align 8210 %add7 = fadd reassoc nsz arcp contract afn <4 x float> %add5, %4211 %arrayidx8 = getelementptr inbounds <4 x float>, ptr %x, i64 5212 %5 = load <4 x float>, ptr %arrayidx8, align 8213 %add9 = fadd reassoc nsz arcp contract afn <4 x float> %add7, %5214 %arrayidx10 = getelementptr inbounds <4 x float>, ptr %x, i64 6215 %6 = load <4 x float>, ptr %arrayidx10, align 8216 %add11 = fadd reassoc nsz arcp contract afn <4 x float> %add9, %6217 %arrayidx12 = getelementptr inbounds <4 x float>, ptr %x, i64 7218 %7 = load <4 x float>, ptr %arrayidx12, align 8219 %add13 = fadd reassoc nsz arcp contract afn <4 x float> %add11, %7220 ret <4 x float> %add13221}222 223define double @fun5_fsub(ptr %x) {224; CHECK-LABEL: fun5_fsub:225; CHECK: # %bb.0: # %entry226; CHECK-NEXT: ld %f0, 0(%r2)227; CHECK-NEXT: sdb %f0, 8(%r2)228; CHECK-NEXT: ld %f1, 24(%r2)229; CHECK-NEXT: adb %f1, 16(%r2)230; CHECK-NEXT: sdbr %f0, %f1231; CHECK-NEXT: ld %f1, 40(%r2)232; CHECK-NEXT: adb %f1, 32(%r2)233; CHECK-NEXT: adb %f1, 48(%r2)234; CHECK-NEXT: sdbr %f0, %f1235; CHECK-NEXT: sdb %f0, 56(%r2)236; CHECK-NEXT: br %r14237entry:238 %0 = load double, ptr %x, align 8239 %arrayidx1 = getelementptr inbounds double, ptr %x, i64 1240 %1 = load double, ptr %arrayidx1, align 8241 %sub = fsub reassoc nsz arcp contract afn double %0, %1242 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 2243 %2 = load double, ptr %arrayidx2, align 8244 %sub3 = fsub reassoc nsz arcp contract afn double %sub, %2245 %arrayidx4 = getelementptr inbounds double, ptr %x, i64 3246 %3 = load double, ptr %arrayidx4, align 8247 %sub5 = fsub reassoc nsz arcp contract afn double %sub3, %3248 %arrayidx6 = getelementptr inbounds double, ptr %x, i64 4249 %4 = load double, ptr %arrayidx6, align 8250 %sub7 = fsub reassoc nsz arcp contract afn double %sub5, %4251 %arrayidx8 = getelementptr inbounds double, ptr %x, i64 5252 %5 = load double, ptr %arrayidx8, align 8253 %sub9 = fsub reassoc nsz arcp contract afn double %sub7, %5254 %arrayidx10 = getelementptr inbounds double, ptr %x, i64 6255 %6 = load double, ptr %arrayidx10, align 8256 %sub11 = fsub reassoc nsz arcp contract afn double %sub9, %6257 %arrayidx12 = getelementptr inbounds double, ptr %x, i64 7258 %7 = load double, ptr %arrayidx12, align 8259 %sub13 = fsub reassoc nsz arcp contract afn double %sub11, %7260 ret double %sub13261}262 263define float @fun6_fsub(ptr %x) {264; CHECK-LABEL: fun6_fsub:265; CHECK: # %bb.0: # %entry266; CHECK-NEXT: lde %f0, 0(%r2)267; CHECK-NEXT: seb %f0, 4(%r2)268; CHECK-NEXT: lde %f1, 12(%r2)269; CHECK-NEXT: aeb %f1, 8(%r2)270; CHECK-NEXT: sebr %f0, %f1271; CHECK-NEXT: lde %f1, 20(%r2)272; CHECK-NEXT: aeb %f1, 16(%r2)273; CHECK-NEXT: aeb %f1, 24(%r2)274; CHECK-NEXT: sebr %f0, %f1275; CHECK-NEXT: seb %f0, 28(%r2)276; CHECK-NEXT: br %r14277entry:278 %0 = load float, ptr %x, align 8279 %arrayidx1 = getelementptr inbounds float, ptr %x, i64 1280 %1 = load float, ptr %arrayidx1, align 8281 %sub = fsub reassoc nsz arcp contract afn float %0, %1282 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 2283 %2 = load float, ptr %arrayidx2, align 8284 %sub3 = fsub reassoc nsz arcp contract afn float %sub, %2285 %arrayidx4 = getelementptr inbounds float, ptr %x, i64 3286 %3 = load float, ptr %arrayidx4, align 8287 %sub5 = fsub reassoc nsz arcp contract afn float %sub3, %3288 %arrayidx6 = getelementptr inbounds float, ptr %x, i64 4289 %4 = load float, ptr %arrayidx6, align 8290 %sub7 = fsub reassoc nsz arcp contract afn float %sub5, %4291 %arrayidx8 = getelementptr inbounds float, ptr %x, i64 5292 %5 = load float, ptr %arrayidx8, align 8293 %sub9 = fsub reassoc nsz arcp contract afn float %sub7, %5294 %arrayidx10 = getelementptr inbounds float, ptr %x, i64 6295 %6 = load float, ptr %arrayidx10, align 8296 %sub11 = fsub reassoc nsz arcp contract afn float %sub9, %6297 %arrayidx12 = getelementptr inbounds float, ptr %x, i64 7298 %7 = load float, ptr %arrayidx12, align 8299 %sub13 = fsub reassoc nsz arcp contract afn float %sub11, %7300 ret float %sub13301}302 303define fp128 @fun7_fsub(ptr %x) {304; CHECK-LABEL: fun7_fsub:305; CHECK: # %bb.0: # %entry306; CHECK-NEXT: vl %v0, 0(%r3), 3307; CHECK-NEXT: vl %v1, 16(%r3), 3308; CHECK-NEXT: wfsxb %v0, %v0, %v1309; CHECK-NEXT: vl %v1, 32(%r3), 3310; CHECK-NEXT: vl %v2, 48(%r3), 3311; CHECK-NEXT: wfaxb %v1, %v1, %v2312; CHECK-NEXT: wfsxb %v0, %v0, %v1313; CHECK-NEXT: vl %v1, 64(%r3), 3314; CHECK-NEXT: vl %v2, 80(%r3), 3315; CHECK-NEXT: wfaxb %v1, %v1, %v2316; CHECK-NEXT: vl %v2, 96(%r3), 3317; CHECK-NEXT: wfaxb %v1, %v1, %v2318; CHECK-NEXT: wfsxb %v0, %v0, %v1319; CHECK-NEXT: vl %v1, 112(%r3), 3320; CHECK-NEXT: wfsxb %v0, %v0, %v1321; CHECK-NEXT: vst %v0, 0(%r2), 3322; CHECK-NEXT: br %r14323entry:324 %0 = load fp128, ptr %x, align 8325 %arrayidx1 = getelementptr inbounds fp128, ptr %x, i64 1326 %1 = load fp128, ptr %arrayidx1, align 8327 %sub = fsub reassoc nsz arcp contract afn fp128 %0, %1328 %arrayidx2 = getelementptr inbounds fp128, ptr %x, i64 2329 %2 = load fp128, ptr %arrayidx2, align 8330 %sub3 = fsub reassoc nsz arcp contract afn fp128 %sub, %2331 %arrayidx4 = getelementptr inbounds fp128, ptr %x, i64 3332 %3 = load fp128, ptr %arrayidx4, align 8333 %sub5 = fsub reassoc nsz arcp contract afn fp128 %sub3, %3334 %arrayidx6 = getelementptr inbounds fp128, ptr %x, i64 4335 %4 = load fp128, ptr %arrayidx6, align 8336 %sub7 = fsub reassoc nsz arcp contract afn fp128 %sub5, %4337 %arrayidx8 = getelementptr inbounds fp128, ptr %x, i64 5338 %5 = load fp128, ptr %arrayidx8, align 8339 %sub9 = fsub reassoc nsz arcp contract afn fp128 %sub7, %5340 %arrayidx10 = getelementptr inbounds fp128, ptr %x, i64 6341 %6 = load fp128, ptr %arrayidx10, align 8342 %sub11 = fsub reassoc nsz arcp contract afn fp128 %sub9, %6343 %arrayidx12 = getelementptr inbounds fp128, ptr %x, i64 7344 %7 = load fp128, ptr %arrayidx12, align 8345 %sub13 = fsub reassoc nsz arcp contract afn fp128 %sub11, %7346 ret fp128 %sub13347}348 349define <2 x double> @fun8_fsub(ptr %x) {350; CHECK-LABEL: fun8_fsub:351; CHECK: # %bb.0: # %entry352; CHECK-NEXT: vl %v0, 0(%r2), 3353; CHECK-NEXT: vl %v1, 16(%r2), 3354; CHECK-NEXT: vfsdb %v0, %v0, %v1355; CHECK-NEXT: vl %v1, 32(%r2), 3356; CHECK-NEXT: vl %v2, 48(%r2), 3357; CHECK-NEXT: vfadb %v1, %v1, %v2358; CHECK-NEXT: vfsdb %v0, %v0, %v1359; CHECK-NEXT: vl %v1, 64(%r2), 3360; CHECK-NEXT: vl %v2, 80(%r2), 3361; CHECK-NEXT: vfadb %v1, %v1, %v2362; CHECK-NEXT: vl %v2, 96(%r2), 3363; CHECK-NEXT: vfadb %v1, %v1, %v2364; CHECK-NEXT: vfsdb %v0, %v0, %v1365; CHECK-NEXT: vl %v1, 112(%r2), 3366; CHECK-NEXT: vfsdb %v24, %v0, %v1367; CHECK-NEXT: br %r14368entry:369 %0 = load <2 x double>, ptr %x, align 8370 %arrayidx1 = getelementptr inbounds <2 x double>, ptr %x, i64 1371 %1 = load <2 x double>, ptr %arrayidx1, align 8372 %sub = fsub reassoc nsz arcp contract afn <2 x double> %0, %1373 %arrayidx2 = getelementptr inbounds <2 x double>, ptr %x, i64 2374 %2 = load <2 x double>, ptr %arrayidx2, align 8375 %sub3 = fsub reassoc nsz arcp contract afn <2 x double> %sub, %2376 %arrayidx4 = getelementptr inbounds <2 x double>, ptr %x, i64 3377 %3 = load <2 x double>, ptr %arrayidx4, align 8378 %sub5 = fsub reassoc nsz arcp contract afn <2 x double> %sub3, %3379 %arrayidx6 = getelementptr inbounds <2 x double>, ptr %x, i64 4380 %4 = load <2 x double>, ptr %arrayidx6, align 8381 %sub7 = fsub reassoc nsz arcp contract afn <2 x double> %sub5, %4382 %arrayidx8 = getelementptr inbounds <2 x double>, ptr %x, i64 5383 %5 = load <2 x double>, ptr %arrayidx8, align 8384 %sub9 = fsub reassoc nsz arcp contract afn <2 x double> %sub7, %5385 %arrayidx10 = getelementptr inbounds <2 x double>, ptr %x, i64 6386 %6 = load <2 x double>, ptr %arrayidx10, align 8387 %sub11 = fsub reassoc nsz arcp contract afn <2 x double> %sub9, %6388 %arrayidx12 = getelementptr inbounds <2 x double>, ptr %x, i64 7389 %7 = load <2 x double>, ptr %arrayidx12, align 8390 %sub13 = fsub reassoc nsz arcp contract afn <2 x double> %sub11, %7391 ret <2 x double> %sub13392}393 394define <4 x float> @fun9_fsub(ptr %x) {395; CHECK-LABEL: fun9_fsub:396; CHECK: # %bb.0: # %entry397; CHECK-NEXT: vl %v0, 0(%r2), 3398; CHECK-NEXT: vl %v1, 16(%r2), 3399; CHECK-NEXT: vfssb %v0, %v0, %v1400; CHECK-NEXT: vl %v1, 32(%r2), 3401; CHECK-NEXT: vl %v2, 48(%r2), 3402; CHECK-NEXT: vfasb %v1, %v1, %v2403; CHECK-NEXT: vfssb %v0, %v0, %v1404; CHECK-NEXT: vl %v1, 64(%r2), 3405; CHECK-NEXT: vl %v2, 80(%r2), 3406; CHECK-NEXT: vfasb %v1, %v1, %v2407; CHECK-NEXT: vl %v2, 96(%r2), 3408; CHECK-NEXT: vfasb %v1, %v1, %v2409; CHECK-NEXT: vfssb %v0, %v0, %v1410; CHECK-NEXT: vl %v1, 112(%r2), 3411; CHECK-NEXT: vfssb %v24, %v0, %v1412; CHECK-NEXT: br %r14413entry:414 %0 = load <4 x float>, ptr %x, align 8415 %arrayidx1 = getelementptr inbounds <4 x float>, ptr %x, i64 1416 %1 = load <4 x float>, ptr %arrayidx1, align 8417 %sub = fsub reassoc nsz arcp contract afn <4 x float> %0, %1418 %arrayidx2 = getelementptr inbounds <4 x float>, ptr %x, i64 2419 %2 = load <4 x float>, ptr %arrayidx2, align 8420 %sub3 = fsub reassoc nsz arcp contract afn <4 x float> %sub, %2421 %arrayidx4 = getelementptr inbounds <4 x float>, ptr %x, i64 3422 %3 = load <4 x float>, ptr %arrayidx4, align 8423 %sub5 = fsub reassoc nsz arcp contract afn <4 x float> %sub3, %3424 %arrayidx6 = getelementptr inbounds <4 x float>, ptr %x, i64 4425 %4 = load <4 x float>, ptr %arrayidx6, align 8426 %sub7 = fsub reassoc nsz arcp contract afn <4 x float> %sub5, %4427 %arrayidx8 = getelementptr inbounds <4 x float>, ptr %x, i64 5428 %5 = load <4 x float>, ptr %arrayidx8, align 8429 %sub9 = fsub reassoc nsz arcp contract afn <4 x float> %sub7, %5430 %arrayidx10 = getelementptr inbounds <4 x float>, ptr %x, i64 6431 %6 = load <4 x float>, ptr %arrayidx10, align 8432 %sub11 = fsub reassoc nsz arcp contract afn <4 x float> %sub9, %6433 %arrayidx12 = getelementptr inbounds <4 x float>, ptr %x, i64 7434 %7 = load <4 x float>, ptr %arrayidx12, align 8435 %sub13 = fsub reassoc nsz arcp contract afn <4 x float> %sub11, %7436 ret <4 x float> %sub13437}438 439define double @fun10_fmul(ptr %x) {440; CHECK-LABEL: fun10_fmul:441; CHECK: # %bb.0: # %entry442; CHECK-NEXT: ld %f0, 8(%r2)443; CHECK-NEXT: mdb %f0, 0(%r2)444; CHECK-NEXT: ld %f1, 24(%r2)445; CHECK-NEXT: mdb %f1, 16(%r2)446; CHECK-NEXT: mdbr %f0, %f1447; CHECK-NEXT: ld %f1, 40(%r2)448; CHECK-NEXT: mdb %f1, 32(%r2)449; CHECK-NEXT: mdb %f1, 48(%r2)450; CHECK-NEXT: mdbr %f0, %f1451; CHECK-NEXT: mdb %f0, 56(%r2)452; CHECK-NEXT: br %r14453entry:454 %0 = load double, ptr %x, align 8455 %arrayidx1 = getelementptr inbounds double, ptr %x, i64 1456 %1 = load double, ptr %arrayidx1, align 8457 %mul = fmul reassoc nsz arcp contract afn double %0, %1458 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 2459 %2 = load double, ptr %arrayidx2, align 8460 %mul3 = fmul reassoc nsz arcp contract afn double %mul, %2461 %arrayidx4 = getelementptr inbounds double, ptr %x, i64 3462 %3 = load double, ptr %arrayidx4, align 8463 %mul5 = fmul reassoc nsz arcp contract afn double %mul3, %3464 %arrayidx6 = getelementptr inbounds double, ptr %x, i64 4465 %4 = load double, ptr %arrayidx6, align 8466 %mul7 = fmul reassoc nsz arcp contract afn double %mul5, %4467 %arrayidx8 = getelementptr inbounds double, ptr %x, i64 5468 %5 = load double, ptr %arrayidx8, align 8469 %mul9 = fmul reassoc nsz arcp contract afn double %mul7, %5470 %arrayidx10 = getelementptr inbounds double, ptr %x, i64 6471 %6 = load double, ptr %arrayidx10, align 8472 %mul11 = fmul reassoc nsz arcp contract afn double %mul9, %6473 %arrayidx12 = getelementptr inbounds double, ptr %x, i64 7474 %7 = load double, ptr %arrayidx12, align 8475 %mul13 = fmul reassoc nsz arcp contract afn double %mul11, %7476 ret double %mul13477}478 479define float @fun11_fmul(ptr %x) {480; CHECK-LABEL: fun11_fmul:481; CHECK: # %bb.0: # %entry482; CHECK-NEXT: lde %f0, 4(%r2)483; CHECK-NEXT: meeb %f0, 0(%r2)484; CHECK-NEXT: lde %f1, 12(%r2)485; CHECK-NEXT: meeb %f1, 8(%r2)486; CHECK-NEXT: meebr %f0, %f1487; CHECK-NEXT: lde %f1, 20(%r2)488; CHECK-NEXT: meeb %f1, 16(%r2)489; CHECK-NEXT: meeb %f1, 24(%r2)490; CHECK-NEXT: meebr %f0, %f1491; CHECK-NEXT: meeb %f0, 28(%r2)492; CHECK-NEXT: br %r14493entry:494 %0 = load float, ptr %x, align 8495 %arrayidx1 = getelementptr inbounds float, ptr %x, i64 1496 %1 = load float, ptr %arrayidx1, align 8497 %mul = fmul reassoc nsz arcp contract afn float %0, %1498 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 2499 %2 = load float, ptr %arrayidx2, align 8500 %mul3 = fmul reassoc nsz arcp contract afn float %mul, %2501 %arrayidx4 = getelementptr inbounds float, ptr %x, i64 3502 %3 = load float, ptr %arrayidx4, align 8503 %mul5 = fmul reassoc nsz arcp contract afn float %mul3, %3504 %arrayidx6 = getelementptr inbounds float, ptr %x, i64 4505 %4 = load float, ptr %arrayidx6, align 8506 %mul7 = fmul reassoc nsz arcp contract afn float %mul5, %4507 %arrayidx8 = getelementptr inbounds float, ptr %x, i64 5508 %5 = load float, ptr %arrayidx8, align 8509 %mul9 = fmul reassoc nsz arcp contract afn float %mul7, %5510 %arrayidx10 = getelementptr inbounds float, ptr %x, i64 6511 %6 = load float, ptr %arrayidx10, align 8512 %mul11 = fmul reassoc nsz arcp contract afn float %mul9, %6513 %arrayidx12 = getelementptr inbounds float, ptr %x, i64 7514 %7 = load float, ptr %arrayidx12, align 8515 %mul13 = fmul reassoc nsz arcp contract afn float %mul11, %7516 ret float %mul13517}518 519define fp128 @fun12_fmul(ptr %x) {520; CHECK-LABEL: fun12_fmul:521; CHECK: # %bb.0: # %entry522; CHECK-NEXT: vl %v0, 0(%r3), 3523; CHECK-NEXT: vl %v1, 16(%r3), 3524; CHECK-NEXT: wfmxb %v0, %v0, %v1525; CHECK-NEXT: vl %v1, 32(%r3), 3526; CHECK-NEXT: vl %v2, 48(%r3), 3527; CHECK-NEXT: wfmxb %v1, %v1, %v2528; CHECK-NEXT: wfmxb %v0, %v0, %v1529; CHECK-NEXT: vl %v1, 64(%r3), 3530; CHECK-NEXT: vl %v2, 80(%r3), 3531; CHECK-NEXT: wfmxb %v1, %v1, %v2532; CHECK-NEXT: vl %v2, 96(%r3), 3533; CHECK-NEXT: wfmxb %v1, %v1, %v2534; CHECK-NEXT: wfmxb %v0, %v0, %v1535; CHECK-NEXT: vl %v1, 112(%r3), 3536; CHECK-NEXT: wfmxb %v0, %v0, %v1537; CHECK-NEXT: vst %v0, 0(%r2), 3538; CHECK-NEXT: br %r14539entry:540 %0 = load fp128, ptr %x, align 8541 %arrayidx1 = getelementptr inbounds fp128, ptr %x, i64 1542 %1 = load fp128, ptr %arrayidx1, align 8543 %mul = fmul reassoc nsz arcp contract afn fp128 %0, %1544 %arrayidx2 = getelementptr inbounds fp128, ptr %x, i64 2545 %2 = load fp128, ptr %arrayidx2, align 8546 %mul3 = fmul reassoc nsz arcp contract afn fp128 %mul, %2547 %arrayidx4 = getelementptr inbounds fp128, ptr %x, i64 3548 %3 = load fp128, ptr %arrayidx4, align 8549 %mul5 = fmul reassoc nsz arcp contract afn fp128 %mul3, %3550 %arrayidx6 = getelementptr inbounds fp128, ptr %x, i64 4551 %4 = load fp128, ptr %arrayidx6, align 8552 %mul7 = fmul reassoc nsz arcp contract afn fp128 %mul5, %4553 %arrayidx8 = getelementptr inbounds fp128, ptr %x, i64 5554 %5 = load fp128, ptr %arrayidx8, align 8555 %mul9 = fmul reassoc nsz arcp contract afn fp128 %mul7, %5556 %arrayidx10 = getelementptr inbounds fp128, ptr %x, i64 6557 %6 = load fp128, ptr %arrayidx10, align 8558 %mul11 = fmul reassoc nsz arcp contract afn fp128 %mul9, %6559 %arrayidx12 = getelementptr inbounds fp128, ptr %x, i64 7560 %7 = load fp128, ptr %arrayidx12, align 8561 %mul13 = fmul reassoc nsz arcp contract afn fp128 %mul11, %7562 ret fp128 %mul13563}564 565define <2 x double> @fun13_fmul(ptr %x) {566; CHECK-LABEL: fun13_fmul:567; CHECK: # %bb.0: # %entry568; CHECK-NEXT: vl %v0, 0(%r2), 3569; CHECK-NEXT: vl %v1, 16(%r2), 3570; CHECK-NEXT: vfmdb %v0, %v0, %v1571; CHECK-NEXT: vl %v1, 32(%r2), 3572; CHECK-NEXT: vl %v2, 48(%r2), 3573; CHECK-NEXT: vfmdb %v1, %v1, %v2574; CHECK-NEXT: vfmdb %v0, %v0, %v1575; CHECK-NEXT: vl %v1, 64(%r2), 3576; CHECK-NEXT: vl %v2, 80(%r2), 3577; CHECK-NEXT: vfmdb %v1, %v1, %v2578; CHECK-NEXT: vl %v2, 96(%r2), 3579; CHECK-NEXT: vfmdb %v1, %v1, %v2580; CHECK-NEXT: vfmdb %v0, %v0, %v1581; CHECK-NEXT: vl %v1, 112(%r2), 3582; CHECK-NEXT: vfmdb %v24, %v0, %v1583; CHECK-NEXT: br %r14584entry:585 %0 = load <2 x double>, ptr %x, align 8586 %arrayidx1 = getelementptr inbounds <2 x double>, ptr %x, i64 1587 %1 = load <2 x double>, ptr %arrayidx1, align 8588 %mul = fmul reassoc nsz arcp contract afn <2 x double> %0, %1589 %arrayidx2 = getelementptr inbounds <2 x double>, ptr %x, i64 2590 %2 = load <2 x double>, ptr %arrayidx2, align 8591 %mul3 = fmul reassoc nsz arcp contract afn <2 x double> %mul, %2592 %arrayidx4 = getelementptr inbounds <2 x double>, ptr %x, i64 3593 %3 = load <2 x double>, ptr %arrayidx4, align 8594 %mul5 = fmul reassoc nsz arcp contract afn <2 x double> %mul3, %3595 %arrayidx6 = getelementptr inbounds <2 x double>, ptr %x, i64 4596 %4 = load <2 x double>, ptr %arrayidx6, align 8597 %mul7 = fmul reassoc nsz arcp contract afn <2 x double> %mul5, %4598 %arrayidx8 = getelementptr inbounds <2 x double>, ptr %x, i64 5599 %5 = load <2 x double>, ptr %arrayidx8, align 8600 %mul9 = fmul reassoc nsz arcp contract afn <2 x double> %mul7, %5601 %arrayidx10 = getelementptr inbounds <2 x double>, ptr %x, i64 6602 %6 = load <2 x double>, ptr %arrayidx10, align 8603 %mul11 = fmul reassoc nsz arcp contract afn <2 x double> %mul9, %6604 %arrayidx12 = getelementptr inbounds <2 x double>, ptr %x, i64 7605 %7 = load <2 x double>, ptr %arrayidx12, align 8606 %mul13 = fmul reassoc nsz arcp contract afn <2 x double> %mul11, %7607 ret <2 x double> %mul13608}609 610define <4 x float> @fun14_fmul(ptr %x) {611; CHECK-LABEL: fun14_fmul:612; CHECK: # %bb.0: # %entry613; CHECK-NEXT: vl %v0, 0(%r2), 3614; CHECK-NEXT: vl %v1, 16(%r2), 3615; CHECK-NEXT: vfmsb %v0, %v0, %v1616; CHECK-NEXT: vl %v1, 32(%r2), 3617; CHECK-NEXT: vl %v2, 48(%r2), 3618; CHECK-NEXT: vfmsb %v1, %v1, %v2619; CHECK-NEXT: vfmsb %v0, %v0, %v1620; CHECK-NEXT: vl %v1, 64(%r2), 3621; CHECK-NEXT: vl %v2, 80(%r2), 3622; CHECK-NEXT: vfmsb %v1, %v1, %v2623; CHECK-NEXT: vl %v2, 96(%r2), 3624; CHECK-NEXT: vfmsb %v1, %v1, %v2625; CHECK-NEXT: vfmsb %v0, %v0, %v1626; CHECK-NEXT: vl %v1, 112(%r2), 3627; CHECK-NEXT: vfmsb %v24, %v0, %v1628; CHECK-NEXT: br %r14629entry:630 %0 = load <4 x float>, ptr %x, align 8631 %arrayidx1 = getelementptr inbounds <4 x float>, ptr %x, i64 1632 %1 = load <4 x float>, ptr %arrayidx1, align 8633 %mul = fmul reassoc nsz arcp contract afn <4 x float> %0, %1634 %arrayidx2 = getelementptr inbounds <4 x float>, ptr %x, i64 2635 %2 = load <4 x float>, ptr %arrayidx2, align 8636 %mul3 = fmul reassoc nsz arcp contract afn <4 x float> %mul, %2637 %arrayidx4 = getelementptr inbounds <4 x float>, ptr %x, i64 3638 %3 = load <4 x float>, ptr %arrayidx4, align 8639 %mul5 = fmul reassoc nsz arcp contract afn <4 x float> %mul3, %3640 %arrayidx6 = getelementptr inbounds <4 x float>, ptr %x, i64 4641 %4 = load <4 x float>, ptr %arrayidx6, align 8642 %mul7 = fmul reassoc nsz arcp contract afn <4 x float> %mul5, %4643 %arrayidx8 = getelementptr inbounds <4 x float>, ptr %x, i64 5644 %5 = load <4 x float>, ptr %arrayidx8, align 8645 %mul9 = fmul reassoc nsz arcp contract afn <4 x float> %mul7, %5646 %arrayidx10 = getelementptr inbounds <4 x float>, ptr %x, i64 6647 %6 = load <4 x float>, ptr %arrayidx10, align 8648 %mul11 = fmul reassoc nsz arcp contract afn <4 x float> %mul9, %6649 %arrayidx12 = getelementptr inbounds <4 x float>, ptr %x, i64 7650 %7 = load <4 x float>, ptr %arrayidx12, align 8651 %mul13 = fmul reassoc nsz arcp contract afn <4 x float> %mul11, %7652 ret <4 x float> %mul13653}654