; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z15 -verify-machineinstrs -O3 \
; RUN: | FileCheck %s
; Test reassociation of fp add, subtract and multiply.
define double @fun0_fadd(ptr %x) {
; CHECK-LABEL: fun0_fadd:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ld %f0, 0(%r2)
; CHECK-NEXT: adb %f0, 8(%r2)
; CHECK-NEXT: ld %f1, 24(%r2)
; CHECK-NEXT: adb %f1, 16(%r2)
; CHECK-NEXT: adbr %f0, %f1
; CHECK-NEXT: ld %f1, 40(%r2)
; CHECK-NEXT: adb %f1, 32(%r2)
; CHECK-NEXT: adb %f1, 48(%r2)
; CHECK-NEXT: adbr %f0, %f1
; CHECK-NEXT: adb %f0, 56(%r2)
; CHECK-NEXT: br %r14
entry:
%0 = load double, ptr %x, align 8
%arrayidx1 = getelementptr inbounds double, ptr %x, i64 1
%1 = load double, ptr %arrayidx1, align 8
%add = fadd reassoc nsz arcp contract afn double %1, %0
%arrayidx2 = getelementptr inbounds double, ptr %x, i64 2
%2 = load double, ptr %arrayidx2, align 8
%add3 = fadd reassoc nsz arcp contract afn double %add, %2
%arrayidx4 = getelementptr inbounds double, ptr %x, i64 3
%3 = load double, ptr %arrayidx4, align 8
%add5 = fadd reassoc nsz arcp contract afn double %add3, %3
%arrayidx6 = getelementptr inbounds double, ptr %x, i64 4
%4 = load double, ptr %arrayidx6, align 8
%add7 = fadd reassoc nsz arcp contract afn double %add5, %4
%arrayidx8 = getelementptr inbounds double, ptr %x, i64 5
%5 = load double, ptr %arrayidx8, align 8
%add9 = fadd reassoc nsz arcp contract afn double %add7, %5
%arrayidx10 = getelementptr inbounds double, ptr %x, i64 6
%6 = load double, ptr %arrayidx10, align 8
%add11 = fadd reassoc nsz arcp contract afn double %add9, %6
%arrayidx12 = getelementptr inbounds double, ptr %x, i64 7
%7 = load double, ptr %arrayidx12, align 8
%add13 = fadd reassoc nsz arcp contract afn double %add11, %7
ret double %add13
}
define float @fun1_fadd(ptr %x) {
; CHECK-LABEL: fun1_fadd:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lde %f0, 0(%r2)
; CHECK-NEXT: aeb %f0, 4(%r2)
; CHECK-NEXT: lde %f1, 12(%r2)
; CHECK-NEXT: aeb %f1, 8(%r2)
; CHECK-NEXT: aebr %f0, %f1
; CHECK-NEXT: lde %f1, 20(%r2)
; CHECK-NEXT: aeb %f1, 16(%r2)
; CHECK-NEXT: aeb %f1, 24(%r2)
; CHECK-NEXT: aebr %f0, %f1
; CHECK-NEXT: aeb %f0, 28(%r2)
; CHECK-NEXT: br %r14
entry:
%0 = load float, ptr %x, align 8
%arrayidx1 = getelementptr inbounds float, ptr %x, i64 1
%1 = load float, ptr %arrayidx1, align 8
%add = fadd reassoc nsz arcp contract afn float %1, %0
%arrayidx2 = getelementptr inbounds float, ptr %x, i64 2
%2 = load float, ptr %arrayidx2, align 8
%add3 = fadd reassoc nsz arcp contract afn float %add, %2
%arrayidx4 = getelementptr inbounds float, ptr %x, i64 3
%3 = load float, ptr %arrayidx4, align 8
%add5 = fadd reassoc nsz arcp contract afn float %add3, %3
%arrayidx6 = getelementptr inbounds float, ptr %x, i64 4
%4 = load float, ptr %arrayidx6, align 8
%add7 = fadd reassoc nsz arcp contract afn float %add5, %4
%arrayidx8 = getelementptr inbounds float, ptr %x, i64 5
%5 = load float, ptr %arrayidx8, align 8
%add9 = fadd reassoc nsz arcp contract afn float %add7, %5
%arrayidx10 = getelementptr inbounds float, ptr %x, i64 6
%6 = load float, ptr %arrayidx10, align 8
%add11 = fadd reassoc nsz arcp contract afn float %add9, %6
%arrayidx12 = getelementptr inbounds float, ptr %x, i64 7
%7 = load float, ptr %arrayidx12, align 8
%add13 = fadd reassoc nsz arcp contract afn float %add11, %7
ret float %add13
}
define fp128 @fun2_fadd(ptr %x) {
; CHECK-LABEL: fun2_fadd:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vl %v0, 0(%r3), 3
; CHECK-NEXT: vl %v1, 16(%r3), 3
; CHECK-NEXT: wfaxb %v0, %v1, %v0
; CHECK-NEXT: vl %v1, 32(%r3), 3
; CHECK-NEXT: vl %v2, 48(%r3), 3
; CHECK-NEXT: wfaxb %v1, %v1, %v2
; CHECK-NEXT: wfaxb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 64(%r3), 3
; CHECK-NEXT: vl %v2, 80(%r3), 3
; CHECK-NEXT: wfaxb %v1, %v1, %v2
; CHECK-NEXT: vl %v2, 96(%r3), 3
; CHECK-NEXT: wfaxb %v1, %v1, %v2
; CHECK-NEXT: wfaxb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 112(%r3), 3
; CHECK-NEXT: wfaxb %v0, %v0, %v1
; CHECK-NEXT: vst %v0, 0(%r2), 3
; CHECK-NEXT: br %r14
entry:
%0 = load fp128, ptr %x, align 8
%arrayidx1 = getelementptr inbounds fp128, ptr %x, i64 1
%1 = load fp128, ptr %arrayidx1, align 8
%add = fadd reassoc nsz arcp contract afn fp128 %1, %0
%arrayidx2 = getelementptr inbounds fp128, ptr %x, i64 2
%2 = load fp128, ptr %arrayidx2, align 8
%add3 = fadd reassoc nsz arcp contract afn fp128 %add, %2
%arrayidx4 = getelementptr inbounds fp128, ptr %x, i64 3
%3 = load fp128, ptr %arrayidx4, align 8
%add5 = fadd reassoc nsz arcp contract afn fp128 %add3, %3
%arrayidx6 = getelementptr inbounds fp128, ptr %x, i64 4
%4 = load fp128, ptr %arrayidx6, align 8
%add7 = fadd reassoc nsz arcp contract afn fp128 %add5, %4
%arrayidx8 = getelementptr inbounds fp128, ptr %x, i64 5
%5 = load fp128, ptr %arrayidx8, align 8
%add9 = fadd reassoc nsz arcp contract afn fp128 %add7, %5
%arrayidx10 = getelementptr inbounds fp128, ptr %x, i64 6
%6 = load fp128, ptr %arrayidx10, align 8
%add11 = fadd reassoc nsz arcp contract afn fp128 %add9, %6
%arrayidx12 = getelementptr inbounds fp128, ptr %x, i64 7
%7 = load fp128, ptr %arrayidx12, align 8
%add13 = fadd reassoc nsz arcp contract afn fp128 %add11, %7
ret fp128 %add13
}
define <2 x double> @fun3_fadd(ptr %x) {
; CHECK-LABEL: fun3_fadd:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vl %v0, 0(%r2), 3
; CHECK-NEXT: vl %v1, 16(%r2), 3
; CHECK-NEXT: vfadb %v0, %v1, %v0
; CHECK-NEXT: vl %v1, 32(%r2), 3
; CHECK-NEXT: vl %v2, 48(%r2), 3
; CHECK-NEXT: vfadb %v1, %v1, %v2
; CHECK-NEXT: vfadb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 64(%r2), 3
; CHECK-NEXT: vl %v2, 80(%r2), 3
; CHECK-NEXT: vfadb %v1, %v1, %v2
; CHECK-NEXT: vl %v2, 96(%r2), 3
; CHECK-NEXT: vfadb %v1, %v1, %v2
; CHECK-NEXT: vfadb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 112(%r2), 3
; CHECK-NEXT: vfadb %v24, %v0, %v1
; CHECK-NEXT: br %r14
entry:
%0 = load <2 x double>, ptr %x, align 8
%arrayidx1 = getelementptr inbounds <2 x double>, ptr %x, i64 1
%1 = load <2 x double>, ptr %arrayidx1, align 8
%add = fadd reassoc nsz arcp contract afn <2 x double> %1, %0
%arrayidx2 = getelementptr inbounds <2 x double>, ptr %x, i64 2
%2 = load <2 x double>, ptr %arrayidx2, align 8
%add3 = fadd reassoc nsz arcp contract afn <2 x double> %add, %2
%arrayidx4 = getelementptr inbounds <2 x double>, ptr %x, i64 3
%3 = load <2 x double>, ptr %arrayidx4, align 8
%add5 = fadd reassoc nsz arcp contract afn <2 x double> %add3, %3
%arrayidx6 = getelementptr inbounds <2 x double>, ptr %x, i64 4
%4 = load <2 x double>, ptr %arrayidx6, align 8
%add7 = fadd reassoc nsz arcp contract afn <2 x double> %add5, %4
%arrayidx8 = getelementptr inbounds <2 x double>, ptr %x, i64 5
%5 = load <2 x double>, ptr %arrayidx8, align 8
%add9 = fadd reassoc nsz arcp contract afn <2 x double> %add7, %5
%arrayidx10 = getelementptr inbounds <2 x double>, ptr %x, i64 6
%6 = load <2 x double>, ptr %arrayidx10, align 8
%add11 = fadd reassoc nsz arcp contract afn <2 x double> %add9, %6
%arrayidx12 = getelementptr inbounds <2 x double>, ptr %x, i64 7
%7 = load <2 x double>, ptr %arrayidx12, align 8
%add13 = fadd reassoc nsz arcp contract afn <2 x double> %add11, %7
ret <2 x double> %add13
}
define <4 x float> @fun4_fadd(ptr %x) {
; CHECK-LABEL: fun4_fadd:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vl %v0, 0(%r2), 3
; CHECK-NEXT: vl %v1, 16(%r2), 3
; CHECK-NEXT: vfasb %v0, %v1, %v0
; CHECK-NEXT: vl %v1, 32(%r2), 3
; CHECK-NEXT: vl %v2, 48(%r2), 3
; CHECK-NEXT: vfasb %v1, %v1, %v2
; CHECK-NEXT: vfasb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 64(%r2), 3
; CHECK-NEXT: vl %v2, 80(%r2), 3
; CHECK-NEXT: vfasb %v1, %v1, %v2
; CHECK-NEXT: vl %v2, 96(%r2), 3
; CHECK-NEXT: vfasb %v1, %v1, %v2
; CHECK-NEXT: vfasb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 112(%r2), 3
; CHECK-NEXT: vfasb %v24, %v0, %v1
; CHECK-NEXT: br %r14
entry:
%0 = load <4 x float>, ptr %x, align 8
%arrayidx1 = getelementptr inbounds <4 x float>, ptr %x, i64 1
%1 = load <4 x float>, ptr %arrayidx1, align 8
%add = fadd reassoc nsz arcp contract afn <4 x float> %1, %0
%arrayidx2 = getelementptr inbounds <4 x float>, ptr %x, i64 2
%2 = load <4 x float>, ptr %arrayidx2, align 8
%add3 = fadd reassoc nsz arcp contract afn <4 x float> %add, %2
%arrayidx4 = getelementptr inbounds <4 x float>, ptr %x, i64 3
%3 = load <4 x float>, ptr %arrayidx4, align 8
%add5 = fadd reassoc nsz arcp contract afn <4 x float> %add3, %3
%arrayidx6 = getelementptr inbounds <4 x float>, ptr %x, i64 4
%4 = load <4 x float>, ptr %arrayidx6, align 8
%add7 = fadd reassoc nsz arcp contract afn <4 x float> %add5, %4
%arrayidx8 = getelementptr inbounds <4 x float>, ptr %x, i64 5
%5 = load <4 x float>, ptr %arrayidx8, align 8
%add9 = fadd reassoc nsz arcp contract afn <4 x float> %add7, %5
%arrayidx10 = getelementptr inbounds <4 x float>, ptr %x, i64 6
%6 = load <4 x float>, ptr %arrayidx10, align 8
%add11 = fadd reassoc nsz arcp contract afn <4 x float> %add9, %6
%arrayidx12 = getelementptr inbounds <4 x float>, ptr %x, i64 7
%7 = load <4 x float>, ptr %arrayidx12, align 8
%add13 = fadd reassoc nsz arcp contract afn <4 x float> %add11, %7
ret <4 x float> %add13
}
define double @fun5_fsub(ptr %x) {
; CHECK-LABEL: fun5_fsub:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ld %f0, 0(%r2)
; CHECK-NEXT: sdb %f0, 8(%r2)
; CHECK-NEXT: ld %f1, 24(%r2)
; CHECK-NEXT: adb %f1, 16(%r2)
; CHECK-NEXT: sdbr %f0, %f1
; CHECK-NEXT: ld %f1, 40(%r2)
; CHECK-NEXT: adb %f1, 32(%r2)
; CHECK-NEXT: adb %f1, 48(%r2)
; CHECK-NEXT: sdbr %f0, %f1
; CHECK-NEXT: sdb %f0, 56(%r2)
; CHECK-NEXT: br %r14
entry:
%0 = load double, ptr %x, align 8
%arrayidx1 = getelementptr inbounds double, ptr %x, i64 1
%1 = load double, ptr %arrayidx1, align 8
%sub = fsub reassoc nsz arcp contract afn double %0, %1
%arrayidx2 = getelementptr inbounds double, ptr %x, i64 2
%2 = load double, ptr %arrayidx2, align 8
%sub3 = fsub reassoc nsz arcp contract afn double %sub, %2
%arrayidx4 = getelementptr inbounds double, ptr %x, i64 3
%3 = load double, ptr %arrayidx4, align 8
%sub5 = fsub reassoc nsz arcp contract afn double %sub3, %3
%arrayidx6 = getelementptr inbounds double, ptr %x, i64 4
%4 = load double, ptr %arrayidx6, align 8
%sub7 = fsub reassoc nsz arcp contract afn double %sub5, %4
%arrayidx8 = getelementptr inbounds double, ptr %x, i64 5
%5 = load double, ptr %arrayidx8, align 8
%sub9 = fsub reassoc nsz arcp contract afn double %sub7, %5
%arrayidx10 = getelementptr inbounds double, ptr %x, i64 6
%6 = load double, ptr %arrayidx10, align 8
%sub11 = fsub reassoc nsz arcp contract afn double %sub9, %6
%arrayidx12 = getelementptr inbounds double, ptr %x, i64 7
%7 = load double, ptr %arrayidx12, align 8
%sub13 = fsub reassoc nsz arcp contract afn double %sub11, %7
ret double %sub13
}
define float @fun6_fsub(ptr %x) {
; CHECK-LABEL: fun6_fsub:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lde %f0, 0(%r2)
; CHECK-NEXT: seb %f0, 4(%r2)
; CHECK-NEXT: lde %f1, 12(%r2)
; CHECK-NEXT: aeb %f1, 8(%r2)
; CHECK-NEXT: sebr %f0, %f1
; CHECK-NEXT: lde %f1, 20(%r2)
; CHECK-NEXT: aeb %f1, 16(%r2)
; CHECK-NEXT: aeb %f1, 24(%r2)
; CHECK-NEXT: sebr %f0, %f1
; CHECK-NEXT: seb %f0, 28(%r2)
; CHECK-NEXT: br %r14
entry:
%0 = load float, ptr %x, align 8
%arrayidx1 = getelementptr inbounds float, ptr %x, i64 1
%1 = load float, ptr %arrayidx1, align 8
%sub = fsub reassoc nsz arcp contract afn float %0, %1
%arrayidx2 = getelementptr inbounds float, ptr %x, i64 2
%2 = load float, ptr %arrayidx2, align 8
%sub3 = fsub reassoc nsz arcp contract afn float %sub, %2
%arrayidx4 = getelementptr inbounds float, ptr %x, i64 3
%3 = load float, ptr %arrayidx4, align 8
%sub5 = fsub reassoc nsz arcp contract afn float %sub3, %3
%arrayidx6 = getelementptr inbounds float, ptr %x, i64 4
%4 = load float, ptr %arrayidx6, align 8
%sub7 = fsub reassoc nsz arcp contract afn float %sub5, %4
%arrayidx8 = getelementptr inbounds float, ptr %x, i64 5
%5 = load float, ptr %arrayidx8, align 8
%sub9 = fsub reassoc nsz arcp contract afn float %sub7, %5
%arrayidx10 = getelementptr inbounds float, ptr %x, i64 6
%6 = load float, ptr %arrayidx10, align 8
%sub11 = fsub reassoc nsz arcp contract afn float %sub9, %6
%arrayidx12 = getelementptr inbounds float, ptr %x, i64 7
%7 = load float, ptr %arrayidx12, align 8
%sub13 = fsub reassoc nsz arcp contract afn float %sub11, %7
ret float %sub13
}
define fp128 @fun7_fsub(ptr %x) {
; CHECK-LABEL: fun7_fsub:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vl %v0, 0(%r3), 3
; CHECK-NEXT: vl %v1, 16(%r3), 3
; CHECK-NEXT: wfsxb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 32(%r3), 3
; CHECK-NEXT: vl %v2, 48(%r3), 3
; CHECK-NEXT: wfaxb %v1, %v1, %v2
; CHECK-NEXT: wfsxb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 64(%r3), 3
; CHECK-NEXT: vl %v2, 80(%r3), 3
; CHECK-NEXT: wfaxb %v1, %v1, %v2
; CHECK-NEXT: vl %v2, 96(%r3), 3
; CHECK-NEXT: wfaxb %v1, %v1, %v2
; CHECK-NEXT: wfsxb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 112(%r3), 3
; CHECK-NEXT: wfsxb %v0, %v0, %v1
; CHECK-NEXT: vst %v0, 0(%r2), 3
; CHECK-NEXT: br %r14
entry:
%0 = load fp128, ptr %x, align 8
%arrayidx1 = getelementptr inbounds fp128, ptr %x, i64 1
%1 = load fp128, ptr %arrayidx1, align 8
%sub = fsub reassoc nsz arcp contract afn fp128 %0, %1
%arrayidx2 = getelementptr inbounds fp128, ptr %x, i64 2
%2 = load fp128, ptr %arrayidx2, align 8
%sub3 = fsub reassoc nsz arcp contract afn fp128 %sub, %2
%arrayidx4 = getelementptr inbounds fp128, ptr %x, i64 3
%3 = load fp128, ptr %arrayidx4, align 8
%sub5 = fsub reassoc nsz arcp contract afn fp128 %sub3, %3
%arrayidx6 = getelementptr inbounds fp128, ptr %x, i64 4
%4 = load fp128, ptr %arrayidx6, align 8
%sub7 = fsub reassoc nsz arcp contract afn fp128 %sub5, %4
%arrayidx8 = getelementptr inbounds fp128, ptr %x, i64 5
%5 = load fp128, ptr %arrayidx8, align 8
%sub9 = fsub reassoc nsz arcp contract afn fp128 %sub7, %5
%arrayidx10 = getelementptr inbounds fp128, ptr %x, i64 6
%6 = load fp128, ptr %arrayidx10, align 8
%sub11 = fsub reassoc nsz arcp contract afn fp128 %sub9, %6
%arrayidx12 = getelementptr inbounds fp128, ptr %x, i64 7
%7 = load fp128, ptr %arrayidx12, align 8
%sub13 = fsub reassoc nsz arcp contract afn fp128 %sub11, %7
ret fp128 %sub13
}
define <2 x double> @fun8_fsub(ptr %x) {
; CHECK-LABEL: fun8_fsub:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vl %v0, 0(%r2), 3
; CHECK-NEXT: vl %v1, 16(%r2), 3
; CHECK-NEXT: vfsdb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 32(%r2), 3
; CHECK-NEXT: vl %v2, 48(%r2), 3
; CHECK-NEXT: vfadb %v1, %v1, %v2
; CHECK-NEXT: vfsdb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 64(%r2), 3
; CHECK-NEXT: vl %v2, 80(%r2), 3
; CHECK-NEXT: vfadb %v1, %v1, %v2
; CHECK-NEXT: vl %v2, 96(%r2), 3
; CHECK-NEXT: vfadb %v1, %v1, %v2
; CHECK-NEXT: vfsdb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 112(%r2), 3
; CHECK-NEXT: vfsdb %v24, %v0, %v1
; CHECK-NEXT: br %r14
entry:
%0 = load <2 x double>, ptr %x, align 8
%arrayidx1 = getelementptr inbounds <2 x double>, ptr %x, i64 1
%1 = load <2 x double>, ptr %arrayidx1, align 8
%sub = fsub reassoc nsz arcp contract afn <2 x double> %0, %1
%arrayidx2 = getelementptr inbounds <2 x double>, ptr %x, i64 2
%2 = load <2 x double>, ptr %arrayidx2, align 8
%sub3 = fsub reassoc nsz arcp contract afn <2 x double> %sub, %2
%arrayidx4 = getelementptr inbounds <2 x double>, ptr %x, i64 3
%3 = load <2 x double>, ptr %arrayidx4, align 8
%sub5 = fsub reassoc nsz arcp contract afn <2 x double> %sub3, %3
%arrayidx6 = getelementptr inbounds <2 x double>, ptr %x, i64 4
%4 = load <2 x double>, ptr %arrayidx6, align 8
%sub7 = fsub reassoc nsz arcp contract afn <2 x double> %sub5, %4
%arrayidx8 = getelementptr inbounds <2 x double>, ptr %x, i64 5
%5 = load <2 x double>, ptr %arrayidx8, align 8
%sub9 = fsub reassoc nsz arcp contract afn <2 x double> %sub7, %5
%arrayidx10 = getelementptr inbounds <2 x double>, ptr %x, i64 6
%6 = load <2 x double>, ptr %arrayidx10, align 8
%sub11 = fsub reassoc nsz arcp contract afn <2 x double> %sub9, %6
%arrayidx12 = getelementptr inbounds <2 x double>, ptr %x, i64 7
%7 = load <2 x double>, ptr %arrayidx12, align 8
%sub13 = fsub reassoc nsz arcp contract afn <2 x double> %sub11, %7
ret <2 x double> %sub13
}
define <4 x float> @fun9_fsub(ptr %x) {
; CHECK-LABEL: fun9_fsub:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vl %v0, 0(%r2), 3
; CHECK-NEXT: vl %v1, 16(%r2), 3
; CHECK-NEXT: vfssb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 32(%r2), 3
; CHECK-NEXT: vl %v2, 48(%r2), 3
; CHECK-NEXT: vfasb %v1, %v1, %v2
; CHECK-NEXT: vfssb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 64(%r2), 3
; CHECK-NEXT: vl %v2, 80(%r2), 3
; CHECK-NEXT: vfasb %v1, %v1, %v2
; CHECK-NEXT: vl %v2, 96(%r2), 3
; CHECK-NEXT: vfasb %v1, %v1, %v2
; CHECK-NEXT: vfssb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 112(%r2), 3
; CHECK-NEXT: vfssb %v24, %v0, %v1
; CHECK-NEXT: br %r14
entry:
%0 = load <4 x float>, ptr %x, align 8
%arrayidx1 = getelementptr inbounds <4 x float>, ptr %x, i64 1
%1 = load <4 x float>, ptr %arrayidx1, align 8
%sub = fsub reassoc nsz arcp contract afn <4 x float> %0, %1
%arrayidx2 = getelementptr inbounds <4 x float>, ptr %x, i64 2
%2 = load <4 x float>, ptr %arrayidx2, align 8
%sub3 = fsub reassoc nsz arcp contract afn <4 x float> %sub, %2
%arrayidx4 = getelementptr inbounds <4 x float>, ptr %x, i64 3
%3 = load <4 x float>, ptr %arrayidx4, align 8
%sub5 = fsub reassoc nsz arcp contract afn <4 x float> %sub3, %3
%arrayidx6 = getelementptr inbounds <4 x float>, ptr %x, i64 4
%4 = load <4 x float>, ptr %arrayidx6, align 8
%sub7 = fsub reassoc nsz arcp contract afn <4 x float> %sub5, %4
%arrayidx8 = getelementptr inbounds <4 x float>, ptr %x, i64 5
%5 = load <4 x float>, ptr %arrayidx8, align 8
%sub9 = fsub reassoc nsz arcp contract afn <4 x float> %sub7, %5
%arrayidx10 = getelementptr inbounds <4 x float>, ptr %x, i64 6
%6 = load <4 x float>, ptr %arrayidx10, align 8
%sub11 = fsub reassoc nsz arcp contract afn <4 x float> %sub9, %6
%arrayidx12 = getelementptr inbounds <4 x float>, ptr %x, i64 7
%7 = load <4 x float>, ptr %arrayidx12, align 8
%sub13 = fsub reassoc nsz arcp contract afn <4 x float> %sub11, %7
ret <4 x float> %sub13
}
define double @fun10_fmul(ptr %x) {
; CHECK-LABEL: fun10_fmul:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: ld %f0, 8(%r2)
; CHECK-NEXT: mdb %f0, 0(%r2)
; CHECK-NEXT: ld %f1, 24(%r2)
; CHECK-NEXT: mdb %f1, 16(%r2)
; CHECK-NEXT: mdbr %f0, %f1
; CHECK-NEXT: ld %f1, 40(%r2)
; CHECK-NEXT: mdb %f1, 32(%r2)
; CHECK-NEXT: mdb %f1, 48(%r2)
; CHECK-NEXT: mdbr %f0, %f1
; CHECK-NEXT: mdb %f0, 56(%r2)
; CHECK-NEXT: br %r14
entry:
%0 = load double, ptr %x, align 8
%arrayidx1 = getelementptr inbounds double, ptr %x, i64 1
%1 = load double, ptr %arrayidx1, align 8
%mul = fmul reassoc nsz arcp contract afn double %0, %1
%arrayidx2 = getelementptr inbounds double, ptr %x, i64 2
%2 = load double, ptr %arrayidx2, align 8
%mul3 = fmul reassoc nsz arcp contract afn double %mul, %2
%arrayidx4 = getelementptr inbounds double, ptr %x, i64 3
%3 = load double, ptr %arrayidx4, align 8
%mul5 = fmul reassoc nsz arcp contract afn double %mul3, %3
%arrayidx6 = getelementptr inbounds double, ptr %x, i64 4
%4 = load double, ptr %arrayidx6, align 8
%mul7 = fmul reassoc nsz arcp contract afn double %mul5, %4
%arrayidx8 = getelementptr inbounds double, ptr %x, i64 5
%5 = load double, ptr %arrayidx8, align 8
%mul9 = fmul reassoc nsz arcp contract afn double %mul7, %5
%arrayidx10 = getelementptr inbounds double, ptr %x, i64 6
%6 = load double, ptr %arrayidx10, align 8
%mul11 = fmul reassoc nsz arcp contract afn double %mul9, %6
%arrayidx12 = getelementptr inbounds double, ptr %x, i64 7
%7 = load double, ptr %arrayidx12, align 8
%mul13 = fmul reassoc nsz arcp contract afn double %mul11, %7
ret double %mul13
}
define float @fun11_fmul(ptr %x) {
; CHECK-LABEL: fun11_fmul:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: lde %f0, 4(%r2)
; CHECK-NEXT: meeb %f0, 0(%r2)
; CHECK-NEXT: lde %f1, 12(%r2)
; CHECK-NEXT: meeb %f1, 8(%r2)
; CHECK-NEXT: meebr %f0, %f1
; CHECK-NEXT: lde %f1, 20(%r2)
; CHECK-NEXT: meeb %f1, 16(%r2)
; CHECK-NEXT: meeb %f1, 24(%r2)
; CHECK-NEXT: meebr %f0, %f1
; CHECK-NEXT: meeb %f0, 28(%r2)
; CHECK-NEXT: br %r14
entry:
%0 = load float, ptr %x, align 8
%arrayidx1 = getelementptr inbounds float, ptr %x, i64 1
%1 = load float, ptr %arrayidx1, align 8
%mul = fmul reassoc nsz arcp contract afn float %0, %1
%arrayidx2 = getelementptr inbounds float, ptr %x, i64 2
%2 = load float, ptr %arrayidx2, align 8
%mul3 = fmul reassoc nsz arcp contract afn float %mul, %2
%arrayidx4 = getelementptr inbounds float, ptr %x, i64 3
%3 = load float, ptr %arrayidx4, align 8
%mul5 = fmul reassoc nsz arcp contract afn float %mul3, %3
%arrayidx6 = getelementptr inbounds float, ptr %x, i64 4
%4 = load float, ptr %arrayidx6, align 8
%mul7 = fmul reassoc nsz arcp contract afn float %mul5, %4
%arrayidx8 = getelementptr inbounds float, ptr %x, i64 5
%5 = load float, ptr %arrayidx8, align 8
%mul9 = fmul reassoc nsz arcp contract afn float %mul7, %5
%arrayidx10 = getelementptr inbounds float, ptr %x, i64 6
%6 = load float, ptr %arrayidx10, align 8
%mul11 = fmul reassoc nsz arcp contract afn float %mul9, %6
%arrayidx12 = getelementptr inbounds float, ptr %x, i64 7
%7 = load float, ptr %arrayidx12, align 8
%mul13 = fmul reassoc nsz arcp contract afn float %mul11, %7
ret float %mul13
}
define fp128 @fun12_fmul(ptr %x) {
; CHECK-LABEL: fun12_fmul:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vl %v0, 0(%r3), 3
; CHECK-NEXT: vl %v1, 16(%r3), 3
; CHECK-NEXT: wfmxb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 32(%r3), 3
; CHECK-NEXT: vl %v2, 48(%r3), 3
; CHECK-NEXT: wfmxb %v1, %v1, %v2
; CHECK-NEXT: wfmxb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 64(%r3), 3
; CHECK-NEXT: vl %v2, 80(%r3), 3
; CHECK-NEXT: wfmxb %v1, %v1, %v2
; CHECK-NEXT: vl %v2, 96(%r3), 3
; CHECK-NEXT: wfmxb %v1, %v1, %v2
; CHECK-NEXT: wfmxb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 112(%r3), 3
; CHECK-NEXT: wfmxb %v0, %v0, %v1
; CHECK-NEXT: vst %v0, 0(%r2), 3
; CHECK-NEXT: br %r14
entry:
%0 = load fp128, ptr %x, align 8
%arrayidx1 = getelementptr inbounds fp128, ptr %x, i64 1
%1 = load fp128, ptr %arrayidx1, align 8
%mul = fmul reassoc nsz arcp contract afn fp128 %0, %1
%arrayidx2 = getelementptr inbounds fp128, ptr %x, i64 2
%2 = load fp128, ptr %arrayidx2, align 8
%mul3 = fmul reassoc nsz arcp contract afn fp128 %mul, %2
%arrayidx4 = getelementptr inbounds fp128, ptr %x, i64 3
%3 = load fp128, ptr %arrayidx4, align 8
%mul5 = fmul reassoc nsz arcp contract afn fp128 %mul3, %3
%arrayidx6 = getelementptr inbounds fp128, ptr %x, i64 4
%4 = load fp128, ptr %arrayidx6, align 8
%mul7 = fmul reassoc nsz arcp contract afn fp128 %mul5, %4
%arrayidx8 = getelementptr inbounds fp128, ptr %x, i64 5
%5 = load fp128, ptr %arrayidx8, align 8
%mul9 = fmul reassoc nsz arcp contract afn fp128 %mul7, %5
%arrayidx10 = getelementptr inbounds fp128, ptr %x, i64 6
%6 = load fp128, ptr %arrayidx10, align 8
%mul11 = fmul reassoc nsz arcp contract afn fp128 %mul9, %6
%arrayidx12 = getelementptr inbounds fp128, ptr %x, i64 7
%7 = load fp128, ptr %arrayidx12, align 8
%mul13 = fmul reassoc nsz arcp contract afn fp128 %mul11, %7
ret fp128 %mul13
}
define <2 x double> @fun13_fmul(ptr %x) {
; CHECK-LABEL: fun13_fmul:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vl %v0, 0(%r2), 3
; CHECK-NEXT: vl %v1, 16(%r2), 3
; CHECK-NEXT: vfmdb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 32(%r2), 3
; CHECK-NEXT: vl %v2, 48(%r2), 3
; CHECK-NEXT: vfmdb %v1, %v1, %v2
; CHECK-NEXT: vfmdb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 64(%r2), 3
; CHECK-NEXT: vl %v2, 80(%r2), 3
; CHECK-NEXT: vfmdb %v1, %v1, %v2
; CHECK-NEXT: vl %v2, 96(%r2), 3
; CHECK-NEXT: vfmdb %v1, %v1, %v2
; CHECK-NEXT: vfmdb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 112(%r2), 3
; CHECK-NEXT: vfmdb %v24, %v0, %v1
; CHECK-NEXT: br %r14
entry:
%0 = load <2 x double>, ptr %x, align 8
%arrayidx1 = getelementptr inbounds <2 x double>, ptr %x, i64 1
%1 = load <2 x double>, ptr %arrayidx1, align 8
%mul = fmul reassoc nsz arcp contract afn <2 x double> %0, %1
%arrayidx2 = getelementptr inbounds <2 x double>, ptr %x, i64 2
%2 = load <2 x double>, ptr %arrayidx2, align 8
%mul3 = fmul reassoc nsz arcp contract afn <2 x double> %mul, %2
%arrayidx4 = getelementptr inbounds <2 x double>, ptr %x, i64 3
%3 = load <2 x double>, ptr %arrayidx4, align 8
%mul5 = fmul reassoc nsz arcp contract afn <2 x double> %mul3, %3
%arrayidx6 = getelementptr inbounds <2 x double>, ptr %x, i64 4
%4 = load <2 x double>, ptr %arrayidx6, align 8
%mul7 = fmul reassoc nsz arcp contract afn <2 x double> %mul5, %4
%arrayidx8 = getelementptr inbounds <2 x double>, ptr %x, i64 5
%5 = load <2 x double>, ptr %arrayidx8, align 8
%mul9 = fmul reassoc nsz arcp contract afn <2 x double> %mul7, %5
%arrayidx10 = getelementptr inbounds <2 x double>, ptr %x, i64 6
%6 = load <2 x double>, ptr %arrayidx10, align 8
%mul11 = fmul reassoc nsz arcp contract afn <2 x double> %mul9, %6
%arrayidx12 = getelementptr inbounds <2 x double>, ptr %x, i64 7
%7 = load <2 x double>, ptr %arrayidx12, align 8
%mul13 = fmul reassoc nsz arcp contract afn <2 x double> %mul11, %7
ret <2 x double> %mul13
}
define <4 x float> @fun14_fmul(ptr %x) {
; CHECK-LABEL: fun14_fmul:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vl %v0, 0(%r2), 3
; CHECK-NEXT: vl %v1, 16(%r2), 3
; CHECK-NEXT: vfmsb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 32(%r2), 3
; CHECK-NEXT: vl %v2, 48(%r2), 3
; CHECK-NEXT: vfmsb %v1, %v1, %v2
; CHECK-NEXT: vfmsb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 64(%r2), 3
; CHECK-NEXT: vl %v2, 80(%r2), 3
; CHECK-NEXT: vfmsb %v1, %v1, %v2
; CHECK-NEXT: vl %v2, 96(%r2), 3
; CHECK-NEXT: vfmsb %v1, %v1, %v2
; CHECK-NEXT: vfmsb %v0, %v0, %v1
; CHECK-NEXT: vl %v1, 112(%r2), 3
; CHECK-NEXT: vfmsb %v24, %v0, %v1
; CHECK-NEXT: br %r14
entry:
%0 = load <4 x float>, ptr %x, align 8
%arrayidx1 = getelementptr inbounds <4 x float>, ptr %x, i64 1
%1 = load <4 x float>, ptr %arrayidx1, align 8
%mul = fmul reassoc nsz arcp contract afn <4 x float> %0, %1
%arrayidx2 = getelementptr inbounds <4 x float>, ptr %x, i64 2
%2 = load <4 x float>, ptr %arrayidx2, align 8
%mul3 = fmul reassoc nsz arcp contract afn <4 x float> %mul, %2
%arrayidx4 = getelementptr inbounds <4 x float>, ptr %x, i64 3
%3 = load <4 x float>, ptr %arrayidx4, align 8
%mul5 = fmul reassoc nsz arcp contract afn <4 x float> %mul3, %3
%arrayidx6 = getelementptr inbounds <4 x float>, ptr %x, i64 4
%4 = load <4 x float>, ptr %arrayidx6, align 8
%mul7 = fmul reassoc nsz arcp contract afn <4 x float> %mul5, %4
%arrayidx8 = getelementptr inbounds <4 x float>, ptr %x, i64 5
%5 = load <4 x float>, ptr %arrayidx8, align 8
%mul9 = fmul reassoc nsz arcp contract afn <4 x float> %mul7, %5
%arrayidx10 = getelementptr inbounds <4 x float>, ptr %x, i64 6
%6 = load <4 x float>, ptr %arrayidx10, align 8
%mul11 = fmul reassoc nsz arcp contract afn <4 x float> %mul9, %6
%arrayidx12 = getelementptr inbounds <4 x float>, ptr %x, i64 7
%7 = load <4 x float>, ptr %arrayidx12, align 8
%mul13 = fmul reassoc nsz arcp contract afn <4 x float> %mul11, %7
ret <4 x float> %mul13
}