[llvm] 36e4a7e - [SLP]Fix PR79321: SLPVectorizer's PHICompare doesn't provide a strict
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 24 13:46:17 PST 2024
Author: Alexey Bataev
Date: 2024-01-24T13:46:05-08:00
New Revision: 36e4a7ecca8a79fe8960a1e2afa78fbbd643dc7f
URL: https://github.com/llvm/llvm-project/commit/36e4a7ecca8a79fe8960a1e2afa78fbbd643dc7f
DIFF: https://github.com/llvm/llvm-project/commit/36e4a7ecca8a79fe8960a1e2afa78fbbd643dc7f.diff
LOG: [SLP]Fix PR79321: SLPVectorizer's PHICompare doesn't provide a strict
weak ordering.
Try to make PHICompare to meat strict weak ordering criteria.
Added:
Modified:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index b4bc0f38a699a7c..8689d80488475fc 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -15953,6 +15953,8 @@ bool SLPVectorizerPass::vectorizeChainsInBlock(BasicBlock *BB, BoUpSLP &R) {
for (int I = 0, E = Opcodes1.size(); I < E; ++I) {
// Undefs are compatible with any other value.
if (isa<UndefValue>(Opcodes1[I]) || isa<UndefValue>(Opcodes2[I])) {
+ if (isa<UndefValue>(Opcodes1[I]) && isa<UndefValue>(Opcodes2[I]))
+ continue;
if (isa<Instruction>(Opcodes1[I]))
return true;
if (isa<Instruction>(Opcodes2[I]))
@@ -15961,9 +15963,11 @@ bool SLPVectorizerPass::vectorizeChainsInBlock(BasicBlock *BB, BoUpSLP &R) {
return true;
if (isa<Constant>(Opcodes2[I]) && !isa<UndefValue>(Opcodes2[I]))
return false;
- if (isa<UndefValue>(Opcodes1[I]) && isa<UndefValue>(Opcodes2[I]))
- continue;
- return isa<UndefValue>(Opcodes2[I]);
+ if (isa<UndefValue>(Opcodes1[I]) && !isa<UndefValue>(Opcodes2[I]))
+ return false;
+ if (!isa<UndefValue>(Opcodes1[I]) && isa<UndefValue>(Opcodes2[I]))
+ return true;
+ continue;
}
if (auto *I1 = dyn_cast<Instruction>(Opcodes1[I]))
if (auto *I2 = dyn_cast<Instruction>(Opcodes2[I])) {
@@ -15984,14 +15988,14 @@ bool SLPVectorizerPass::vectorizeChainsInBlock(BasicBlock *BB, BoUpSLP &R) {
return I1->getOpcode() < I2->getOpcode();
}
if (isa<Constant>(Opcodes1[I]) && isa<Constant>(Opcodes2[I]))
- return Opcodes1[I]->getValueID() < Opcodes2[I]->getValueID();
- if (isa<Instruction>(Opcodes1[I]))
+ continue;
+ if (isa<Instruction>(Opcodes1[I]) && !isa<Instruction>(Opcodes2[I]))
return true;
- if (isa<Instruction>(Opcodes2[I]))
+ if (!isa<Instruction>(Opcodes1[I]) && isa<Instruction>(Opcodes2[I]))
return false;
- if (isa<Constant>(Opcodes1[I]))
+ if (isa<Constant>(Opcodes1[I]) && !isa<Constant>(Opcodes2[I]))
return true;
- if (isa<Constant>(Opcodes2[I]))
+ if (!isa<Constant>(Opcodes1[I]) && isa<Constant>(Opcodes2[I]))
return false;
if (Opcodes1[I]->getValueID() < Opcodes2[I]->getValueID())
return true;
More information about the llvm-commits
mailing list