[SLP] Allow reordering of vectorization trees with reused instructions.
authorAlexey Bataev <a.bataev@hotmail.com>
Thu, 17 Sep 2020 15:24:00 +0000 (11:24 -0400)
committerAlexey Bataev <a.bataev@hotmail.com>
Fri, 18 Sep 2020 13:34:59 +0000 (09:34 -0400)
commit455ca0ebb69210046928fedffe292420a30f89ad
tree96ca36a4ee1d78a97594f981d57aae7b21d43a5b
parentae36c02ad0cb0a618c8715404dcfab4cf49c6612
[SLP] Allow reordering of vectorization trees with reused instructions.

If some leaves have the same instructions to be vectorized, we may
incorrectly evaluate the best order for the root node (it is built for the
vector of instructions without repeated instructions and, thus, has less
elements than the root node). In this case we just can not try to reorder
the tree + we may calculate the wrong number of nodes that requre the
same reordering.
For example, if the root node is \<a+b, a+c, a+d, f+e\>, then the leaves
are \<a, a, a, f\> and \<b, c, d, e\>. When we try to vectorize the first
leaf, it will be shrink to \<a, b\>. If instructions in this leaf should
be reordered, the best order will be \<1, 0\>. We need to extend this
order for the root node. For the root node this order should look like
\<3, 0, 1, 2\>. This patch allows extension of the orders of the nodes
with the reused instructions.

Reviewed By: RKSimon

Differential Revision: https://reviews.llvm.org/D45263
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
llvm/test/Transforms/SLPVectorizer/X86/jumbled_store_crash.ll
llvm/test/Transforms/SLPVectorizer/X86/reorder_repeated_ops.ll
llvm/test/Transforms/SLPVectorizer/X86/vectorize-reorder-reuse.ll