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; } 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