[SLP][NFC] Assert that tree entry operands completed when scheduler looks for depende...
authorValery N Dmitriev <valery.n.dmitriev@intel.com>
Thu, 27 Feb 2020 20:50:08 +0000 (12:50 -0800)
committerValery N Dmitriev <valery.n.dmitriev@intel.com>
Fri, 28 Feb 2020 18:34:48 +0000 (10:34 -0800)
commitd723ec4f04033454e804b044137cf5e4a55dbbea
tree6b7a9a602fe2f02257ad73d829a08cd4da1d056e
parentafa45d23e9d779adac86e53f6b82dcd1df3eda9a
[SLP][NFC] Assert that tree entry operands completed when scheduler looks for dependencies.

This change adds an assertion to prevent tricky bug related to recursive
approach of building vectorization tree. For loop below takes number of
operands directly from tree entry rather than from scalars.
If the entry at this moment turns out incomplete (i.e. not all operands set)
then not all the dependencies will be seen by the scheduler.
This can lead to failed scheduling (and thus failed vectorization)
for perfectly vectorizable tree.
Here is code example which is likely to fire the assertion:
for (i : VL0->getNumOperands()) {
  ...
  TE->setOperand(i, Operands);
  buildTree_rec(Operands, Depth + 1,...);
}

Correct way is two steps process: first set all operands to a tree entry
and then recursively process each operand.

Differential Revision: https://reviews.llvm.org/D75296
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp