[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
This commit is contained in:
Sanjay Patel 2016-12-11 20:07:02 +00:00
parent 7c98a79f7b
commit 81ed3499cd
2 changed files with 19 additions and 6 deletions

View File

@ -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;
}

View File

@ -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