[llvm] [InstCombine] Add combines/simplifications for `llvm.ptrmask` (PR #67166)
Alexander Richardson via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 26 08:12:17 PDT 2023
================
@@ -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
More information about the llvm-commits
mailing list