mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-27 23:51:56 +00:00
[InstCombine] reduce code duplication for checking types; NFC
This commit is contained in:
parent
00a1258593
commit
be6d7cc93c
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user