1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 2; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z15 -verify-machineinstrs -O3 \ 3; RUN: | FileCheck %s 4 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: # %entry 10; 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, %f1 15; 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, %f1 19; CHECK-NEXT: adb %f0, 56(%r2) 20; CHECK-NEXT: br %r14 21entry: 22 %0 = load double, ptr %x, align 8 23 %arrayidx1 = getelementptr inbounds double, ptr %x, i64 1 24 %1 = load double, ptr %arrayidx1, align 8 25 %add = fadd reassoc nsz arcp contract afn double %1, %0 26 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 2 27 %2 = load double, ptr %arrayidx2, align 8 28 %add3 = fadd reassoc nsz arcp contract afn double %add, %2 29 %arrayidx4 = getelementptr inbounds double, ptr %x, i64 3 30 %3 = load double, ptr %arrayidx4, align 8 31 %add5 = fadd reassoc nsz arcp contract afn double %add3, %3 32 %arrayidx6 = getelementptr inbounds double, ptr %x, i64 4 33 %4 = load double, ptr %arrayidx6, align 8 34 %add7 = fadd reassoc nsz arcp contract afn double %add5, %4 35 %arrayidx8 = getelementptr inbounds double, ptr %x, i64 5 36 %5 = load double, ptr %arrayidx8, align 8 37 %add9 = fadd reassoc nsz arcp contract afn double %add7, %5 38 %arrayidx10 = getelementptr inbounds double, ptr %x, i64 6 39 %6 = load double, ptr %arrayidx10, align 8 40 %add11 = fadd reassoc nsz arcp contract afn double %add9, %6 41 %arrayidx12 = getelementptr inbounds double, ptr %x, i64 7 42 %7 = load double, ptr %arrayidx12, align 8 43 %add13 = fadd reassoc nsz arcp contract afn double %add11, %7 44 ret double %add13 45} 46 47define float @fun1_fadd(ptr %x) { 48; CHECK-LABEL: fun1_fadd: 49; CHECK: # %bb.0: # %entry 50; 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, %f1 55; 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, %f1 59; CHECK-NEXT: aeb %f0, 28(%r2) 60; CHECK-NEXT: br %r14 61entry: 62 %0 = load float, ptr %x, align 8 63 %arrayidx1 = getelementptr inbounds float, ptr %x, i64 1 64 %1 = load float, ptr %arrayidx1, align 8 65 %add = fadd reassoc nsz arcp contract afn float %1, %0 66 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 2 67 %2 = load float, ptr %arrayidx2, align 8 68 %add3 = fadd reassoc nsz arcp contract afn float %add, %2 69 %arrayidx4 = getelementptr inbounds float, ptr %x, i64 3 70 %3 = load float, ptr %arrayidx4, align 8 71 %add5 = fadd reassoc nsz arcp contract afn float %add3, %3 72 %arrayidx6 = getelementptr inbounds float, ptr %x, i64 4 73 %4 = load float, ptr %arrayidx6, align 8 74 %add7 = fadd reassoc nsz arcp contract afn float %add5, %4 75 %arrayidx8 = getelementptr inbounds float, ptr %x, i64 5 76 %5 = load float, ptr %arrayidx8, align 8 77 %add9 = fadd reassoc nsz arcp contract afn float %add7, %5 78 %arrayidx10 = getelementptr inbounds float, ptr %x, i64 6 79 %6 = load float, ptr %arrayidx10, align 8 80 %add11 = fadd reassoc nsz arcp contract afn float %add9, %6 81 %arrayidx12 = getelementptr inbounds float, ptr %x, i64 7 82 %7 = load float, ptr %arrayidx12, align 8 83 %add13 = fadd reassoc nsz arcp contract afn float %add11, %7 84 ret float %add13 85} 86 87define fp128 @fun2_fadd(ptr %x) { 88; CHECK-LABEL: fun2_fadd: 89; CHECK: # %bb.0: # %entry 90; CHECK-NEXT: vl %v0, 0(%r3), 3 91; CHECK-NEXT: vl %v1, 16(%r3), 3 92; CHECK-NEXT: wfaxb %v0, %v1, %v0 93; CHECK-NEXT: vl %v1, 32(%r3), 3 94; CHECK-NEXT: vl %v2, 48(%r3), 3 95; CHECK-NEXT: wfaxb %v1, %v1, %v2 96; CHECK-NEXT: wfaxb %v0, %v0, %v1 97; CHECK-NEXT: vl %v1, 64(%r3), 3 98; CHECK-NEXT: vl %v2, 80(%r3), 3 99; CHECK-NEXT: wfaxb %v1, %v1, %v2 100; CHECK-NEXT: vl %v2, 96(%r3), 3 101; CHECK-NEXT: wfaxb %v1, %v1, %v2 102; CHECK-NEXT: wfaxb %v0, %v0, %v1 103; CHECK-NEXT: vl %v1, 112(%r3), 3 104; CHECK-NEXT: wfaxb %v0, %v0, %v1 105; CHECK-NEXT: vst %v0, 0(%r2), 3 106; CHECK-NEXT: br %r14 107entry: 108 %0 = load fp128, ptr %x, align 8 109 %arrayidx1 = getelementptr inbounds fp128, ptr %x, i64 1 110 %1 = load fp128, ptr %arrayidx1, align 8 111 %add = fadd reassoc nsz arcp contract afn fp128 %1, %0 112 %arrayidx2 = getelementptr inbounds fp128, ptr %x, i64 2 113 %2 = load fp128, ptr %arrayidx2, align 8 114 %add3 = fadd reassoc nsz arcp contract afn fp128 %add, %2 115 %arrayidx4 = getelementptr inbounds fp128, ptr %x, i64 3 116 %3 = load fp128, ptr %arrayidx4, align 8 117 %add5 = fadd reassoc nsz arcp contract afn fp128 %add3, %3 118 %arrayidx6 = getelementptr inbounds fp128, ptr %x, i64 4 119 %4 = load fp128, ptr %arrayidx6, align 8 120 %add7 = fadd reassoc nsz arcp contract afn fp128 %add5, %4 121 %arrayidx8 = getelementptr inbounds fp128, ptr %x, i64 5 122 %5 = load fp128, ptr %arrayidx8, align 8 123 %add9 = fadd reassoc nsz arcp contract afn fp128 %add7, %5 124 %arrayidx10 = getelementptr inbounds fp128, ptr %x, i64 6 125 %6 = load fp128, ptr %arrayidx10, align 8 126 %add11 = fadd reassoc nsz arcp contract afn fp128 %add9, %6 127 %arrayidx12 = getelementptr inbounds fp128, ptr %x, i64 7 128 %7 = load fp128, ptr %arrayidx12, align 8 129 %add13 = fadd reassoc nsz arcp contract afn fp128 %add11, %7 130 ret fp128 %add13 131} 132 133define <2 x double> @fun3_fadd(ptr %x) { 134; CHECK-LABEL: fun3_fadd: 135; CHECK: # %bb.0: # %entry 136; CHECK-NEXT: vl %v0, 0(%r2), 3 137; CHECK-NEXT: vl %v1, 16(%r2), 3 138; CHECK-NEXT: vfadb %v0, %v1, %v0 139; CHECK-NEXT: vl %v1, 32(%r2), 3 140; CHECK-NEXT: vl %v2, 48(%r2), 3 141; CHECK-NEXT: vfadb %v1, %v1, %v2 142; CHECK-NEXT: vfadb %v0, %v0, %v1 143; CHECK-NEXT: vl %v1, 64(%r2), 3 144; CHECK-NEXT: vl %v2, 80(%r2), 3 145; CHECK-NEXT: vfadb %v1, %v1, %v2 146; CHECK-NEXT: vl %v2, 96(%r2), 3 147; CHECK-NEXT: vfadb %v1, %v1, %v2 148; CHECK-NEXT: vfadb %v0, %v0, %v1 149; CHECK-NEXT: vl %v1, 112(%r2), 3 150; CHECK-NEXT: vfadb %v24, %v0, %v1 151; CHECK-NEXT: br %r14 152entry: 153 %0 = load <2 x double>, ptr %x, align 8 154 %arrayidx1 = getelementptr inbounds <2 x double>, ptr %x, i64 1 155 %1 = load <2 x double>, ptr %arrayidx1, align 8 156 %add = fadd reassoc nsz arcp contract afn <2 x double> %1, %0 157 %arrayidx2 = getelementptr inbounds <2 x double>, ptr %x, i64 2 158 %2 = load <2 x double>, ptr %arrayidx2, align 8 159 %add3 = fadd reassoc nsz arcp contract afn <2 x double> %add, %2 160 %arrayidx4 = getelementptr inbounds <2 x double>, ptr %x, i64 3 161 %3 = load <2 x double>, ptr %arrayidx4, align 8 162 %add5 = fadd reassoc nsz arcp contract afn <2 x double> %add3, %3 163 %arrayidx6 = getelementptr inbounds <2 x double>, ptr %x, i64 4 164 %4 = load <2 x double>, ptr %arrayidx6, align 8 165 %add7 = fadd reassoc nsz arcp contract afn <2 x double> %add5, %4 166 %arrayidx8 = getelementptr inbounds <2 x double>, ptr %x, i64 5 167 %5 = load <2 x double>, ptr %arrayidx8, align 8 168 %add9 = fadd reassoc nsz arcp contract afn <2 x double> %add7, %5 169 %arrayidx10 = getelementptr inbounds <2 x double>, ptr %x, i64 6 170 %6 = load <2 x double>, ptr %arrayidx10, align 8 171 %add11 = fadd reassoc nsz arcp contract afn <2 x double> %add9, %6 172 %arrayidx12 = getelementptr inbounds <2 x double>, ptr %x, i64 7 173 %7 = load <2 x double>, ptr %arrayidx12, align 8 174 %add13 = fadd reassoc nsz arcp contract afn <2 x double> %add11, %7 175 ret <2 x double> %add13 176} 177 178define <4 x float> @fun4_fadd(ptr %x) { 179; CHECK-LABEL: fun4_fadd: 180; CHECK: # %bb.0: # %entry 181; CHECK-NEXT: vl %v0, 0(%r2), 3 182; CHECK-NEXT: vl %v1, 16(%r2), 3 183; CHECK-NEXT: vfasb %v0, %v1, %v0 184; CHECK-NEXT: vl %v1, 32(%r2), 3 185; CHECK-NEXT: vl %v2, 48(%r2), 3 186; CHECK-NEXT: vfasb %v1, %v1, %v2 187; CHECK-NEXT: vfasb %v0, %v0, %v1 188; CHECK-NEXT: vl %v1, 64(%r2), 3 189; CHECK-NEXT: vl %v2, 80(%r2), 3 190; CHECK-NEXT: vfasb %v1, %v1, %v2 191; CHECK-NEXT: vl %v2, 96(%r2), 3 192; CHECK-NEXT: vfasb %v1, %v1, %v2 193; CHECK-NEXT: vfasb %v0, %v0, %v1 194; CHECK-NEXT: vl %v1, 112(%r2), 3 195; CHECK-NEXT: vfasb %v24, %v0, %v1 196; CHECK-NEXT: br %r14 197entry: 198 %0 = load <4 x float>, ptr %x, align 8 199 %arrayidx1 = getelementptr inbounds <4 x float>, ptr %x, i64 1 200 %1 = load <4 x float>, ptr %arrayidx1, align 8 201 %add = fadd reassoc nsz arcp contract afn <4 x float> %1, %0 202 %arrayidx2 = getelementptr inbounds <4 x float>, ptr %x, i64 2 203 %2 = load <4 x float>, ptr %arrayidx2, align 8 204 %add3 = fadd reassoc nsz arcp contract afn <4 x float> %add, %2 205 %arrayidx4 = getelementptr inbounds <4 x float>, ptr %x, i64 3 206 %3 = load <4 x float>, ptr %arrayidx4, align 8 207 %add5 = fadd reassoc nsz arcp contract afn <4 x float> %add3, %3 208 %arrayidx6 = getelementptr inbounds <4 x float>, ptr %x, i64 4 209 %4 = load <4 x float>, ptr %arrayidx6, align 8 210 %add7 = fadd reassoc nsz arcp contract afn <4 x float> %add5, %4 211 %arrayidx8 = getelementptr inbounds <4 x float>, ptr %x, i64 5 212 %5 = load <4 x float>, ptr %arrayidx8, align 8 213 %add9 = fadd reassoc nsz arcp contract afn <4 x float> %add7, %5 214 %arrayidx10 = getelementptr inbounds <4 x float>, ptr %x, i64 6 215 %6 = load <4 x float>, ptr %arrayidx10, align 8 216 %add11 = fadd reassoc nsz arcp contract afn <4 x float> %add9, %6 217 %arrayidx12 = getelementptr inbounds <4 x float>, ptr %x, i64 7 218 %7 = load <4 x float>, ptr %arrayidx12, align 8 219 %add13 = fadd reassoc nsz arcp contract afn <4 x float> %add11, %7 220 ret <4 x float> %add13 221} 222 223define double @fun5_fsub(ptr %x) { 224; CHECK-LABEL: fun5_fsub: 225; CHECK: # %bb.0: # %entry 226; 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, %f1 231; 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, %f1 235; CHECK-NEXT: sdb %f0, 56(%r2) 236; CHECK-NEXT: br %r14 237entry: 238 %0 = load double, ptr %x, align 8 239 %arrayidx1 = getelementptr inbounds double, ptr %x, i64 1 240 %1 = load double, ptr %arrayidx1, align 8 241 %sub = fsub reassoc nsz arcp contract afn double %0, %1 242 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 2 243 %2 = load double, ptr %arrayidx2, align 8 244 %sub3 = fsub reassoc nsz arcp contract afn double %sub, %2 245 %arrayidx4 = getelementptr inbounds double, ptr %x, i64 3 246 %3 = load double, ptr %arrayidx4, align 8 247 %sub5 = fsub reassoc nsz arcp contract afn double %sub3, %3 248 %arrayidx6 = getelementptr inbounds double, ptr %x, i64 4 249 %4 = load double, ptr %arrayidx6, align 8 250 %sub7 = fsub reassoc nsz arcp contract afn double %sub5, %4 251 %arrayidx8 = getelementptr inbounds double, ptr %x, i64 5 252 %5 = load double, ptr %arrayidx8, align 8 253 %sub9 = fsub reassoc nsz arcp contract afn double %sub7, %5 254 %arrayidx10 = getelementptr inbounds double, ptr %x, i64 6 255 %6 = load double, ptr %arrayidx10, align 8 256 %sub11 = fsub reassoc nsz arcp contract afn double %sub9, %6 257 %arrayidx12 = getelementptr inbounds double, ptr %x, i64 7 258 %7 = load double, ptr %arrayidx12, align 8 259 %sub13 = fsub reassoc nsz arcp contract afn double %sub11, %7 260 ret double %sub13 261} 262 263define float @fun6_fsub(ptr %x) { 264; CHECK-LABEL: fun6_fsub: 265; CHECK: # %bb.0: # %entry 266; 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, %f1 271; 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, %f1 275; CHECK-NEXT: seb %f0, 28(%r2) 276; CHECK-NEXT: br %r14 277entry: 278 %0 = load float, ptr %x, align 8 279 %arrayidx1 = getelementptr inbounds float, ptr %x, i64 1 280 %1 = load float, ptr %arrayidx1, align 8 281 %sub = fsub reassoc nsz arcp contract afn float %0, %1 282 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 2 283 %2 = load float, ptr %arrayidx2, align 8 284 %sub3 = fsub reassoc nsz arcp contract afn float %sub, %2 285 %arrayidx4 = getelementptr inbounds float, ptr %x, i64 3 286 %3 = load float, ptr %arrayidx4, align 8 287 %sub5 = fsub reassoc nsz arcp contract afn float %sub3, %3 288 %arrayidx6 = getelementptr inbounds float, ptr %x, i64 4 289 %4 = load float, ptr %arrayidx6, align 8 290 %sub7 = fsub reassoc nsz arcp contract afn float %sub5, %4 291 %arrayidx8 = getelementptr inbounds float, ptr %x, i64 5 292 %5 = load float, ptr %arrayidx8, align 8 293 %sub9 = fsub reassoc nsz arcp contract afn float %sub7, %5 294 %arrayidx10 = getelementptr inbounds float, ptr %x, i64 6 295 %6 = load float, ptr %arrayidx10, align 8 296 %sub11 = fsub reassoc nsz arcp contract afn float %sub9, %6 297 %arrayidx12 = getelementptr inbounds float, ptr %x, i64 7 298 %7 = load float, ptr %arrayidx12, align 8 299 %sub13 = fsub reassoc nsz arcp contract afn float %sub11, %7 300 ret float %sub13 301} 302 303define fp128 @fun7_fsub(ptr %x) { 304; CHECK-LABEL: fun7_fsub: 305; CHECK: # %bb.0: # %entry 306; CHECK-NEXT: vl %v0, 0(%r3), 3 307; CHECK-NEXT: vl %v1, 16(%r3), 3 308; CHECK-NEXT: wfsxb %v0, %v0, %v1 309; CHECK-NEXT: vl %v1, 32(%r3), 3 310; CHECK-NEXT: vl %v2, 48(%r3), 3 311; CHECK-NEXT: wfaxb %v1, %v1, %v2 312; CHECK-NEXT: wfsxb %v0, %v0, %v1 313; CHECK-NEXT: vl %v1, 64(%r3), 3 314; CHECK-NEXT: vl %v2, 80(%r3), 3 315; CHECK-NEXT: wfaxb %v1, %v1, %v2 316; CHECK-NEXT: vl %v2, 96(%r3), 3 317; CHECK-NEXT: wfaxb %v1, %v1, %v2 318; CHECK-NEXT: wfsxb %v0, %v0, %v1 319; CHECK-NEXT: vl %v1, 112(%r3), 3 320; CHECK-NEXT: wfsxb %v0, %v0, %v1 321; CHECK-NEXT: vst %v0, 0(%r2), 3 322; CHECK-NEXT: br %r14 323entry: 324 %0 = load fp128, ptr %x, align 8 325 %arrayidx1 = getelementptr inbounds fp128, ptr %x, i64 1 326 %1 = load fp128, ptr %arrayidx1, align 8 327 %sub = fsub reassoc nsz arcp contract afn fp128 %0, %1 328 %arrayidx2 = getelementptr inbounds fp128, ptr %x, i64 2 329 %2 = load fp128, ptr %arrayidx2, align 8 330 %sub3 = fsub reassoc nsz arcp contract afn fp128 %sub, %2 331 %arrayidx4 = getelementptr inbounds fp128, ptr %x, i64 3 332 %3 = load fp128, ptr %arrayidx4, align 8 333 %sub5 = fsub reassoc nsz arcp contract afn fp128 %sub3, %3 334 %arrayidx6 = getelementptr inbounds fp128, ptr %x, i64 4 335 %4 = load fp128, ptr %arrayidx6, align 8 336 %sub7 = fsub reassoc nsz arcp contract afn fp128 %sub5, %4 337 %arrayidx8 = getelementptr inbounds fp128, ptr %x, i64 5 338 %5 = load fp128, ptr %arrayidx8, align 8 339 %sub9 = fsub reassoc nsz arcp contract afn fp128 %sub7, %5 340 %arrayidx10 = getelementptr inbounds fp128, ptr %x, i64 6 341 %6 = load fp128, ptr %arrayidx10, align 8 342 %sub11 = fsub reassoc nsz arcp contract afn fp128 %sub9, %6 343 %arrayidx12 = getelementptr inbounds fp128, ptr %x, i64 7 344 %7 = load fp128, ptr %arrayidx12, align 8 345 %sub13 = fsub reassoc nsz arcp contract afn fp128 %sub11, %7 346 ret fp128 %sub13 347} 348 349define <2 x double> @fun8_fsub(ptr %x) { 350; CHECK-LABEL: fun8_fsub: 351; CHECK: # %bb.0: # %entry 352; CHECK-NEXT: vl %v0, 0(%r2), 3 353; CHECK-NEXT: vl %v1, 16(%r2), 3 354; CHECK-NEXT: vfsdb %v0, %v0, %v1 355; CHECK-NEXT: vl %v1, 32(%r2), 3 356; CHECK-NEXT: vl %v2, 48(%r2), 3 357; CHECK-NEXT: vfadb %v1, %v1, %v2 358; CHECK-NEXT: vfsdb %v0, %v0, %v1 359; CHECK-NEXT: vl %v1, 64(%r2), 3 360; CHECK-NEXT: vl %v2, 80(%r2), 3 361; CHECK-NEXT: vfadb %v1, %v1, %v2 362; CHECK-NEXT: vl %v2, 96(%r2), 3 363; CHECK-NEXT: vfadb %v1, %v1, %v2 364; CHECK-NEXT: vfsdb %v0, %v0, %v1 365; CHECK-NEXT: vl %v1, 112(%r2), 3 366; CHECK-NEXT: vfsdb %v24, %v0, %v1 367; CHECK-NEXT: br %r14 368entry: 369 %0 = load <2 x double>, ptr %x, align 8 370 %arrayidx1 = getelementptr inbounds <2 x double>, ptr %x, i64 1 371 %1 = load <2 x double>, ptr %arrayidx1, align 8 372 %sub = fsub reassoc nsz arcp contract afn <2 x double> %0, %1 373 %arrayidx2 = getelementptr inbounds <2 x double>, ptr %x, i64 2 374 %2 = load <2 x double>, ptr %arrayidx2, align 8 375 %sub3 = fsub reassoc nsz arcp contract afn <2 x double> %sub, %2 376 %arrayidx4 = getelementptr inbounds <2 x double>, ptr %x, i64 3 377 %3 = load <2 x double>, ptr %arrayidx4, align 8 378 %sub5 = fsub reassoc nsz arcp contract afn <2 x double> %sub3, %3 379 %arrayidx6 = getelementptr inbounds <2 x double>, ptr %x, i64 4 380 %4 = load <2 x double>, ptr %arrayidx6, align 8 381 %sub7 = fsub reassoc nsz arcp contract afn <2 x double> %sub5, %4 382 %arrayidx8 = getelementptr inbounds <2 x double>, ptr %x, i64 5 383 %5 = load <2 x double>, ptr %arrayidx8, align 8 384 %sub9 = fsub reassoc nsz arcp contract afn <2 x double> %sub7, %5 385 %arrayidx10 = getelementptr inbounds <2 x double>, ptr %x, i64 6 386 %6 = load <2 x double>, ptr %arrayidx10, align 8 387 %sub11 = fsub reassoc nsz arcp contract afn <2 x double> %sub9, %6 388 %arrayidx12 = getelementptr inbounds <2 x double>, ptr %x, i64 7 389 %7 = load <2 x double>, ptr %arrayidx12, align 8 390 %sub13 = fsub reassoc nsz arcp contract afn <2 x double> %sub11, %7 391 ret <2 x double> %sub13 392} 393 394define <4 x float> @fun9_fsub(ptr %x) { 395; CHECK-LABEL: fun9_fsub: 396; CHECK: # %bb.0: # %entry 397; CHECK-NEXT: vl %v0, 0(%r2), 3 398; CHECK-NEXT: vl %v1, 16(%r2), 3 399; CHECK-NEXT: vfssb %v0, %v0, %v1 400; CHECK-NEXT: vl %v1, 32(%r2), 3 401; CHECK-NEXT: vl %v2, 48(%r2), 3 402; CHECK-NEXT: vfasb %v1, %v1, %v2 403; CHECK-NEXT: vfssb %v0, %v0, %v1 404; CHECK-NEXT: vl %v1, 64(%r2), 3 405; CHECK-NEXT: vl %v2, 80(%r2), 3 406; CHECK-NEXT: vfasb %v1, %v1, %v2 407; CHECK-NEXT: vl %v2, 96(%r2), 3 408; CHECK-NEXT: vfasb %v1, %v1, %v2 409; CHECK-NEXT: vfssb %v0, %v0, %v1 410; CHECK-NEXT: vl %v1, 112(%r2), 3 411; CHECK-NEXT: vfssb %v24, %v0, %v1 412; CHECK-NEXT: br %r14 413entry: 414 %0 = load <4 x float>, ptr %x, align 8 415 %arrayidx1 = getelementptr inbounds <4 x float>, ptr %x, i64 1 416 %1 = load <4 x float>, ptr %arrayidx1, align 8 417 %sub = fsub reassoc nsz arcp contract afn <4 x float> %0, %1 418 %arrayidx2 = getelementptr inbounds <4 x float>, ptr %x, i64 2 419 %2 = load <4 x float>, ptr %arrayidx2, align 8 420 %sub3 = fsub reassoc nsz arcp contract afn <4 x float> %sub, %2 421 %arrayidx4 = getelementptr inbounds <4 x float>, ptr %x, i64 3 422 %3 = load <4 x float>, ptr %arrayidx4, align 8 423 %sub5 = fsub reassoc nsz arcp contract afn <4 x float> %sub3, %3 424 %arrayidx6 = getelementptr inbounds <4 x float>, ptr %x, i64 4 425 %4 = load <4 x float>, ptr %arrayidx6, align 8 426 %sub7 = fsub reassoc nsz arcp contract afn <4 x float> %sub5, %4 427 %arrayidx8 = getelementptr inbounds <4 x float>, ptr %x, i64 5 428 %5 = load <4 x float>, ptr %arrayidx8, align 8 429 %sub9 = fsub reassoc nsz arcp contract afn <4 x float> %sub7, %5 430 %arrayidx10 = getelementptr inbounds <4 x float>, ptr %x, i64 6 431 %6 = load <4 x float>, ptr %arrayidx10, align 8 432 %sub11 = fsub reassoc nsz arcp contract afn <4 x float> %sub9, %6 433 %arrayidx12 = getelementptr inbounds <4 x float>, ptr %x, i64 7 434 %7 = load <4 x float>, ptr %arrayidx12, align 8 435 %sub13 = fsub reassoc nsz arcp contract afn <4 x float> %sub11, %7 436 ret <4 x float> %sub13 437} 438 439define double @fun10_fmul(ptr %x) { 440; CHECK-LABEL: fun10_fmul: 441; CHECK: # %bb.0: # %entry 442; 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, %f1 447; 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, %f1 451; CHECK-NEXT: mdb %f0, 56(%r2) 452; CHECK-NEXT: br %r14 453entry: 454 %0 = load double, ptr %x, align 8 455 %arrayidx1 = getelementptr inbounds double, ptr %x, i64 1 456 %1 = load double, ptr %arrayidx1, align 8 457 %mul = fmul reassoc nsz arcp contract afn double %0, %1 458 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 2 459 %2 = load double, ptr %arrayidx2, align 8 460 %mul3 = fmul reassoc nsz arcp contract afn double %mul, %2 461 %arrayidx4 = getelementptr inbounds double, ptr %x, i64 3 462 %3 = load double, ptr %arrayidx4, align 8 463 %mul5 = fmul reassoc nsz arcp contract afn double %mul3, %3 464 %arrayidx6 = getelementptr inbounds double, ptr %x, i64 4 465 %4 = load double, ptr %arrayidx6, align 8 466 %mul7 = fmul reassoc nsz arcp contract afn double %mul5, %4 467 %arrayidx8 = getelementptr inbounds double, ptr %x, i64 5 468 %5 = load double, ptr %arrayidx8, align 8 469 %mul9 = fmul reassoc nsz arcp contract afn double %mul7, %5 470 %arrayidx10 = getelementptr inbounds double, ptr %x, i64 6 471 %6 = load double, ptr %arrayidx10, align 8 472 %mul11 = fmul reassoc nsz arcp contract afn double %mul9, %6 473 %arrayidx12 = getelementptr inbounds double, ptr %x, i64 7 474 %7 = load double, ptr %arrayidx12, align 8 475 %mul13 = fmul reassoc nsz arcp contract afn double %mul11, %7 476 ret double %mul13 477} 478 479define float @fun11_fmul(ptr %x) { 480; CHECK-LABEL: fun11_fmul: 481; CHECK: # %bb.0: # %entry 482; 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, %f1 487; 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, %f1 491; CHECK-NEXT: meeb %f0, 28(%r2) 492; CHECK-NEXT: br %r14 493entry: 494 %0 = load float, ptr %x, align 8 495 %arrayidx1 = getelementptr inbounds float, ptr %x, i64 1 496 %1 = load float, ptr %arrayidx1, align 8 497 %mul = fmul reassoc nsz arcp contract afn float %0, %1 498 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 2 499 %2 = load float, ptr %arrayidx2, align 8 500 %mul3 = fmul reassoc nsz arcp contract afn float %mul, %2 501 %arrayidx4 = getelementptr inbounds float, ptr %x, i64 3 502 %3 = load float, ptr %arrayidx4, align 8 503 %mul5 = fmul reassoc nsz arcp contract afn float %mul3, %3 504 %arrayidx6 = getelementptr inbounds float, ptr %x, i64 4 505 %4 = load float, ptr %arrayidx6, align 8 506 %mul7 = fmul reassoc nsz arcp contract afn float %mul5, %4 507 %arrayidx8 = getelementptr inbounds float, ptr %x, i64 5 508 %5 = load float, ptr %arrayidx8, align 8 509 %mul9 = fmul reassoc nsz arcp contract afn float %mul7, %5 510 %arrayidx10 = getelementptr inbounds float, ptr %x, i64 6 511 %6 = load float, ptr %arrayidx10, align 8 512 %mul11 = fmul reassoc nsz arcp contract afn float %mul9, %6 513 %arrayidx12 = getelementptr inbounds float, ptr %x, i64 7 514 %7 = load float, ptr %arrayidx12, align 8 515 %mul13 = fmul reassoc nsz arcp contract afn float %mul11, %7 516 ret float %mul13 517} 518 519define fp128 @fun12_fmul(ptr %x) { 520; CHECK-LABEL: fun12_fmul: 521; CHECK: # %bb.0: # %entry 522; CHECK-NEXT: vl %v0, 0(%r3), 3 523; CHECK-NEXT: vl %v1, 16(%r3), 3 524; CHECK-NEXT: wfmxb %v0, %v0, %v1 525; CHECK-NEXT: vl %v1, 32(%r3), 3 526; CHECK-NEXT: vl %v2, 48(%r3), 3 527; CHECK-NEXT: wfmxb %v1, %v1, %v2 528; CHECK-NEXT: wfmxb %v0, %v0, %v1 529; CHECK-NEXT: vl %v1, 64(%r3), 3 530; CHECK-NEXT: vl %v2, 80(%r3), 3 531; CHECK-NEXT: wfmxb %v1, %v1, %v2 532; CHECK-NEXT: vl %v2, 96(%r3), 3 533; CHECK-NEXT: wfmxb %v1, %v1, %v2 534; CHECK-NEXT: wfmxb %v0, %v0, %v1 535; CHECK-NEXT: vl %v1, 112(%r3), 3 536; CHECK-NEXT: wfmxb %v0, %v0, %v1 537; CHECK-NEXT: vst %v0, 0(%r2), 3 538; CHECK-NEXT: br %r14 539entry: 540 %0 = load fp128, ptr %x, align 8 541 %arrayidx1 = getelementptr inbounds fp128, ptr %x, i64 1 542 %1 = load fp128, ptr %arrayidx1, align 8 543 %mul = fmul reassoc nsz arcp contract afn fp128 %0, %1 544 %arrayidx2 = getelementptr inbounds fp128, ptr %x, i64 2 545 %2 = load fp128, ptr %arrayidx2, align 8 546 %mul3 = fmul reassoc nsz arcp contract afn fp128 %mul, %2 547 %arrayidx4 = getelementptr inbounds fp128, ptr %x, i64 3 548 %3 = load fp128, ptr %arrayidx4, align 8 549 %mul5 = fmul reassoc nsz arcp contract afn fp128 %mul3, %3 550 %arrayidx6 = getelementptr inbounds fp128, ptr %x, i64 4 551 %4 = load fp128, ptr %arrayidx6, align 8 552 %mul7 = fmul reassoc nsz arcp contract afn fp128 %mul5, %4 553 %arrayidx8 = getelementptr inbounds fp128, ptr %x, i64 5 554 %5 = load fp128, ptr %arrayidx8, align 8 555 %mul9 = fmul reassoc nsz arcp contract afn fp128 %mul7, %5 556 %arrayidx10 = getelementptr inbounds fp128, ptr %x, i64 6 557 %6 = load fp128, ptr %arrayidx10, align 8 558 %mul11 = fmul reassoc nsz arcp contract afn fp128 %mul9, %6 559 %arrayidx12 = getelementptr inbounds fp128, ptr %x, i64 7 560 %7 = load fp128, ptr %arrayidx12, align 8 561 %mul13 = fmul reassoc nsz arcp contract afn fp128 %mul11, %7 562 ret fp128 %mul13 563} 564 565define <2 x double> @fun13_fmul(ptr %x) { 566; CHECK-LABEL: fun13_fmul: 567; CHECK: # %bb.0: # %entry 568; CHECK-NEXT: vl %v0, 0(%r2), 3 569; CHECK-NEXT: vl %v1, 16(%r2), 3 570; CHECK-NEXT: vfmdb %v0, %v0, %v1 571; CHECK-NEXT: vl %v1, 32(%r2), 3 572; CHECK-NEXT: vl %v2, 48(%r2), 3 573; CHECK-NEXT: vfmdb %v1, %v1, %v2 574; CHECK-NEXT: vfmdb %v0, %v0, %v1 575; CHECK-NEXT: vl %v1, 64(%r2), 3 576; CHECK-NEXT: vl %v2, 80(%r2), 3 577; CHECK-NEXT: vfmdb %v1, %v1, %v2 578; CHECK-NEXT: vl %v2, 96(%r2), 3 579; CHECK-NEXT: vfmdb %v1, %v1, %v2 580; CHECK-NEXT: vfmdb %v0, %v0, %v1 581; CHECK-NEXT: vl %v1, 112(%r2), 3 582; CHECK-NEXT: vfmdb %v24, %v0, %v1 583; CHECK-NEXT: br %r14 584entry: 585 %0 = load <2 x double>, ptr %x, align 8 586 %arrayidx1 = getelementptr inbounds <2 x double>, ptr %x, i64 1 587 %1 = load <2 x double>, ptr %arrayidx1, align 8 588 %mul = fmul reassoc nsz arcp contract afn <2 x double> %0, %1 589 %arrayidx2 = getelementptr inbounds <2 x double>, ptr %x, i64 2 590 %2 = load <2 x double>, ptr %arrayidx2, align 8 591 %mul3 = fmul reassoc nsz arcp contract afn <2 x double> %mul, %2 592 %arrayidx4 = getelementptr inbounds <2 x double>, ptr %x, i64 3 593 %3 = load <2 x double>, ptr %arrayidx4, align 8 594 %mul5 = fmul reassoc nsz arcp contract afn <2 x double> %mul3, %3 595 %arrayidx6 = getelementptr inbounds <2 x double>, ptr %x, i64 4 596 %4 = load <2 x double>, ptr %arrayidx6, align 8 597 %mul7 = fmul reassoc nsz arcp contract afn <2 x double> %mul5, %4 598 %arrayidx8 = getelementptr inbounds <2 x double>, ptr %x, i64 5 599 %5 = load <2 x double>, ptr %arrayidx8, align 8 600 %mul9 = fmul reassoc nsz arcp contract afn <2 x double> %mul7, %5 601 %arrayidx10 = getelementptr inbounds <2 x double>, ptr %x, i64 6 602 %6 = load <2 x double>, ptr %arrayidx10, align 8 603 %mul11 = fmul reassoc nsz arcp contract afn <2 x double> %mul9, %6 604 %arrayidx12 = getelementptr inbounds <2 x double>, ptr %x, i64 7 605 %7 = load <2 x double>, ptr %arrayidx12, align 8 606 %mul13 = fmul reassoc nsz arcp contract afn <2 x double> %mul11, %7 607 ret <2 x double> %mul13 608} 609 610define <4 x float> @fun14_fmul(ptr %x) { 611; CHECK-LABEL: fun14_fmul: 612; CHECK: # %bb.0: # %entry 613; CHECK-NEXT: vl %v0, 0(%r2), 3 614; CHECK-NEXT: vl %v1, 16(%r2), 3 615; CHECK-NEXT: vfmsb %v0, %v0, %v1 616; CHECK-NEXT: vl %v1, 32(%r2), 3 617; CHECK-NEXT: vl %v2, 48(%r2), 3 618; CHECK-NEXT: vfmsb %v1, %v1, %v2 619; CHECK-NEXT: vfmsb %v0, %v0, %v1 620; CHECK-NEXT: vl %v1, 64(%r2), 3 621; CHECK-NEXT: vl %v2, 80(%r2), 3 622; CHECK-NEXT: vfmsb %v1, %v1, %v2 623; CHECK-NEXT: vl %v2, 96(%r2), 3 624; CHECK-NEXT: vfmsb %v1, %v1, %v2 625; CHECK-NEXT: vfmsb %v0, %v0, %v1 626; CHECK-NEXT: vl %v1, 112(%r2), 3 627; CHECK-NEXT: vfmsb %v24, %v0, %v1 628; CHECK-NEXT: br %r14 629entry: 630 %0 = load <4 x float>, ptr %x, align 8 631 %arrayidx1 = getelementptr inbounds <4 x float>, ptr %x, i64 1 632 %1 = load <4 x float>, ptr %arrayidx1, align 8 633 %mul = fmul reassoc nsz arcp contract afn <4 x float> %0, %1 634 %arrayidx2 = getelementptr inbounds <4 x float>, ptr %x, i64 2 635 %2 = load <4 x float>, ptr %arrayidx2, align 8 636 %mul3 = fmul reassoc nsz arcp contract afn <4 x float> %mul, %2 637 %arrayidx4 = getelementptr inbounds <4 x float>, ptr %x, i64 3 638 %3 = load <4 x float>, ptr %arrayidx4, align 8 639 %mul5 = fmul reassoc nsz arcp contract afn <4 x float> %mul3, %3 640 %arrayidx6 = getelementptr inbounds <4 x float>, ptr %x, i64 4 641 %4 = load <4 x float>, ptr %arrayidx6, align 8 642 %mul7 = fmul reassoc nsz arcp contract afn <4 x float> %mul5, %4 643 %arrayidx8 = getelementptr inbounds <4 x float>, ptr %x, i64 5 644 %5 = load <4 x float>, ptr %arrayidx8, align 8 645 %mul9 = fmul reassoc nsz arcp contract afn <4 x float> %mul7, %5 646 %arrayidx10 = getelementptr inbounds <4 x float>, ptr %x, i64 6 647 %6 = load <4 x float>, ptr %arrayidx10, align 8 648 %mul11 = fmul reassoc nsz arcp contract afn <4 x float> %mul9, %6 649 %arrayidx12 = getelementptr inbounds <4 x float>, ptr %x, i64 7 650 %7 = load <4 x float>, ptr %arrayidx12, align 8 651 %mul13 = fmul reassoc nsz arcp contract afn <4 x float> %mul11, %7 652 ret <4 x float> %mul13 653} 654