[PATCH] D53037: [InstCombine] combine a shuffle and an extract subvector shuffle
Sanjay Patel via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 5 11:58:12 PST 2019
spatel added a comment.
In D53037#1385727 <https://reviews.llvm.org/D53037#1385727>, @efriedma wrote:
> That case is specifically interesting because when it's split, each half is lowered to a different shuffle, and both shuffles are expensive.
>
> Obviously you could try to find that specific pattern in SelectionDAG on AArch64, but I'm not sure it makes sense to expect the backend to try; instcombine probably shouldn't be creating difficult-to-solve optimization puzzles.
The goal for this patch was to make things easier for the backend, but I didn't think of this case of course. How about limiting the transform like this:
Index: InstCombine/InstCombineVectorOps.cpp
===================================================================
--- InstCombine/InstCombineVectorOps.cpp (revision 353169)
+++ InstCombine/InstCombineVectorOps.cpp (working copy)
@@ -1498,6 +1498,11 @@
if (!match(Op0, m_ShuffleVector(m_Value(X), m_Value(Y), m_Constant(Mask))))
return nullptr;
+ // Be extra conservative with shuffle transforms. If we can't kill the 1st
+ // shuffle, then combining may result in worse codegen.
+ if (!Op0->hasOneUse())
+ return nullptr;
+
// We are extracting a subvector from a shuffle. Remove excess elements from
// the 1st shuffle mask to eliminate the extract.
//
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D53037/new/
https://reviews.llvm.org/D53037
More information about the llvm-commits
mailing list