[clang] [InstCombine] Add combines/simplifications for `llvm.ptrmask` (PR #67166)

Alexander Richardson via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 26 07:32:56 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:

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


More information about the cfe-commits mailing list