[PATCH] D153753: ValueTracking: Handle ptrmask in isKnownNeverZero

Matt Arsenault via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 26 04:48:49 PDT 2023


arsenm created this revision.
arsenm added reviewers: fhahn, nikic, aeubanks, jdoerfert, sanjoy, nlopes.
Herald added subscribers: StephenFan, hiraditya, arichardson.
Herald added a project: All.
arsenm requested review of this revision.
Herald added a subscriber: wdng.
Herald added a project: LLVM.

The non-0 address space cases demonstrate the existing confused
behavior of nonnull for the underlying pointer argument.


https://reviews.llvm.org/D153753

Files:
  llvm/lib/Analysis/ValueTracking.cpp
  llvm/test/Transforms/InstSimplify/nonnull-ptrmask.ll


Index: llvm/test/Transforms/InstSimplify/nonnull-ptrmask.ll
===================================================================
--- llvm/test/Transforms/InstSimplify/nonnull-ptrmask.ll
+++ llvm/test/Transforms/InstSimplify/nonnull-ptrmask.ll
@@ -40,9 +40,7 @@
 define i1 @nonnull_as0_ptrmask_constant_mask(ptr nonnull %arg) {
 ; CHECK-LABEL: define i1 @nonnull_as0_ptrmask_constant_mask
 ; CHECK-SAME: (ptr nonnull [[ARG:%.*]]) {
-; CHECK-NEXT:    [[MASKED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[ARG]], i64 -8)
-; CHECK-NEXT:    [[CMP:%.*]] = icmp eq ptr [[MASKED]], null
-; CHECK-NEXT:    ret i1 [[CMP]]
+; CHECK-NEXT:    ret i1 false
 ;
   %masked = call ptr @llvm.ptrmask.p0.i64(ptr %arg, i64 -8)
   %cmp = icmp eq ptr %masked, null
@@ -52,9 +50,7 @@
 define i1 @nonnull_as0_ptrmask_constant_maski32(ptr nonnull %arg) {
 ; CHECK-LABEL: define i1 @nonnull_as0_ptrmask_constant_maski32
 ; CHECK-SAME: (ptr nonnull [[ARG:%.*]]) {
-; CHECK-NEXT:    [[MASKED:%.*]] = call ptr @llvm.ptrmask.p0.i32(ptr [[ARG]], i32 -8)
-; CHECK-NEXT:    [[CMP:%.*]] = icmp eq ptr [[MASKED]], null
-; CHECK-NEXT:    ret i1 [[CMP]]
+; CHECK-NEXT:    ret i1 false
 ;
   %masked = call ptr @llvm.ptrmask.p0.i32(ptr %arg, i32 -8)
   %cmp = icmp eq ptr %masked, null
@@ -100,9 +96,7 @@
 define i1 @nonnull_as10_ptrmask_constant_mask(ptr addrspace(10) nonnull %arg) {
 ; CHECK-LABEL: define i1 @nonnull_as10_ptrmask_constant_mask
 ; CHECK-SAME: (ptr addrspace(10) nonnull [[ARG:%.*]]) {
-; CHECK-NEXT:    [[MASKED:%.*]] = call ptr addrspace(10) @llvm.ptrmask.p10.i64(ptr addrspace(10) [[ARG]], i64 -8)
-; CHECK-NEXT:    [[CMP:%.*]] = icmp eq ptr addrspace(10) [[MASKED]], null
-; CHECK-NEXT:    ret i1 [[CMP]]
+; CHECK-NEXT:    ret i1 false
 ;
   %masked = call ptr addrspace(10) @llvm.ptrmask.p10.i64(ptr addrspace(10) %arg, i64 -8)
   %cmp = icmp eq ptr addrspace(10) %masked, null
@@ -112,9 +106,7 @@
 define i1 @nonnull_as10_ptrmask_constant_maski32(ptr addrspace(10) nonnull %arg) {
 ; CHECK-LABEL: define i1 @nonnull_as10_ptrmask_constant_maski32
 ; CHECK-SAME: (ptr addrspace(10) nonnull [[ARG:%.*]]) {
-; CHECK-NEXT:    [[MASKED:%.*]] = call ptr addrspace(10) @llvm.ptrmask.p10.i32(ptr addrspace(10) [[ARG]], i32 -8)
-; CHECK-NEXT:    [[CMP:%.*]] = icmp eq ptr addrspace(10) [[MASKED]], null
-; CHECK-NEXT:    ret i1 [[CMP]]
+; CHECK-NEXT:    ret i1 false
 ;
   %masked = call ptr addrspace(10) @llvm.ptrmask.p10.i32(ptr addrspace(10) %arg, i32 -8)
   %cmp = icmp eq ptr addrspace(10) %masked, null
@@ -148,9 +140,7 @@
 define i1 @nonnull_as2_ptrmask_constant_maski64(ptr addrspace(2) nonnull %arg) {
 ; CHECK-LABEL: define i1 @nonnull_as2_ptrmask_constant_maski64
 ; CHECK-SAME: (ptr addrspace(2) nonnull [[ARG:%.*]]) {
-; CHECK-NEXT:    [[MASKED:%.*]] = call ptr addrspace(2) @llvm.ptrmask.p2.i64(ptr addrspace(2) [[ARG]], i64 -8)
-; CHECK-NEXT:    [[CMP:%.*]] = icmp eq ptr addrspace(2) [[MASKED]], null
-; CHECK-NEXT:    ret i1 [[CMP]]
+; CHECK-NEXT:    ret i1 false
 ;
   %masked = call ptr addrspace(2) @llvm.ptrmask.p2.i64(ptr addrspace(2) %arg, i64 -8)
   %cmp = icmp eq ptr addrspace(2) %masked, null
Index: llvm/lib/Analysis/ValueTracking.cpp
===================================================================
--- llvm/lib/Analysis/ValueTracking.cpp
+++ llvm/lib/Analysis/ValueTracking.cpp
@@ -2906,6 +2906,9 @@
         break;
       case Intrinsic::vscale:
         return true;
+      case Intrinsic::ptrmask:
+        return isKnownNonZero(II->getArgOperand(0), DemandedElts, Depth, Q) &&
+               isKnownNonZero(II->getArgOperand(1), DemandedElts, Depth, Q);
       default:
         break;
       }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D153753.534500.patch
Type: text/x-patch
Size: 3609 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230626/4ce4782d/attachment.bin>


More information about the llvm-commits mailing list