mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-13 22:24:07 +00:00
SLPVectorizer: An in-tree vectorized entry cannot also be a scalar external use
We were creating external uses for scalar values in MustGather entries that also had a ScalarToTreeEntry (they also are present in a vectorized tuple). This meant we would keep a value 'alive' as a scalar and vectorized causing havoc. This is not necessary because when we create a MustGather vector we explicitly create external uses entries for the insertelement instructions of the MustGather vector elements. Fixes PR18129. radar://15582184 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196508 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -564,10 +564,8 @@ void BoUpSLP::buildTree(ArrayRef<Value *> Roots, ValueSet *Rdx) {
|
||||
UE = Scalar->use_end(); User != UE; ++User) {
|
||||
DEBUG(dbgs() << "SLP: Checking user:" << **User << ".\n");
|
||||
|
||||
bool Gathered = MustGather.count(*User);
|
||||
|
||||
// Skip in-tree scalars that become vectors.
|
||||
if (ScalarToTreeEntry.count(*User) && !Gathered) {
|
||||
if (ScalarToTreeEntry.count(*User)) {
|
||||
DEBUG(dbgs() << "SLP: \tInternal user will be removed:" <<
|
||||
**User << ".\n");
|
||||
int Idx = ScalarToTreeEntry[*User]; (void) Idx;
|
||||
@ -1641,8 +1639,6 @@ Value *BoUpSLP::vectorizeTree() {
|
||||
for (Value::use_iterator User = Scalar->use_begin(),
|
||||
UE = Scalar->use_end(); User != UE; ++User) {
|
||||
DEBUG(dbgs() << "SLP: \tvalidating user:" << **User << ".\n");
|
||||
assert(!MustGather.count(*User) &&
|
||||
"Replacing gathered value with undef");
|
||||
|
||||
assert((ScalarToTreeEntry.count(*User) ||
|
||||
// It is legal to replace the reduction users by undef.
|
||||
|
Reference in New Issue
Block a user