================
@@ -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:
This guard is overly restrictive for architectures such as CHERI-enabled ones,
where pointers carry additional metadata bits and ptrmask only affects the
address bits (which is currently the index width).
See also https://reviews.llvm.org/D135158 which adds
DL.getPointerIntegralSize() (although maybe that should be something like
getPointerAddressSize()). For CHERI index width would be the correct thing to
check here, but I'm not sure if that is also correct for non-integral AMDGPU
pointers.
https://github.com/llvm/llvm-project/pull/67166
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits