summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2018-06-22 16:37:34 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2018-06-22 16:37:34 +0000
commit9d3ef8ee2b5fd95de90d704a07dc6a5374065f0c (patch)
tree745833e215587f87bd3dc37ab3b22c3050d8c675 /llvm/lib
parent21f0fdb2197dc35d4f6af21000029f22a84471e4 (diff)
downloadbcm5719-llvm-9d3ef8ee2b5fd95de90d704a07dc6a5374065f0c.tar.gz
bcm5719-llvm-9d3ef8ee2b5fd95de90d704a07dc6a5374065f0c.zip
[SLPVectorizer] Support alternate opcodes in tryToVectorizeList
Enable tryToVectorizeList to support InstructionsState alternate opcode patterns at a root (build vector etc.) as well as further down the vectorization tree. NOTE: This patch reduces some of the debug reporting if there are opcode mismatches - I can try to add it back if it proves a problem. But it could get rather messy trying to provide equivalent verbose debug strings via getSameOpcode etc. Differential Revision: https://reviews.llvm.org/D48488 llvm-svn: 335364
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp41
1 files changed, 13 insertions, 28 deletions
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index a65af3335b2..c9ed4dc4678 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -4824,13 +4824,13 @@ bool SLPVectorizerPass::tryToVectorizeList(ArrayRef<Value *> VL, BoUpSLP &R,
LLVM_DEBUG(dbgs() << "SLP: Trying to vectorize a list of length = "
<< VL.size() << ".\n");
- // Check that all of the parts are scalar instructions of the same type.
- Instruction *I0 = dyn_cast<Instruction>(VL[0]);
- if (!I0)
+ // Check that all of the parts are scalar instructions of the same type,
+ // we permit an alternate opcode via InstructionsState.
+ InstructionsState S = getSameOpcode(VL);
+ if (!S.Opcode)
return false;
- unsigned Opcode0 = I0->getOpcode();
-
+ Instruction *I0 = cast<Instruction>(S.OpValue);
unsigned Sz = R.getVectorElementSize(I0);
unsigned MinVF = std::max(2U, R.getMinVecRegSize() / Sz);
unsigned MaxVF = std::max<unsigned>(PowerOf2Floor(VL.size()), MinVF);
@@ -4847,30 +4847,15 @@ bool SLPVectorizerPass::tryToVectorizeList(ArrayRef<Value *> VL, BoUpSLP &R,
for (Value *V : VL) {
Type *Ty = V->getType();
if (!isValidElementType(Ty)) {
- // NOTE: the following will give user internal llvm type name, which may not be useful
- R.getORE()->emit([&]() {
- std::string type_str;
- llvm::raw_string_ostream rso(type_str);
- Ty->print(rso);
- return OptimizationRemarkMissed(
- SV_NAME, "UnsupportedType", I0)
- << "Cannot SLP vectorize list: type "
- << rso.str() + " is unsupported by vectorizer";
- });
- return false;
- }
- Instruction *Inst = dyn_cast<Instruction>(V);
-
- if (!Inst)
- return false;
- if (Inst->getOpcode() != Opcode0) {
+ // NOTE: the following will give user internal llvm type name, which may
+ // not be useful.
R.getORE()->emit([&]() {
- return OptimizationRemarkMissed(
- SV_NAME, "InequableTypes", I0)
- << "Cannot SLP vectorize list: not all of the "
- << "parts of scalar instructions are of the same type: "
- << ore::NV("Instruction1Opcode", I0) << " and "
- << ore::NV("Instruction2Opcode", Inst);
+ std::string type_str;
+ llvm::raw_string_ostream rso(type_str);
+ Ty->print(rso);
+ return OptimizationRemarkMissed(SV_NAME, "UnsupportedType", I0)
+ << "Cannot SLP vectorize list: type "
+ << rso.str() + " is unsupported by vectorizer";
});
return false;
}
OpenPOWER on IntegriCloud