summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorSilviu Baranga <silviu.baranga@arm.com>2016-02-15 15:38:17 +0000
committerSilviu Baranga <silviu.baranga@arm.com>2016-02-15 15:38:17 +0000
commitec7063ac7712f82c6ff62c75ffc8ed02db6dbf58 (patch)
treedf77caaa2d41178d5a7fe089058e316955bdd78d /llvm/lib/Transforms
parent036c08874ae77b96afc3891a947b29114a5f7d27 (diff)
downloadbcm5719-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.cpp14
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!");
}
OpenPOWER on IntegriCloud