[llvm] f43b228 - PowerPC: Don't hoist float multiply + add to fused operation on SPE
Justin Hibbits via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 10 08:05:01 PDT 2022
Author: Justin Hibbits
Date: 2022-08-10T11:04:27-04:00
New Revision: f43b2285815961da057af1a772bc31d0152d286b
URL: https://github.com/llvm/llvm-project/commit/f43b2285815961da057af1a772bc31d0152d286b
DIFF: https://github.com/llvm/llvm-project/commit/f43b2285815961da057af1a772bc31d0152d286b.diff
LOG: PowerPC: Don't hoist float multiply + add to fused operation on SPE
SPE doesn't have a fmadd instruction, so don't bother hoisting a
multiply and add sequence to this, as it'd become just a library call.
Hoisting happens too late for the CTR usability test to veto using the
CTR in a loop, and results in an assert "Invalid PPC CTR loop!".
Added:
Modified:
llvm/lib/Target/PowerPC/PPCISelLowering.cpp
llvm/test/CodeGen/PowerPC/fma-assoc.ll
llvm/test/CodeGen/PowerPC/pr55463.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
index 8e0633fa141bb..ad347855b38e7 100644
--- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -16676,6 +16676,8 @@ bool PPCTargetLowering::isFMAFasterThanFMulAndFAdd(const MachineFunction &MF,
bool PPCTargetLowering::isFMAFasterThanFMulAndFAdd(const Function &F,
Type *Ty) const {
+ if (Subtarget.hasSPE())
+ return false;
switch (Ty->getScalarType()->getTypeID()) {
case Type::FloatTyID:
case Type::DoubleTyID:
diff --git a/llvm/test/CodeGen/PowerPC/fma-assoc.ll b/llvm/test/CodeGen/PowerPC/fma-assoc.ll
index 1c21c877e1135..94cbb0c8847be 100644
--- a/llvm/test/CodeGen/PowerPC/fma-assoc.ll
+++ b/llvm/test/CodeGen/PowerPC/fma-assoc.ll
@@ -9,6 +9,8 @@
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-ibm-aix-xcoff \
; RUN: -fp-contract=fast -mattr=+vsx -disable-ppc-vsx-fma-mutation=false \
; RUN: -mcpu=pwr7 -vec-extabi | FileCheck -check-prefix=CHECK-VSX %s
+; RUN: llc -verify-machineinstrs < %s -mtriple=powerpcspe-linux-unknown-gnu \
+; RUN: | FileCheck -check-prefix=CHECK-SPE %s
define double @test_FMADD_ASSOC1(double %A, double %B, double %C,
; CHECK-LABEL: test_FMADD_ASSOC1:
@@ -24,6 +26,22 @@ define double @test_FMADD_ASSOC1(double %A, double %B, double %C,
; CHECK-VSX-NEXT: xsmaddadp 0, 1, 2
; CHECK-VSX-NEXT: xsadddp 1, 0, 5
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_FMADD_ASSOC1:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: evmergelo 9, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: evmergelo 3, 3, 4
+; CHECK-SPE-NEXT: efdmul 4, 7, 9
+; CHECK-SPE-NEXT: efdmul 3, 3, 5
+; CHECK-SPE-NEXT: evldd 5, 8(1)
+; CHECK-SPE-NEXT: efdadd 3, 3, 4
+; CHECK-SPE-NEXT: efdadd 4, 3, 5
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul double %A, %B ; <double> [#uses=1]
%G = fmul double %C, %D ; <double> [#uses=1]
@@ -46,6 +64,22 @@ define double @test_FMADD_ASSOC2(double %A, double %B, double %C,
; CHECK-VSX-NEXT: xsmaddadp 0, 1, 2
; CHECK-VSX-NEXT: xsadddp 1, 5, 0
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_FMADD_ASSOC2:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: evmergelo 9, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: evmergelo 3, 3, 4
+; CHECK-SPE-NEXT: efdmul 4, 7, 9
+; CHECK-SPE-NEXT: efdmul 3, 3, 5
+; CHECK-SPE-NEXT: evldd 5, 8(1)
+; CHECK-SPE-NEXT: efdadd 3, 3, 4
+; CHECK-SPE-NEXT: efdadd 4, 5, 3
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul double %A, %B ; <double> [#uses=1]
%G = fmul double %C, %D ; <double> [#uses=1]
@@ -68,6 +102,22 @@ define double @test_FMSUB_ASSOC1(double %A, double %B, double %C,
; CHECK-VSX-NEXT: xsmaddadp 0, 1, 2
; CHECK-VSX-NEXT: xssubdp 1, 0, 5
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_FMSUB_ASSOC1:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: evmergelo 9, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: evmergelo 3, 3, 4
+; CHECK-SPE-NEXT: efdmul 4, 7, 9
+; CHECK-SPE-NEXT: efdmul 3, 3, 5
+; CHECK-SPE-NEXT: evldd 5, 8(1)
+; CHECK-SPE-NEXT: efdadd 3, 3, 4
+; CHECK-SPE-NEXT: efdsub 4, 3, 5
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul double %A, %B ; <double> [#uses=1]
%G = fmul double %C, %D ; <double> [#uses=1]
@@ -90,6 +140,22 @@ define double @test_FMSUB_ASSOC2(double %A, double %B, double %C,
; CHECK-VSX-NEXT: xsmaddadp 0, 1, 2
; CHECK-VSX-NEXT: xssubdp 1, 5, 0
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_FMSUB_ASSOC2:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: evmergelo 9, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: evmergelo 3, 3, 4
+; CHECK-SPE-NEXT: efdmul 4, 7, 9
+; CHECK-SPE-NEXT: efdmul 3, 3, 5
+; CHECK-SPE-NEXT: evldd 5, 8(1)
+; CHECK-SPE-NEXT: efdadd 3, 3, 4
+; CHECK-SPE-NEXT: efdsub 4, 5, 3
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul double %A, %B ; <double> [#uses=1]
%G = fmul double %C, %D ; <double> [#uses=1]
@@ -110,6 +176,21 @@ define double @test_FMADD_ASSOC_EXT1(float %A, float %B, double %C,
; CHECK-VSX-NEXT: xsmaddmdp 1, 2, 5
; CHECK-VSX-NEXT: xsmaddadp 1, 3, 4
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_FMADD_ASSOC_EXT1:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: efdmul 5, 5, 7
+; CHECK-SPE-NEXT: efdadd 3, 5, 3
+; CHECK-SPE-NEXT: efdadd 4, 3, 4
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul float %A, %B ; <float> [#uses=1]
%G = fpext float %F to double ; <double> [#uses=1]
@@ -132,6 +213,19 @@ define double @test_FMADD_ASSOC_EXT2(float %A, float %B, float %C,
; CHECK-VSX-NEXT: xsmaddadp 3, 1, 2
; CHECK-VSX-NEXT: fmr 1, 3
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_FMADD_ASSOC_EXT2:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: efsmul 4, 5, 6
+; CHECK-SPE-NEXT: efsadd 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: efdadd 4, 3, 4
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
float %D, double %E) {
%F = fmul float %A, %B ; <float> [#uses=1]
%G = fmul float %C, %D ; <float> [#uses=1]
@@ -153,6 +247,21 @@ define double @test_FMADD_ASSOC_EXT3(float %A, float %B, double %C,
; CHECK-VSX-NEXT: xsmaddmdp 1, 2, 5
; CHECK-VSX-NEXT: xsmaddadp 1, 3, 4
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_FMADD_ASSOC_EXT3:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: efdmul 5, 5, 7
+; CHECK-SPE-NEXT: efdadd 3, 5, 3
+; CHECK-SPE-NEXT: efdadd 4, 4, 3
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul float %A, %B ; <float> [#uses=1]
%G = fpext float %F to double ; <double> [#uses=1]
@@ -175,6 +284,19 @@ define double @test_FMADD_ASSOC_EXT4(float %A, float %B, float %C,
; CHECK-VSX-NEXT: xsmaddadp 3, 1, 2
; CHECK-VSX-NEXT: fmr 1, 3
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_FMADD_ASSOC_EXT4:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: efsmul 4, 5, 6
+; CHECK-SPE-NEXT: efsadd 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: efdadd 4, 4, 3
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
float %D, double %E) {
%F = fmul float %A, %B ; <float> [#uses=1]
%G = fmul float %C, %D ; <float> [#uses=1]
@@ -198,6 +320,21 @@ define double @test_FMSUB_ASSOC_EXT1(float %A, float %B, double %C,
; CHECK-VSX-NEXT: xsmaddadp 0, 3, 4
; CHECK-VSX-NEXT: xssubdp 1, 0, 5
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_FMSUB_ASSOC_EXT1:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: efdmul 5, 5, 7
+; CHECK-SPE-NEXT: efdadd 3, 5, 3
+; CHECK-SPE-NEXT: efdsub 4, 3, 4
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul float %A, %B ; <float> [#uses=1]
%G = fpext float %F to double ; <double> [#uses=1]
@@ -221,6 +358,19 @@ define double @test_FMSUB_ASSOC_EXT2(float %A, float %B, float %C,
; CHECK-VSX-NEXT: fmadds 0, 1, 2, 0
; CHECK-VSX-NEXT: xssubdp 1, 0, 5
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_FMSUB_ASSOC_EXT2:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: efsmul 4, 5, 6
+; CHECK-SPE-NEXT: efsadd 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: efdsub 4, 3, 4
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
float %D, double %E) {
%F = fmul float %A, %B ; <float> [#uses=1]
%G = fmul float %C, %D ; <float> [#uses=1]
@@ -244,6 +394,21 @@ define double @test_FMSUB_ASSOC_EXT3(float %A, float %B, double %C,
; CHECK-VSX-NEXT: xsmaddadp 0, 3, 4
; CHECK-VSX-NEXT: xssubdp 1, 5, 0
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_FMSUB_ASSOC_EXT3:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: efdmul 5, 5, 7
+; CHECK-SPE-NEXT: efdadd 3, 5, 3
+; CHECK-SPE-NEXT: efdsub 4, 4, 3
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul float %A, %B ; <float> [#uses=1]
%G = fpext float %F to double ; <double> [#uses=1]
@@ -267,6 +432,19 @@ define double @test_FMSUB_ASSOC_EXT4(float %A, float %B, float %C,
; CHECK-VSX-NEXT: fmadds 0, 1, 2, 0
; CHECK-VSX-NEXT: xssubdp 1, 5, 0
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_FMSUB_ASSOC_EXT4:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: efsmul 4, 5, 6
+; CHECK-SPE-NEXT: efsadd 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: efdsub 4, 4, 3
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
float %D, double %E) {
%F = fmul float %A, %B ; <float> [#uses=1]
%G = fmul float %C, %D ; <float> [#uses=1]
@@ -289,6 +467,22 @@ define double @test_reassoc_FMADD_ASSOC1(double %A, double %B, double %C,
; CHECK-VSX-NEXT: xsmaddadp 3, 1, 2
; CHECK-VSX-NEXT: fmr 1, 3
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_reassoc_FMADD_ASSOC1:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: evmergelo 9, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: evmergelo 3, 3, 4
+; CHECK-SPE-NEXT: efdmul 4, 7, 9
+; CHECK-SPE-NEXT: efdmul 3, 3, 5
+; CHECK-SPE-NEXT: evldd 5, 8(1)
+; CHECK-SPE-NEXT: efdadd 3, 3, 4
+; CHECK-SPE-NEXT: efdadd 4, 3, 5
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul reassoc double %A, %B ; <double> [#uses=1]
%G = fmul reassoc double %C, %D ; <double> [#uses=1]
@@ -310,6 +504,22 @@ define double @test_reassoc_FMADD_ASSOC2(double %A, double %B, double %C,
; CHECK-VSX-NEXT: xsmaddadp 3, 1, 2
; CHECK-VSX-NEXT: fmr 1, 3
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_reassoc_FMADD_ASSOC2:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: evmergelo 9, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: evmergelo 3, 3, 4
+; CHECK-SPE-NEXT: efdmul 4, 7, 9
+; CHECK-SPE-NEXT: efdmul 3, 3, 5
+; CHECK-SPE-NEXT: evldd 5, 8(1)
+; CHECK-SPE-NEXT: efdadd 3, 3, 4
+; CHECK-SPE-NEXT: efdadd 4, 5, 3
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul reassoc double %A, %B ; <double> [#uses=1]
%G = fmul reassoc double %C, %D ; <double> [#uses=1]
@@ -333,6 +543,22 @@ define double @test_reassoc_FMSUB_ASSOC1(double %A, double %B, double %C,
; CHECK-VSX-NEXT: xsmaddadp 0, 1, 2
; CHECK-VSX-NEXT: xssubdp 1, 0, 5
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_reassoc_FMSUB_ASSOC1:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: evmergelo 9, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: evmergelo 3, 3, 4
+; CHECK-SPE-NEXT: efdmul 4, 7, 9
+; CHECK-SPE-NEXT: efdmul 3, 3, 5
+; CHECK-SPE-NEXT: evldd 5, 8(1)
+; CHECK-SPE-NEXT: efdadd 3, 3, 4
+; CHECK-SPE-NEXT: efdsub 4, 3, 5
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul reassoc double %A, %B ; <double> [#uses=1]
%G = fmul reassoc double %C, %D ; <double> [#uses=1]
@@ -354,6 +580,22 @@ define double @test_reassoc_FMSUB_ASSOC11(double %A, double %B, double %C,
; CHECK-VSX-NEXT: xsmaddadp 3, 1, 2
; CHECK-VSX-NEXT: fmr 1, 3
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_reassoc_FMSUB_ASSOC11:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: evmergelo 9, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: evmergelo 3, 3, 4
+; CHECK-SPE-NEXT: efdmul 4, 7, 9
+; CHECK-SPE-NEXT: efdmul 3, 3, 5
+; CHECK-SPE-NEXT: evldd 5, 8(1)
+; CHECK-SPE-NEXT: efdadd 3, 3, 4
+; CHECK-SPE-NEXT: efdsub 4, 3, 5
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul contract reassoc double %A, %B ; <double> [#uses=1]
%G = fmul contract reassoc double %C, %D ; <double> [#uses=1]
@@ -377,6 +619,22 @@ define double @test_reassoc_FMSUB_ASSOC2(double %A, double %B, double %C,
; CHECK-VSX-NEXT: xsmaddadp 0, 1, 2
; CHECK-VSX-NEXT: xssubdp 1, 5, 0
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_reassoc_FMSUB_ASSOC2:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: evmergelo 9, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: evmergelo 3, 3, 4
+; CHECK-SPE-NEXT: efdmul 4, 7, 9
+; CHECK-SPE-NEXT: efdmul 3, 3, 5
+; CHECK-SPE-NEXT: evldd 5, 8(1)
+; CHECK-SPE-NEXT: efdadd 3, 3, 4
+; CHECK-SPE-NEXT: efdsub 4, 5, 3
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul reassoc double %A, %B ; <double> [#uses=1]
%G = fmul reassoc double %C, %D ; <double> [#uses=1]
@@ -399,6 +657,22 @@ define double @test_fast_FMSUB_ASSOC2(double %A, double %B, double %C,
; CHECK-VSX-NEXT: xsmaddadp 0, 1, 2
; CHECK-VSX-NEXT: xssubdp 1, 5, 0
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_fast_FMSUB_ASSOC2:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: evmergelo 9, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: evmergelo 3, 3, 4
+; CHECK-SPE-NEXT: efdmul 4, 7, 9
+; CHECK-SPE-NEXT: efdmul 3, 3, 5
+; CHECK-SPE-NEXT: evldd 5, 8(1)
+; CHECK-SPE-NEXT: efdadd 3, 3, 4
+; CHECK-SPE-NEXT: efdsub 4, 5, 3
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul reassoc double %A, %B ; <double> [#uses=1]
%G = fmul reassoc double %C, %D ; <double> [#uses=1]
@@ -419,6 +693,21 @@ define double @test_reassoc_FMADD_ASSOC_EXT1(float %A, float %B, double %C,
; CHECK-VSX-NEXT: xsmaddmdp 1, 2, 5
; CHECK-VSX-NEXT: xsmaddadp 1, 3, 4
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_reassoc_FMADD_ASSOC_EXT1:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: efdmul 5, 5, 7
+; CHECK-SPE-NEXT: efdadd 3, 5, 3
+; CHECK-SPE-NEXT: efdadd 4, 3, 4
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul reassoc float %A, %B ; <float> [#uses=1]
%G = fpext float %F to double ; <double> [#uses=1]
@@ -441,6 +730,19 @@ define double @test_reassoc_FMADD_ASSOC_EXT2(float %A, float %B, float %C,
; CHECK-VSX-NEXT: xsmaddadp 3, 1, 2
; CHECK-VSX-NEXT: fmr 1, 3
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_reassoc_FMADD_ASSOC_EXT2:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: efsmul 4, 5, 6
+; CHECK-SPE-NEXT: efsadd 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: efdadd 4, 3, 4
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
float %D, double %E) {
%F = fmul reassoc float %A, %B ; <float> [#uses=1]
%G = fmul reassoc float %C, %D ; <float> [#uses=1]
@@ -462,6 +764,21 @@ define double @test_reassoc_FMADD_ASSOC_EXT3(float %A, float %B, double %C,
; CHECK-VSX-NEXT: xsmaddmdp 1, 2, 5
; CHECK-VSX-NEXT: xsmaddadp 1, 3, 4
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_reassoc_FMADD_ASSOC_EXT3:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: efdmul 5, 5, 7
+; CHECK-SPE-NEXT: efdadd 3, 5, 3
+; CHECK-SPE-NEXT: efdadd 4, 4, 3
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul reassoc float %A, %B ; <float> [#uses=1]
%G = fpext float %F to double ; <double> [#uses=1]
@@ -484,6 +801,19 @@ define double @test_reassoc_FMADD_ASSOC_EXT4(float %A, float %B, float %C,
; CHECK-VSX-NEXT: xsmaddadp 3, 1, 2
; CHECK-VSX-NEXT: fmr 1, 3
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_reassoc_FMADD_ASSOC_EXT4:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: efsmul 4, 5, 6
+; CHECK-SPE-NEXT: efsadd 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: efdadd 4, 4, 3
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
float %D, double %E) {
%F = fmul reassoc float %A, %B ; <float> [#uses=1]
%G = fmul reassoc float %C, %D ; <float> [#uses=1]
@@ -505,6 +835,21 @@ define double @test_reassoc_FMSUB_ASSOC_EXT1(float %A, float %B, double %C,
; CHECK-VSX-NEXT: xsmsubmdp 1, 2, 5
; CHECK-VSX-NEXT: xsmaddadp 1, 3, 4
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_reassoc_FMSUB_ASSOC_EXT1:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: efdmul 5, 5, 7
+; CHECK-SPE-NEXT: efdadd 3, 5, 3
+; CHECK-SPE-NEXT: efdsub 4, 3, 4
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul reassoc float %A, %B ; <float> [#uses=1]
%G = fpext float %F to double ; <double> [#uses=1]
@@ -527,6 +872,19 @@ define double @test_reassoc_FMSUB_ASSOC_EXT2(float %A, float %B, float %C,
; CHECK-VSX-NEXT: xsmaddadp 3, 1, 2
; CHECK-VSX-NEXT: fmr 1, 3
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_reassoc_FMSUB_ASSOC_EXT2:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: efsmul 4, 5, 6
+; CHECK-SPE-NEXT: efsadd 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: efdsub 4, 3, 4
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
float %D, double %E) {
%F = fmul reassoc float %A, %B ; <float> [#uses=1]
%G = fmul reassoc float %C, %D ; <float> [#uses=1]
@@ -552,6 +910,21 @@ define double @test_reassoc_FMSUB_ASSOC_EXT3(float %A, float %B, double %C,
; CHECK-VSX-NEXT: xsmaddmdp 1, 2, 5
; CHECK-VSX-NEXT: xsmaddadp 1, 0, 4
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_reassoc_FMSUB_ASSOC_EXT3:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: efdmul 5, 5, 7
+; CHECK-SPE-NEXT: efdadd 3, 5, 3
+; CHECK-SPE-NEXT: efdsub 4, 4, 3
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul reassoc float %A, %B ; <float> [#uses=1]
%G = fpext float %F to double ; <double> [#uses=1]
@@ -575,6 +948,21 @@ define double @test_fast_FMSUB_ASSOC_EXT3(float %A, float %B, double %C,
; CHECK-VSX-NEXT: xsnmsubmdp 1, 2, 5
; CHECK-VSX-NEXT: xsnmsubadp 1, 3, 4
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_fast_FMSUB_ASSOC_EXT3:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 9, 10
+; CHECK-SPE-NEXT: evmergelo 7, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: evmergelo 5, 5, 6
+; CHECK-SPE-NEXT: efdmul 5, 5, 7
+; CHECK-SPE-NEXT: efdadd 3, 5, 3
+; CHECK-SPE-NEXT: efdsub 4, 4, 3
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
double %D, double %E) {
%F = fmul reassoc float %A, %B
%G = fpext float %F to double
@@ -601,6 +989,19 @@ define double @test_reassoc_FMSUB_ASSOC_EXT4(float %A, float %B, float %C,
; CHECK-VSX-NEXT: xsmaddadp 0, 1, 2
; CHECK-VSX-NEXT: fmr 1, 0
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_reassoc_FMSUB_ASSOC_EXT4:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: efsmul 4, 5, 6
+; CHECK-SPE-NEXT: efsadd 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: efdsub 4, 4, 3
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
float %D, double %E) {
%F = fmul reassoc float %A, %B ; <float> [#uses=1]
%G = fmul reassoc float %C, %D ; <float> [#uses=1]
@@ -623,6 +1024,19 @@ define double @test_fast_FMSUB_ASSOC_EXT4(float %A, float %B, float %C,
; CHECK-VSX-NEXT: xsnmsubadp 3, 1, 2
; CHECK-VSX-NEXT: fmr 1, 3
; CHECK-VSX-NEXT: blr
+;
+; CHECK-SPE-LABEL: test_fast_FMSUB_ASSOC_EXT4:
+; CHECK-SPE: # %bb.0:
+; CHECK-SPE-NEXT: efsmul 3, 3, 4
+; CHECK-SPE-NEXT: efsmul 4, 5, 6
+; CHECK-SPE-NEXT: efsadd 3, 3, 4
+; CHECK-SPE-NEXT: evmergelo 4, 7, 8
+; CHECK-SPE-NEXT: efdcfs 3, 3
+; CHECK-SPE-NEXT: efdsub 4, 4, 3
+; CHECK-SPE-NEXT: evmergehi 3, 4, 4
+; CHECK-SPE-NEXT: # kill: def $r4 killed $r4 killed $s4
+; CHECK-SPE-NEXT: # kill: def $r3 killed $r3 killed $s3
+; CHECK-SPE-NEXT: blr
float %D, double %E) {
%F = fmul reassoc float %A, %B
%G = fmul reassoc float %C, %D
diff --git a/llvm/test/CodeGen/PowerPC/pr55463.ll b/llvm/test/CodeGen/PowerPC/pr55463.ll
index d97306304f259..17767798316c5 100644
--- a/llvm/test/CodeGen/PowerPC/pr55463.ll
+++ b/llvm/test/CodeGen/PowerPC/pr55463.ll
@@ -6,44 +6,18 @@ define void @baz() #0 {
; CHECK: # %bb.0: # %bb
; CHECK-NEXT: mflr 0
; CHECK-NEXT: stw 0, 4(1)
-; CHECK-NEXT: stwu 1, -48(1)
-; CHECK-NEXT: li 3, .LCPI0_0 at l
-; CHECK-NEXT: li 5, .LCPI0_1 at l
-; CHECK-NEXT: lis 4, .LCPI0_0 at ha
-; CHECK-NEXT: lis 6, .LCPI0_1 at ha
-; CHECK-NEXT: evstdd 29, 24(1) # 8-byte Folded Spill
-; CHECK-NEXT: evstdd 30, 32(1) # 8-byte Folded Spill
-; CHECK-NEXT: evlddx 30, 4, 3
+; CHECK-NEXT: stwu 1, -16(1)
; CHECK-NEXT: # implicit-def: $r3
-; CHECK-NEXT: evlddx 29, 6, 5
-; CHECK-NEXT: evstdd 28, 16(1) # 8-byte Folded Spill
-; CHECK-NEXT: # implicit-def: $r28
; CHECK-NEXT: .p2align 4
; CHECK-NEXT: .LBB0_1: # %bb1
; CHECK-NEXT: #
-; CHECK-NEXT: efdcfsi 8, 3
-; CHECK-NEXT: mr 4, 30
-; CHECK-NEXT: mr 6, 29
-; CHECK-NEXT: evmergehi 3, 30, 30
-; CHECK-NEXT: evmergehi 5, 29, 29
-; CHECK-NEXT: # kill: def $r3 killed $r3 killed $s3
-; CHECK-NEXT: # kill: def $r5 killed $r5 killed $s5
-; CHECK-NEXT: evmergehi 7, 8, 8
-; CHECK-NEXT: # kill: def $r8 killed $r8 killed $s8
-; CHECK-NEXT: # kill: def $r7 killed $r7 killed $s7
-; CHECK-NEXT: bl fma
-; CHECK-NEXT: evmergelo 3, 3, 4
-; CHECK-NEXT: addi 28, 28, 1
-; CHECK-NEXT: cmplwi 28, 0
-; CHECK-NEXT: efdctsiz 3, 3
+; CHECK-NEXT: addi 3, 3, 1
+; CHECK-NEXT: cmplwi 3, 0
; CHECK-NEXT: bne 0, .LBB0_1
; CHECK-NEXT: # %bb.2: # %bb8
; CHECK-NEXT: bl wibble
-; CHECK-NEXT: evldd 30, 32(1) # 8-byte Folded Reload
-; CHECK-NEXT: evldd 29, 24(1) # 8-byte Folded Reload
-; CHECK-NEXT: evldd 28, 16(1) # 8-byte Folded Reload
-; CHECK-NEXT: lwz 0, 52(1)
-; CHECK-NEXT: addi 1, 1, 48
+; CHECK-NEXT: lwz 0, 20(1)
+; CHECK-NEXT: addi 1, 1, 16
; CHECK-NEXT: mtlr 0
; CHECK-NEXT: blr
bb:
More information about the llvm-commits
mailing list