diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index ff22572782e22..04bdc74c7879a 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -6867,38 +6867,29 @@ class HorizontalReduction { if (I && I != Phi && (!RdxLeafVal || OpData == RdxLeafVal || IsRdxInst)) { // Only handle trees in the current basic block. - if (!RdxTreeInst.hasSameParent(I, B->getParent(), IsRdxInst)) { - // I is an extra argument for TreeN (its parent operation). - markExtraArg(Stack.back(), I); - continue; - } - // Each tree node needs to have minimal number of users except for the // ultimate reduction. - if (!RdxTreeInst.hasRequiredNumberOfUses(I, IsRdxInst) && I != B) { - // I is an extra argument for TreeN (its parent operation). - markExtraArg(Stack.back(), I); - continue; - } - - if (IsRdxInst) { - // We need to be able to reassociate the reduction operations. - if (!OpData.isAssociative(I)) { + if (RdxTreeInst.hasSameParent(I, B->getParent(), IsRdxInst) && + RdxTreeInst.hasRequiredNumberOfUses(I, IsRdxInst) && I != B) { + if (IsRdxInst) { + // We need to be able to reassociate the reduction operations. + if (!OpData.isAssociative(I)) { + // I is an extra argument for TreeN (its parent operation). + markExtraArg(Stack.back(), I); + continue; + } + } else if (RdxLeafVal && RdxLeafVal != OpData) { + // Make sure that the opcodes of the operations that we are going to + // reduce match. // I is an extra argument for TreeN (its parent operation). markExtraArg(Stack.back(), I); continue; + } else if (!RdxLeafVal) { + RdxLeafVal = OpData; } - } else if (RdxLeafVal && RdxLeafVal != OpData) { - // Make sure that the opcodes of the operations that we are going to - // reduce match. - // I is an extra argument for TreeN (its parent operation). - markExtraArg(Stack.back(), I); + Stack.push_back(std::make_pair(I, OpData.getFirstOperandIndex())); continue; - } else if (!RdxLeafVal) { - RdxLeafVal = OpData; } - Stack.push_back(std::make_pair(I, OpData.getFirstOperandIndex())); - continue; } // NextV is an extra argument for TreeN (its parent operation). markExtraArg(Stack.back(), NextV);