[InstCombine] reduce code duplication for checking types; NFC

This commit is contained in:
Sanjay Patel 2022-05-18 08:34:45 -04:00
parent 00a1258593
commit be6d7cc93c

View File

@ -2872,10 +2872,11 @@ Instruction *InstCombinerImpl::foldICmpBitCast(ICmpInst &Cmp) {
ICmpInst::Predicate Pred = Cmp.getPredicate();
Value *Op1 = Cmp.getOperand(1);
Value *BCSrcOp = Bitcast->getOperand(0);
Type *SrcType = Bitcast->getSrcTy();
Type *DstType = Bitcast->getType();
// Make sure the bitcast doesn't change the number of vector elements.
if (Bitcast->getSrcTy()->getScalarSizeInBits() ==
Bitcast->getDestTy()->getScalarSizeInBits()) {
if (SrcType->getScalarSizeInBits() == DstType->getScalarSizeInBits()) {
// Zero-equality and sign-bit checks are preserved through sitofp + bitcast.
Value *X;
if (match(BCSrcOp, m_SIToFP(m_Value(X)))) {
@ -2920,8 +2921,7 @@ Instruction *InstCombinerImpl::foldICmpBitCast(ICmpInst &Cmp) {
Type *XType = X->getType();
// We can't currently handle Power style floating point operations here.
if (!(XType->isPPC_FP128Ty() || BCSrcOp->getType()->isPPC_FP128Ty())) {
if (!(XType->isPPC_FP128Ty() || SrcType->isPPC_FP128Ty())) {
Type *NewType = Builder.getIntNTy(XType->getScalarSizeInBits());
if (auto *XVTy = dyn_cast<VectorType>(XType))
NewType = VectorType::get(NewType, XVTy->getElementCount());
@ -2939,21 +2939,19 @@ Instruction *InstCombinerImpl::foldICmpBitCast(ICmpInst &Cmp) {
// Test to see if the operands of the icmp are casted versions of other
// values. If the ptr->ptr cast can be stripped off both arguments, do so.
if (Bitcast->getType()->isPointerTy() &&
(isa<Constant>(Op1) || isa<BitCastInst>(Op1))) {
if (DstType->isPointerTy() && (isa<Constant>(Op1) || isa<BitCastInst>(Op1))) {
// If operand #1 is a bitcast instruction, it must also be a ptr->ptr cast
// so eliminate it as well.
if (auto *BC2 = dyn_cast<BitCastInst>(Op1))
Op1 = BC2->getOperand(0);
Op1 = Builder.CreateBitCast(Op1, BCSrcOp->getType());
Op1 = Builder.CreateBitCast(Op1, SrcType);
return new ICmpInst(Pred, BCSrcOp, Op1);
}
const APInt *C;
if (!match(Cmp.getOperand(1), m_APInt(C)) ||
!Bitcast->getType()->isIntegerTy() ||
!Bitcast->getSrcTy()->isIntOrIntVectorTy())
if (!match(Cmp.getOperand(1), m_APInt(C)) || !DstType->isIntegerTy() ||
!SrcType->isIntOrIntVectorTy())
return nullptr;
// If this is checking if all elements of a vector compare are set or not,
@ -2965,9 +2963,8 @@ Instruction *InstCombinerImpl::foldICmpBitCast(ICmpInst &Cmp) {
// TODO: Try harder to reduce compare of 2 freely invertible operands?
if (Cmp.isEquality() && C->isAllOnes() && Bitcast->hasOneUse() &&
isFreeToInvert(BCSrcOp, BCSrcOp->hasOneUse())) {
Type *ScalarTy = Bitcast->getType();
Value *Cast = Builder.CreateBitCast(Builder.CreateNot(BCSrcOp), ScalarTy);
return new ICmpInst(Pred, Cast, ConstantInt::getNullValue(ScalarTy));
Value *Cast = Builder.CreateBitCast(Builder.CreateNot(BCSrcOp), DstType);
return new ICmpInst(Pred, Cast, ConstantInt::getNullValue(DstType));
}
// If this is checking if all elements of an extended vector are clear or not,
@ -2995,7 +2992,7 @@ Instruction *InstCombinerImpl::foldICmpBitCast(ICmpInst &Cmp) {
if (match(BCSrcOp, m_Shuffle(m_Value(Vec), m_Undef(), m_Mask(Mask)))) {
// Check whether every element of Mask is the same constant
if (is_splat(Mask)) {
auto *VecTy = cast<VectorType>(BCSrcOp->getType());
auto *VecTy = cast<VectorType>(SrcType);
auto *EltTy = cast<IntegerType>(VecTy->getElementType());
if (C->isSplat(EltTy->getBitWidth())) {
// Fold the icmp based on the value of C