]> granicus.if.org Git - llvm/commitdiff
[ConstantFold] Fix a crash when folding a GEP that has vector index
authorHaicheng Wu <haicheng@codeaurora.org>
Sat, 28 Oct 2017 02:27:14 +0000 (02:27 +0000)
committerHaicheng Wu <haicheng@codeaurora.org>
Sat, 28 Oct 2017 02:27:14 +0000 (02:27 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@316824 91177308-0d34-0410-b5e6-96231b3b80d8

lib/IR/ConstantFold.cpp
test/Transforms/InstCombine/gep-vector.ll

index 044cc1ff449e87dd053f4d732e818b027a7d0927..c826f757e6dde6e1afd2f1c34a022d4a19036ad0 100644 (file)
@@ -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
index ce021bf207fce5873afe0a9a69db438b78ab12a0..f7ed1a776f5309432ce97dfbef67519454d0109a 100644 (file)
@@ -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
+}