diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index 70785dafb0472..96845aee4c8e5 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -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(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(Op1) || isa(Op1))) { + if (DstType->isPointerTy() && (isa(Op1) || isa(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(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(BCSrcOp->getType()); + auto *VecTy = cast(SrcType); auto *EltTy = cast(VecTy->getElementType()); if (C->isSplat(EltTy->getBitWidth())) { // Fold the icmp based on the value of C