diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -2740,7 +2740,9 @@ return isGEPKnownNonNull(cast(I), Depth, Q); break; case Instruction::BitCast: - if (I->getType()->isPointerTy()) + if (I->getType()->isPointerTy() || + I->getOperand(0)->getType()->isIntOrIntVectorTy() || + I->getOperand(0)->getType()->isPtrOrPtrVectorTy()) return isKnownNonZero(I->getOperand(0), Depth, Q); break; case Instruction::IntToPtr: diff --git a/llvm/test/Analysis/ValueTracking/known-non-zero.ll b/llvm/test/Analysis/ValueTracking/known-non-zero.ll --- a/llvm/test/Analysis/ValueTracking/known-non-zero.ll +++ b/llvm/test/Analysis/ValueTracking/known-non-zero.ll @@ -596,11 +596,7 @@ define i1 @bitcast_nonzero(<2 x i8> %xx, i16 %ind) { ; CHECK-LABEL: @bitcast_nonzero( -; CHECK-NEXT: [[XA:%.*]] = add nuw nsw <2 x i8> [[XX:%.*]], -; CHECK-NEXT: [[X:%.*]] = bitcast <2 x i8> [[XA]] to i16 -; CHECK-NEXT: [[Z:%.*]] = or i16 [[X]], [[IND:%.*]] -; CHECK-NEXT: [[R:%.*]] = icmp eq i16 [[Z]], 0 -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 false ; %xa = add nuw nsw <2 x i8> %xx, %x = bitcast <2 x i8> %xa to i16