summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHaicheng Wu <haicheng@codeaurora.org>2017-10-28 02:27:14 +0000
committerHaicheng Wu <haicheng@codeaurora.org>2017-10-28 02:27:14 +0000
commiteb92e569dedf2b21fa742b5976d34da06b6022c7 (patch)
treeff44ca56cd3c42b9e503793ad29c60e2cc0372af
parentfd0a35a6495fce7f4e5254665680b47f7cd51d64 (diff)
downloadbcm5719-llvm-eb92e569dedf2b21fa742b5976d34da06b6022c7.tar.gz
bcm5719-llvm-eb92e569dedf2b21fa742b5976d34da06b6022c7.zip
[ConstantFold] Fix a crash when folding a GEP that has vector index
LLVM crashes when factoring out an out-of-bound index into preceding dimension and the preceding dimension uses vector index. Simply bail out now when this case happens. Differential Revision: https://reviews.llvm.org/D38677 llvm-svn: 316824
-rw-r--r--llvm/lib/IR/ConstantFold.cpp3
-rw-r--r--llvm/test/Transforms/InstCombine/gep-vector.ll9
2 files changed, 12 insertions, 0 deletions
diff --git a/llvm/lib/IR/ConstantFold.cpp b/llvm/lib/IR/ConstantFold.cpp
index 044cc1ff449..c826f757e6d 100644
--- a/llvm/lib/IR/ConstantFold.cpp
+++ b/llvm/lib/IR/ConstantFold.cpp
@@ -2219,6 +2219,9 @@ Constant *llvm::ConstantFoldGetElementPtr(Type *PointeeTy, Constant *C,
Unknown = true;
continue;
}
+ if (!isa<ConstantInt>(Idxs[i - 1]))
+ // FIXME: add the support of cosntant vector index.
+ continue;
if (InRangeIndex && i == *InRangeIndex + 1) {
// If an index is marked inrange, we cannot apply this canonicalization to
// the following index, as that will cause the inrange index to point to
diff --git a/llvm/test/Transforms/InstCombine/gep-vector.ll b/llvm/test/Transforms/InstCombine/gep-vector.ll
index ce021bf207f..f7ed1a776f5 100644
--- a/llvm/test/Transforms/InstCombine/gep-vector.ll
+++ b/llvm/test/Transforms/InstCombine/gep-vector.ll
@@ -13,3 +13,12 @@ define <8 x i64*> @patatino2() {
%el = getelementptr inbounds i64, i64* undef, <8 x i64> undef
ret <8 x i64*> %el
}
+
+@block = global [64 x [8192 x i8]] zeroinitializer, align 1
+
+; CHECK-LABEL:vectorindex
+; CHECK-NEXT: ret <2 x i8*> getelementptr inbounds ([64 x [8192 x i8]], [64 x [8192 x i8]]* @block, <2 x i64> zeroinitializer, <2 x i64> <i64 0, i64 1>, <2 x i64> <i64 8192, i64 8192>)
+define <2 x i8*> @vectorindex() {
+ %1 = getelementptr inbounds [64 x [8192 x i8]], [64 x [8192 x i8]]* @block, i64 0, <2 x i64> <i64 0, i64 1>, i64 8192
+ ret <2 x i8*> %1
+}
OpenPOWER on IntegriCloud