summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2016-12-11 20:07:02 +0000
committerSanjay Patel <spatel@rotateright.com>2016-12-11 20:07:02 +0000
commit81ed3499cdf61dcf3cfb426de24f4f406bd04b0f (patch)
tree8db3592c665f7d0a1f0a8083a09a00398031f442
parent7c98a79f7beedbfe09b2ede8e44fdcf1fcf2536d (diff)
downloadbcm5719-llvm-81ed3499cdf61dcf3cfb426de24f4f406bd04b0f.tar.gz
bcm5719-llvm-81ed3499cdf61dcf3cfb426de24f4f406bd04b0f.zip
[Constants] don't die processing non-ConstantInt GEP indices in isGEPWithNoNotionalOverIndexing() (PR31262)
This should fix: https://llvm.org/bugs/show_bug.cgi?id=31262 llvm-svn: 289401
-rw-r--r--llvm/lib/IR/Constants.cpp14
-rw-r--r--llvm/test/Transforms/InstSimplify/compare.ll11
2 files changed, 19 insertions, 6 deletions
diff --git a/llvm/lib/IR/Constants.cpp b/llvm/lib/IR/Constants.cpp
index 6a6820234a0..a3db1525931 100644
--- a/llvm/lib/IR/Constants.cpp
+++ b/llvm/lib/IR/Constants.cpp
@@ -1071,13 +1071,15 @@ bool ConstantExpr::isGEPWithNoNotionalOverIndexing() const {
gep_type_iterator GEPI = gep_type_begin(this), E = gep_type_end(this);
User::const_op_iterator OI = std::next(this->op_begin());
- // The remaining indices must be compile-time known integers within the
- // bounds of the corresponding notional static array types.
+ // The remaining indices may be compile-time known integers within the bounds
+ // of the corresponding notional static array types.
for (; GEPI != E; ++GEPI, ++OI) {
- ConstantInt *CI = dyn_cast<ConstantInt>(*OI);
- if (GEPI.isBoundedSequential() &&
- (CI->getValue().getActiveBits() > 64 ||
- CI->getZExtValue() >= GEPI.getSequentialNumElements()))
+ if (isa<UndefValue>(*OI))
+ continue;
+ auto *CI = dyn_cast<ConstantInt>(*OI);
+ if (!CI || (GEPI.isBoundedSequential() &&
+ (CI->getValue().getActiveBits() > 64 ||
+ CI->getZExtValue() >= GEPI.getSequentialNumElements())))
return false;
}
diff --git a/llvm/test/Transforms/InstSimplify/compare.ll b/llvm/test/Transforms/InstSimplify/compare.ll
index e5aea26b5aa..cd2fa880294 100644
--- a/llvm/test/Transforms/InstSimplify/compare.ll
+++ b/llvm/test/Transforms/InstSimplify/compare.ll
@@ -65,6 +65,17 @@ define i1 @gep4() {
; CHECK-NEXT: ret i1 false
}
+@a = common global [1 x i32] zeroinitializer, align 4
+
+define i1 @PR31262() {
+; CHECK-LABEL: @PR31262(
+; CHECK-NEXT: ret i1 icmp uge (i32* getelementptr ([1 x i32], [1 x i32]* @a, i64 0, i64 undef), i32* getelementptr inbounds ([1 x i32], [1 x i32]* @a, i32 0, i32 0))
+;
+ %idx = getelementptr inbounds [1 x i32], [1 x i32]* @a, i64 0, i64 undef
+ %cmp = icmp uge i32* %idx, getelementptr inbounds ([1 x i32], [1 x i32]* @a, i32 0, i32 0)
+ ret i1 %cmp
+}
+
define i1 @gep5() {
; CHECK-LABEL: @gep5(
%x = alloca %gept, align 8
OpenPOWER on IntegriCloud