diff options
| author | Silviu Baranga <silviu.baranga@arm.com> | 2016-02-15 15:38:17 +0000 |
|---|---|---|
| committer | Silviu Baranga <silviu.baranga@arm.com> | 2016-02-15 15:38:17 +0000 |
| commit | ec7063ac7712f82c6ff62c75ffc8ed02db6dbf58 (patch) | |
| tree | df77caaa2d41178d5a7fe089058e316955bdd78d /llvm/lib/Transforms | |
| parent | 036c08874ae77b96afc3891a947b29114a5f7d27 (diff) | |
| download | bcm5719-llvm-ec7063ac7712f82c6ff62c75ffc8ed02db6dbf58.tar.gz bcm5719-llvm-ec7063ac7712f82c6ff62c75ffc8ed02db6dbf58.zip | |
[LV] Add support for insertelt/extractelt processing during type truncation
Summary:
While shrinking types according to the required bits, we can
encounter insert/extract element instructions. This will cause us to
reach an llvm_unreachable statement.
This change adds support for truncating insert/extract element
operations, and adds a regression test.
Reviewers: jmolloy
Subscribers: mzolotukhin, llvm-commits
Differential Revision: http://reviews.llvm.org/D17078
llvm-svn: 260893
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Vectorize/LoopVectorize.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp index c5a10ba7b60..a32a0ad0ff5 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -3187,6 +3187,9 @@ void InnerLoopVectorizer::truncateToMinimalBitwidths() { if (TruncatedTy == OriginalTy) continue; + if (!isa<Instruction>(I)) + continue; + IRBuilder<> B(cast<Instruction>(I)); auto ShrinkOperand = [&](Value *V) -> Value* { if (auto *ZI = dyn_cast<ZExtInst>(V)) @@ -3242,6 +3245,17 @@ void InnerLoopVectorizer::truncateToMinimalBitwidths() { } else if (isa<LoadInst>(I)) { // Don't do anything with the operands, just extend the result. continue; + } else if (auto *IE = dyn_cast<InsertElementInst>(I)) { + auto Elements = IE->getOperand(0)->getType()->getVectorNumElements(); + auto *O0 = B.CreateZExtOrTrunc( + IE->getOperand(0), VectorType::get(ScalarTruncatedTy, Elements)); + auto *O1 = B.CreateZExtOrTrunc(IE->getOperand(1), ScalarTruncatedTy); + NewI = B.CreateInsertElement(O0, O1, IE->getOperand(2)); + } else if (auto *EE = dyn_cast<ExtractElementInst>(I)) { + auto Elements = EE->getOperand(0)->getType()->getVectorNumElements(); + auto *O0 = B.CreateZExtOrTrunc( + EE->getOperand(0), VectorType::get(ScalarTruncatedTy, Elements)); + NewI = B.CreateExtractElement(O0, EE->getOperand(2)); } else { llvm_unreachable("Unhandled instruction type!"); } |

