================ @@ -6397,6 +6397,48 @@ static Value *simplifyBinaryIntrinsic(Function *F, Value *Op0, Value *Op1, return Constant::getNullValue(ReturnType); break; } + case Intrinsic::ptrmask: { + // Fail loudly in case this is ever changed. + // TODO: If vector types are supported the logic that checks if the mask is + // useless should be updated to use generic constants. + assert(!Op0->getType()->isVectorTy() && !Op1->getType()->isVectorTy() && + "These simplifications where written at a time when ptrmask did not " + "support vector types and may not work for vectors"); + + // NOTE: We can't apply these simplifications based on the value of Op1 + // because we need to preserve provenance. + if (isa<PoisonValue>(Op0) || isa<PoisonValue>(Op1)) + return PoisonValue::get(Op0->getType()); + + if (Q.isUndefValue(Op0)) + return Constant::getNullValue(Op0->getType()); + + if (match(Op0, m_Zero())) + return Constant::getNullValue(Op0->getType()); + + if (Op1->getType()->getScalarSizeInBits() == + Q.DL.getPointerTypeSizeInBits(Op0->getType())) { ---------------- arichardson wrote:
Looking at the current langref: > The result of ptrmask(ptr, mask) is equivalent to getelementptr ptr, > (ptrtoint(ptr) & mask) - ptrtoint(ptr). Since it's defined in terms of GEP it indicates to me that the masking cannot affect more than the index bits. GEP semantics: > If the offsets have a different width from the pointer’s index type, they > are sign-extended or truncated to the width of the pointer’s index type. 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