diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-05-09 17:45:01 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-05-09 17:45:01 +0000 |
| commit | 93bfa5af48db055bdc828864432b5a4075386958 (patch) | |
| tree | 305b456f5f7d4acf01ed3af5613b722adca98075 /llvm/lib | |
| parent | 187770dc749856ba44894e08ba806e3e4badc0f4 (diff) | |
| download | bcm5719-llvm-93bfa5af48db055bdc828864432b5a4075386958.tar.gz bcm5719-llvm-93bfa5af48db055bdc828864432b5a4075386958.zip | |
[X86][SSE] Fold add(shuffle(),shuffle()) to hadd on 'slow' targets (PR39920)
As reported on PR39920, "slow horizontal ops" targets tend to internally expand to 2*shuffle+add/sub - so if we can reduce 2*shuffle+add/sub to a hadd/sub then we should do it - similar port usage but reduced instruction count.
This works out in most cases, although the "PR22377" regression in vector-shuffle-combining.ll is annoying - going from 2*shuffle+add+shuffle to hadd+2*shuffle - I've opened PR41813 to cover this.
Differential Revision: https://reviews.llvm.org/D61308
llvm-svn: 360360
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 26619571821..fa3f61dc8c6 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -39412,7 +39412,8 @@ static bool isHorizontalBinOp(SDValue &LHS, SDValue &RHS, SelectionDAG &DAG, GetShuffle(RHS, C, D, RMask); // At least one of the operands should be a vector shuffle. - if (LMask.empty() && RMask.empty()) + unsigned NumShuffles = (LMask.empty() ? 0 : 1) + (RMask.empty() ? 0 : 1); + if (NumShuffles == 0) return false; if (LMask.empty()) { @@ -39474,7 +39475,7 @@ static bool isHorizontalBinOp(SDValue &LHS, SDValue &RHS, SelectionDAG &DAG, LHS = A.getNode() ? A : B; // If A is 'UNDEF', use B for it. RHS = B.getNode() ? B : A; // If B is 'UNDEF', use A for it. - if (!shouldUseHorizontalOp(LHS == RHS, DAG, Subtarget)) + if (!shouldUseHorizontalOp(LHS == RHS && NumShuffles < 2, DAG, Subtarget)) return false; LHS = DAG.getBitcast(VT, LHS); |

