From 81ed3499cdf61dcf3cfb426de24f4f406bd04b0f Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Sun, 11 Dec 2016 20:07:02 +0000 Subject: [PATCH] [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 --- llvm/lib/IR/Constants.cpp | 14 ++++++++------ llvm/test/Transforms/InstSimplify/compare.ll | 11 +++++++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/llvm/lib/IR/Constants.cpp b/llvm/lib/IR/Constants.cpp index 6a6820234a01..a3db15259311 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(*OI); - if (GEPI.isBoundedSequential() && - (CI->getValue().getActiveBits() > 64 || - CI->getZExtValue() >= GEPI.getSequentialNumElements())) + if (isa(*OI)) + continue; + auto *CI = dyn_cast(*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 e5aea26b5aaa..cd2fa880294a 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