================ @@ -1964,18 +1964,78 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) { break; } case Intrinsic::ptrmask: { + KnownBits Known(DL.getPointerTypeSizeInBits(II->getType())); + if (SimplifyDemandedInstructionBits(*II, Known)) + return II; + + Value *Op0 = II->getArgOperand(0); + Value *Op1 = II->getArgOperand(1); + // Fail loudly in case this is ever changed. + // TODO: If vector types are supported the merging of (ptrmask (ptrmask)) + // need to ensure we don't merge a vectype with non-vec type. + assert(!Op0->getType()->isVectorTy() && !Op1->getType()->isVectorTy() && + "These combines where written at a time when ptrmask did not " + "support vector types and may not work for vectors"); + Value *InnerPtr, *InnerMask; - if (match(II->getArgOperand(0), - m_OneUse(m_Intrinsic<Intrinsic::ptrmask>(m_Value(InnerPtr), - m_Value(InnerMask))))) { - if (II->getArgOperand(1)->getType() == InnerMask->getType()) { - Value *NewMask = Builder.CreateAnd(II->getArgOperand(1), InnerMask); - return replaceInstUsesWith( - *II, - Builder.CreateIntrinsic(InnerPtr->getType(), Intrinsic::ptrmask, - {InnerPtr, NewMask})); + bool Changed = false; + // Combine: + // (ptrmask (ptrmask p, A), B) + // -> (ptrmask p, (and A, B)) + if (match(Op0, m_OneUse(m_Intrinsic<Intrinsic::ptrmask>( + m_Value(InnerPtr), m_Value(InnerMask))))) { + // See if combining the two masks is free. + bool OkayToMerge = InnerMask->getType() == Op1->getType(); + bool NeedsNew = false; + if (!OkayToMerge) { + if (match(InnerMask, m_ImmConstant())) { + InnerMask = Builder.CreateZExtOrTrunc(InnerMask, Op1->getType()); + OkayToMerge = true; + } else if (match(Op1, m_ImmConstant())) { + Op1 = Builder.CreateZExtOrTrunc(Op1, InnerMask->getType()); + OkayToMerge = true; + // Need to create a new one here, as the intrinsic id needs to change. + NeedsNew = true; + } + } + if (InnerMask->getType() == Op1->getType()) { ---------------- dtcxzyw wrote:
`OkayToMerge` is unused? https://github.com/llvm/llvm-project/pull/67166 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits