@@ -15953,6 +15953,8 @@ bool SLPVectorizerPass::vectorizeChainsInBlock(BasicBlock *BB, BoUpSLP &R) {
15953
15953
for (int I = 0, E = Opcodes1.size(); I < E; ++I) {
15954
15954
// Undefs are compatible with any other value.
15955
15955
if (isa<UndefValue>(Opcodes1[I]) || isa<UndefValue>(Opcodes2[I])) {
15956
+ if (isa<UndefValue>(Opcodes1[I]) && isa<UndefValue>(Opcodes2[I]))
15957
+ continue;
15956
15958
if (isa<Instruction>(Opcodes1[I]))
15957
15959
return true;
15958
15960
if (isa<Instruction>(Opcodes2[I]))
@@ -15961,9 +15963,11 @@ bool SLPVectorizerPass::vectorizeChainsInBlock(BasicBlock *BB, BoUpSLP &R) {
15961
15963
return true;
15962
15964
if (isa<Constant>(Opcodes2[I]) && !isa<UndefValue>(Opcodes2[I]))
15963
15965
return false;
15964
- if (isa<UndefValue>(Opcodes1[I]) && isa<UndefValue>(Opcodes2[I]))
15965
- continue;
15966
- return isa<UndefValue>(Opcodes2[I]);
15966
+ if (isa<UndefValue>(Opcodes1[I]) && !isa<UndefValue>(Opcodes2[I]))
15967
+ return false;
15968
+ if (!isa<UndefValue>(Opcodes1[I]) && isa<UndefValue>(Opcodes2[I]))
15969
+ return true;
15970
+ continue;
15967
15971
}
15968
15972
if (auto *I1 = dyn_cast<Instruction>(Opcodes1[I]))
15969
15973
if (auto *I2 = dyn_cast<Instruction>(Opcodes2[I])) {
@@ -15984,14 +15988,14 @@ bool SLPVectorizerPass::vectorizeChainsInBlock(BasicBlock *BB, BoUpSLP &R) {
15984
15988
return I1->getOpcode() < I2->getOpcode();
15985
15989
}
15986
15990
if (isa<Constant>(Opcodes1[I]) && isa<Constant>(Opcodes2[I]))
15987
- return Opcodes1[I]->getValueID() < Opcodes2[I]->getValueID() ;
15988
- if (isa<Instruction>(Opcodes1[I]))
15991
+ continue ;
15992
+ if (isa<Instruction>(Opcodes1[I]) && !isa<Instruction>(Opcodes2[I]) )
15989
15993
return true;
15990
- if (isa<Instruction>(Opcodes2[I]))
15994
+ if (!isa<Instruction>(Opcodes1[I]) && isa<Instruction>(Opcodes2[I]))
15991
15995
return false;
15992
- if (isa<Constant>(Opcodes1[I]))
15996
+ if (isa<Constant>(Opcodes1[I]) && !isa<Constant>(Opcodes2[I]) )
15993
15997
return true;
15994
- if (isa<Constant>(Opcodes2[I]))
15998
+ if (!isa<Constant>(Opcodes1[I]) && isa<Constant>(Opcodes2[I]))
15995
15999
return false;
15996
16000
if (Opcodes1[I]->getValueID() < Opcodes2[I]->getValueID())
15997
16001
return true;
0 commit comments