
Enable MachineCombining for FP add, sub and mul. In order for this to work, the default instruction selection of reg/mem opcodes is disabled for ISD nodes that carry the flags that allow reassociation. The reg/mem folding is instead done after MachineCombiner by PeepholeOptimizer. SystemZInstrInfo optimizeLoadInstr() and foldMemoryOperandImpl() ("LoadMI version") have been implemented for this purpose also by this patch.
654 lines
28 KiB
LLVM
654 lines
28 KiB
LLVM
; 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
|
|
}
|