diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp --- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp +++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp @@ -361,9 +361,17 @@ Value *Op0; bool IsKnownNonNegative = false; + int64_t UpperBoundVal = MaxConstraintValue; if (match(V, m_ZExt(m_Value(Op0)))) { IsKnownNonNegative = true; V = Op0; + if (!llvm::any_of(V->users(), + [&](User *User) { return isa(User); })) { + TypeSize PreZextWidth = + DL.getTypeSizeInBits(V->getType()->getScalarType()); + if (PreZextWidth <= 64) + UpperBoundVal = APInt::getMaxValue(PreZextWidth).getZExtValue(); + } } Value *Op1; @@ -416,7 +424,7 @@ if (match(V, m_NUWSub(m_Value(Op0), m_Value(Op1)))) return {0, {{1, Op0}, {-1, Op1}}}; - return {V, IsKnownNonNegative}; + return {V, IsKnownNonNegative, UpperBoundVal}; } ConstraintTy diff --git a/llvm/test/Transforms/ConstraintElimination/type-bounds.ll b/llvm/test/Transforms/ConstraintElimination/type-bounds.ll --- a/llvm/test/Transforms/ConstraintElimination/type-bounds.ll +++ b/llvm/test/Transforms/ConstraintElimination/type-bounds.ll @@ -14,7 +14,7 @@ ; CHECK-NEXT: br i1 [[CMP_1]], label [[COND:%.*]], label [[EXIT]] ; CHECK: cond: ; CHECK-NEXT: [[CMP_2:%.*]] = icmp ult i32 [[A_EXT]], [[B]] -; CHECK-NEXT: call void @use(i1 [[CMP_2]]) +; CHECK-NEXT: call void @use(i1 true) ; CHECK-NEXT: ret void ; CHECK: exit: ; CHECK-NEXT: ret void @@ -242,7 +242,7 @@ ; CHECK-NEXT: br i1 [[CMP_1]], label [[COND:%.*]], label [[EXIT]] ; CHECK: cond: ; CHECK-NEXT: [[CMP_2:%.*]] = icmp ult i32 [[A_EXT]], [[B]] -; CHECK-NEXT: call void @use(i1 [[CMP_2]]) +; CHECK-NEXT: call void @use(i1 true) ; CHECK-NEXT: ret void ; CHECK: exit: ; CHECK-NEXT: ret void @@ -349,8 +349,8 @@ ; CHECK: cond: ; CHECK-NEXT: [[CMP_3:%.*]] = icmp ult i32 [[A_EXT]], [[B]] ; CHECK-NEXT: [[CMP_4:%.*]] = icmp ult i32 [[A2_EXT]], [[B2]] -; CHECK-NEXT: call void @use(i1 [[CMP_3]]) -; CHECK-NEXT: call void @use(i1 [[CMP_4]]) +; CHECK-NEXT: call void @use(i1 true) +; CHECK-NEXT: call void @use(i1 true) ; CHECK-NEXT: ret void ; CHECK: exit: ; CHECK-NEXT: ret void