diff options
author | Hal Finkel <hfinkel@anl.gov> | 2013-10-25 20:40:15 +0000 |
---|---|---|
committer | Hal Finkel <hfinkel@anl.gov> | 2013-10-25 20:40:15 +0000 |
commit | 02f562df43cbf31d63648b4ff22fcfdc0e28d8c7 (patch) | |
tree | b34e4113dcba6b5abc8da9bb4a82a16fcbdfa8df /llvm/lib/Transforms/Vectorize/LoopVectorize.cpp | |
parent | 8bdd1ee0216ff4a11b58eaa744646fc06efdfc35 (diff) | |
download | bcm5719-llvm-02f562df43cbf31d63648b4ff22fcfdc0e28d8c7.tar.gz bcm5719-llvm-02f562df43cbf31d63648b4ff22fcfdc0e28d8c7.zip |
LoopVectorizer: Don't attempt to vectorize extractelement instructions
The loop vectorizer does not currently understand how to vectorize
extractelement instructions. The existing check, which excluded all
vector-valued instructions, did not catch extractelement instructions because
it checked only the return value. As a result, vectorization would proceed,
producing illegal instructions like this:
%58 = extractelement <2 x i32> %15, i32 0
%59 = extractelement i32 %58, i32 0
where the second extractelement is illegal because its first operand is not a vector.
llvm-svn: 193434
Diffstat (limited to 'llvm/lib/Transforms/Vectorize/LoopVectorize.cpp')
-rw-r--r-- | llvm/lib/Transforms/Vectorize/LoopVectorize.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp index 317c1ffd85c..8b5424f5996 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -2965,8 +2965,9 @@ bool LoopVectorizationLegality::canVectorizeInstrs() { } // Check that the instruction return type is vectorizable. - if (!VectorType::isValidElementType(it->getType()) && - !it->getType()->isVoidTy()) { + // Also, we can't vectorize extractelement instructions. + if ((!VectorType::isValidElementType(it->getType()) && + !it->getType()->isVoidTy()) || isa<ExtractElementInst>(it)) { DEBUG(dbgs() << "LV: Found unvectorizable type.\n"); return false; } |