mirror of
https://github.com/intel/llvm.git
synced 2026-01-23 07:58:23 +08:00
[llvm][SLP] Exit early if inputs to comparator are equal
**TL;DR:** This PR modifies a comparator. The comparator is used in a subsequent call to llvm::stable_sort. Sorting comparators should follow strict weak ordering - in particular, (x < x) should return false. This PR adds a fix to avoid an infinite loop when the inputs to the comparator are equal.
**Details**:
Sometimes when two equivalent tensors passed into the comparator, we encounter infinite looping (at aae2eaae2c/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp (L4049))
Although it seems like this comparator will never be called with two equivalent pointers, some sanitizers, e.g. https://chromium.googlesource.com/chromiumos/third_party/gcc/+/refs/heads/stabilize-zako-5712.88.B/libstdc++-v3/include/bits/stl_algo.h#360, will add checks for (x < x). When this sanitizer is used with the current implementation, it triggers a comparator check for (x < x) which runs into the infinite loop
Reviewed By: ABataev
Differential Revision: https://reviews.llvm.org/D155874
This commit is contained in:
committed by
Alexey Bataev
parent
0a093f62d1
commit
8fa02db8cf
@@ -4136,6 +4136,8 @@ BoUpSLP::getReorderingData(const TreeEntry &TE, bool TopToBottom) {
|
||||
return TE.ReorderIndices;
|
||||
if (TE.State == TreeEntry::Vectorize && TE.getOpcode() == Instruction::PHI) {
|
||||
auto PHICompare = [](llvm::Value *V1, llvm::Value *V2) {
|
||||
if (V1 == V2)
|
||||
return false;
|
||||
if (!V1->hasOneUse() || !V2->hasOneUse())
|
||||
return false;
|
||||
auto *FirstUserOfPhi1 = cast<Instruction>(*V1->user_begin());
|
||||
|
||||
Reference in New Issue
Block a user