diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp index 1b2615d4598d9..d2c6ffe9001d7 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -1223,7 +1223,9 @@ Instruction *InstCombinerImpl::visitZExt(ZExtInst &Zext) { if (!Zext.hasNonNeg()) { // If this zero extend is only used by a shift, add nneg flag. - if (Zext.hasOneUse() && SrcTy->getScalarSizeInBits() > 2 && + if (Zext.hasOneUse() && + SrcTy->getScalarSizeInBits() > + Log2_64_Ceil(DestTy->getScalarSizeInBits()) && match(Zext.user_back(), m_Shift(m_Value(), m_Specific(&Zext)))) { Zext.setNonNeg(); return &Zext; diff --git a/llvm/test/Transforms/InstCombine/shift.ll b/llvm/test/Transforms/InstCombine/shift.ll index 1cb1ac3272916..bad6a995cb75d 100644 --- a/llvm/test/Transforms/InstCombine/shift.ll +++ b/llvm/test/Transforms/InstCombine/shift.ll @@ -2208,8 +2208,8 @@ define i128 @shift_zext_nneg(i8 %arg) { define i129 @shift_zext_not_nneg(i8 %arg) { ; CHECK-LABEL: @shift_zext_not_nneg( -; CHECK-NEXT: [[EXT:%.*]] = zext nneg i8 [[ARG:%.*]] to i129 -; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i129 1, [[EXT]] +; CHECK-NEXT: [[EXT:%.*]] = zext i8 [[ARG:%.*]] to i129 +; CHECK-NEXT: [[SHL:%.*]] = shl nuw i129 1, [[EXT]] ; CHECK-NEXT: ret i129 [[SHL]] ; %ext = zext i8 %arg to i129