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

Alexander Richardson via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 26 09:08:18 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:

Sure, I think keeping it minimal makes sense. I was just wondering if it's correct to use DL.getPointerIndexSizeInBits() here instead? This should be the same behaviour for almost all targets but would make this fold work for the downstream CHERI targets as well once merged.

https://github.com/llvm/llvm-project/pull/67166


More information about the cfe-commits mailing list