diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index fe3d7d679129f..c07b5b9e130f8 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -6412,6 +6412,44 @@ static Value *simplifyBinaryIntrinsic(Function *F, Value *Op0, Value *Op1, return Constant::getNullValue(ReturnType); break; } + case Intrinsic::ptrmask: { + if (isa(Op0) || isa(Op1)) + return PoisonValue::get(Op0->getType()); + + // NOTE: We can't apply this simplifications based on the value of Op1 + // because we need to preserve provenance. + if (Q.isUndefValue(Op0) || match(Op0, m_Zero())) + return Constant::getNullValue(Op0->getType()); + + assert(Op1->getType()->getScalarSizeInBits() == + Q.DL.getIndexTypeSizeInBits(Op0->getType()) && + "Invalid mask width"); + // If index-width (mask size) is less than pointer-size then mask is + // 1-extended. + if (match(Op1, m_PtrToInt(m_Specific(Op0)))) + return Op0; + + // NOTE: We may have attributes associated with the return value of the + // llvm.ptrmask intrinsic that will be lost when we just return the + // operand. We should try to preserve them. + if (match(Op1, m_AllOnes()) || Q.isUndefValue(Op1)) + return Op0; + + Constant *C; + if (match(Op1, m_ImmConstant(C))) { + KnownBits PtrKnown = computeKnownBits(Op0, /*Depth=*/0, Q); + // See if we only masking off bits we know are already zero due to + // alignment. + APInt IrrelevantPtrBits = + PtrKnown.Zero.zextOrTrunc(C->getType()->getScalarSizeInBits()); + C = ConstantFoldBinaryOpOperands( + Instruction::Or, C, ConstantInt::get(C->getType(), IrrelevantPtrBits), + Q.DL); + if (C != nullptr && C->isAllOnesValue()) + return Op0; + } + break; + } case Intrinsic::smax: case Intrinsic::smin: case Intrinsic::umax: diff --git a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/ptrmask.ll b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/ptrmask.ll index 280630468c2c0..857132a0d10fc 100644 --- a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/ptrmask.ll +++ b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/ptrmask.ll @@ -320,8 +320,7 @@ define i8 @ptrmask_cast_local_to_flat_const_mask_fffffffffffffffe(ptr addrspace( define i8 @ptrmask_cast_local_to_flat_const_mask_ffffffffffffffff(ptr addrspace(3) %src.ptr) { ; CHECK-LABEL: @ptrmask_cast_local_to_flat_const_mask_ffffffffffffffff( -; CHECK-NEXT: [[TMP1:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[SRC_PTR:%.*]], i32 -1) -; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(3) [[TMP1]], align 1 +; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(3) [[SRC_PTR:%.*]], align 1 ; CHECK-NEXT: ret i8 [[LOAD]] ; %cast = addrspacecast ptr addrspace(3) %src.ptr to ptr @@ -333,7 +332,7 @@ define i8 @ptrmask_cast_local_to_flat_const_mask_ffffffffffffffff(ptr addrspace( ; Make sure non-constant masks can also be handled. define i8 @ptrmask_cast_local_to_flat_load_range_mask(ptr addrspace(3) %src.ptr, ptr addrspace(1) %mask.ptr) { ; CHECK-LABEL: @ptrmask_cast_local_to_flat_load_range_mask( -; CHECK-NEXT: [[LOAD_MASK:%.*]] = load i64, ptr addrspace(1) [[MASK_PTR:%.*]], align 8, !range !0 +; CHECK-NEXT: [[LOAD_MASK:%.*]] = load i64, ptr addrspace(1) [[MASK_PTR:%.*]], align 8, !range [[RNG0:![0-9]+]] ; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[LOAD_MASK]] to i32 ; CHECK-NEXT: [[TMP2:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[SRC_PTR:%.*]], i32 [[TMP1]]) ; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(3) [[TMP2]], align 1 diff --git a/llvm/test/Transforms/InstCombine/align-addr.ll b/llvm/test/Transforms/InstCombine/align-addr.ll index ec8e7c9348f17..1e49cddf7ffe7 100644 --- a/llvm/test/Transforms/InstCombine/align-addr.ll +++ b/llvm/test/Transforms/InstCombine/align-addr.ll @@ -181,11 +181,9 @@ define <16 x i8> @ptrmask_align8_ptr_align1(ptr align 1 %ptr) { } ; Underlying alignment already the same as forced alignment by ptrmask -; TODO: Should be able to drop the ptrmask define <16 x i8> @ptrmask_align8_ptr_align8(ptr align 8 %ptr) { ; CHECK-LABEL: @ptrmask_align8_ptr_align8( -; CHECK-NEXT: [[ALIGNED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 -8) -; CHECK-NEXT: [[LOAD:%.*]] = load <16 x i8>, ptr [[ALIGNED]], align 1 +; CHECK-NEXT: [[LOAD:%.*]] = load <16 x i8>, ptr [[PTR:%.*]], align 1 ; CHECK-NEXT: ret <16 x i8> [[LOAD]] ; %aligned = call ptr @llvm.ptrmask.p0.i64(ptr %ptr, i64 -8) @@ -194,11 +192,9 @@ define <16 x i8> @ptrmask_align8_ptr_align8(ptr align 8 %ptr) { } ; Underlying alignment greater than alignment forced by ptrmask -; TODO: Should be able to drop the ptrmask define <16 x i8> @ptrmask_align8_ptr_align16(ptr align 16 %ptr) { ; CHECK-LABEL: @ptrmask_align8_ptr_align16( -; CHECK-NEXT: [[ALIGNED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 -8) -; CHECK-NEXT: [[LOAD:%.*]] = load <16 x i8>, ptr [[ALIGNED]], align 1 +; CHECK-NEXT: [[LOAD:%.*]] = load <16 x i8>, ptr [[PTR:%.*]], align 1 ; CHECK-NEXT: ret <16 x i8> [[LOAD]] ; %aligned = call ptr @llvm.ptrmask.p0.i64(ptr %ptr, i64 -8) diff --git a/llvm/test/Transforms/InstSimplify/ptrmask.ll b/llvm/test/Transforms/InstSimplify/ptrmask.ll index 4945d4bc0edf6..dd83abfdeee46 100644 --- a/llvm/test/Transforms/InstSimplify/ptrmask.ll +++ b/llvm/test/Transforms/InstSimplify/ptrmask.ll @@ -12,8 +12,7 @@ declare <2 x ptr> @llvm.ptrmask.v2p1.v2i64(<2 x ptr>, <2 x i64>) define ptr @ptrmask_simplify_poison_mask(ptr %p) { ; CHECK-LABEL: define ptr @ptrmask_simplify_poison_mask ; CHECK-SAME: (ptr [[P:%.*]]) { -; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 poison) -; CHECK-NEXT: ret ptr [[R]] +; CHECK-NEXT: ret ptr poison ; %r = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 poison) ret ptr %r @@ -22,8 +21,7 @@ define ptr @ptrmask_simplify_poison_mask(ptr %p) { define <2 x ptr addrspace(1) > @ptrmask_simplify_poison_mask_vec(<2 x ptr addrspace(1) > %p) { ; CHECK-LABEL: define <2 x ptr addrspace(1)> @ptrmask_simplify_poison_mask_vec ; CHECK-SAME: (<2 x ptr addrspace(1)> [[P:%.*]]) { -; CHECK-NEXT: [[R:%.*]] = call <2 x ptr addrspace(1)> @llvm.ptrmask.v2p1.v2i32(<2 x ptr addrspace(1)> [[P]], <2 x i32> poison) -; CHECK-NEXT: ret <2 x ptr addrspace(1)> [[R]] +; CHECK-NEXT: ret <2 x ptr addrspace(1)> poison ; %r = call <2 x ptr addrspace(1) > @llvm.ptrmask.v2p1.v2i32(<2 x ptr addrspace(1) > %p, <2 x i32> poison) ret <2 x ptr addrspace(1) > %r @@ -42,8 +40,7 @@ define <2 x ptr addrspace(1) > @ptrmask_simplify_poison_and_zero_i32_vec_fail(<2 define <2 x ptr> @ptrmask_simplify_undef_and_ones_vec(<2 x ptr> %p) { ; CHECK-LABEL: define <2 x ptr> @ptrmask_simplify_undef_and_ones_vec ; CHECK-SAME: (<2 x ptr> [[P:%.*]]) { -; CHECK-NEXT: [[R:%.*]] = call <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> [[P]], <2 x i64> ) -; CHECK-NEXT: ret <2 x ptr> [[R]] +; CHECK-NEXT: ret <2 x ptr> [[P]] ; %r = call <2 x ptr> @llvm.ptrmask.v2p1.v2i64(<2 x ptr> %p, <2 x i64> ) ret <2 x ptr> %r @@ -52,8 +49,7 @@ define <2 x ptr> @ptrmask_simplify_undef_and_ones_vec(<2 x ptr> %p) { define <2 x ptr> @ptrmask_simplify_poison_and_ones_vec(<2 x ptr> %p) { ; CHECK-LABEL: define <2 x ptr> @ptrmask_simplify_poison_and_ones_vec ; CHECK-SAME: (<2 x ptr> [[P:%.*]]) { -; CHECK-NEXT: [[R:%.*]] = call <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> [[P]], <2 x i64> ) -; CHECK-NEXT: ret <2 x ptr> [[R]] +; CHECK-NEXT: ret <2 x ptr> [[P]] ; %r = call <2 x ptr> @llvm.ptrmask.v2p1.v2i64(<2 x ptr> %p, <2 x i64> ) ret <2 x ptr> %r @@ -62,8 +58,7 @@ define <2 x ptr> @ptrmask_simplify_poison_and_ones_vec(<2 x ptr> %p) { define <2 x ptr> @ptrmask_simplify_ones_vec(<2 x ptr> %p) { ; CHECK-LABEL: define <2 x ptr> @ptrmask_simplify_ones_vec ; CHECK-SAME: (<2 x ptr> [[P:%.*]]) { -; CHECK-NEXT: [[R:%.*]] = call <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> [[P]], <2 x i64> ) -; CHECK-NEXT: ret <2 x ptr> [[R]] +; CHECK-NEXT: ret <2 x ptr> [[P]] ; %r = call <2 x ptr> @llvm.ptrmask.v2p1.v2i64(<2 x ptr> %p, <2 x i64> ) ret <2 x ptr> %r @@ -72,8 +67,7 @@ define <2 x ptr> @ptrmask_simplify_ones_vec(<2 x ptr> %p) { define <2 x ptr addrspace(1) > @ptrmask_simplify_ones_i32_vec(<2 x ptr addrspace(1) > %p) { ; CHECK-LABEL: define <2 x ptr addrspace(1)> @ptrmask_simplify_ones_i32_vec ; CHECK-SAME: (<2 x ptr addrspace(1)> [[P:%.*]]) { -; CHECK-NEXT: [[R:%.*]] = call <2 x ptr addrspace(1)> @llvm.ptrmask.v2p1.v2i32(<2 x ptr addrspace(1)> [[P]], <2 x i32> ) -; CHECK-NEXT: ret <2 x ptr addrspace(1)> [[R]] +; CHECK-NEXT: ret <2 x ptr addrspace(1)> [[P]] ; %r = call <2 x ptr addrspace(1) > @llvm.ptrmask.v2p1.v2i32(<2 x ptr addrspace(1) > %p, <2 x i32> ) ret <2 x ptr addrspace(1) > %r @@ -82,8 +76,7 @@ define <2 x ptr addrspace(1) > @ptrmask_simplify_ones_i32_vec(<2 x ptr addrspace define ptr addrspace(1) @ptrmask_simplify_undef_mask(ptr addrspace(1) %p) { ; CHECK-LABEL: define ptr addrspace(1) @ptrmask_simplify_undef_mask ; CHECK-SAME: (ptr addrspace(1) [[P:%.*]]) { -; CHECK-NEXT: [[R:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[P]], i32 undef) -; CHECK-NEXT: ret ptr addrspace(1) [[R]] +; CHECK-NEXT: ret ptr addrspace(1) [[P]] ; %r = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) %p, i32 undef) ret ptr addrspace(1) %r @@ -102,8 +95,7 @@ define ptr @ptrmask_simplify_0_mask(ptr %p) { define ptr @ptrmask_simplify_1s_mask(ptr %p) { ; CHECK-LABEL: define ptr @ptrmask_simplify_1s_mask ; CHECK-SAME: (ptr [[P:%.*]]) { -; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 -1) -; CHECK-NEXT: ret ptr [[R]] +; CHECK-NEXT: ret ptr [[P]] ; %r = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 -1) ret ptr %r @@ -112,8 +104,7 @@ define ptr @ptrmask_simplify_1s_mask(ptr %p) { define ptr addrspace(1) @ptrmask_simplify_1s_mask_i32(ptr addrspace(1) %p) { ; CHECK-LABEL: define ptr addrspace(1) @ptrmask_simplify_1s_mask_i32 ; CHECK-SAME: (ptr addrspace(1) [[P:%.*]]) { -; CHECK-NEXT: [[R:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[P]], i32 -1) -; CHECK-NEXT: ret ptr addrspace(1) [[R]] +; CHECK-NEXT: ret ptr addrspace(1) [[P]] ; %r = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) %p, i32 -1) ret ptr addrspace(1) %r @@ -122,8 +113,7 @@ define ptr addrspace(1) @ptrmask_simplify_1s_mask_i32(ptr addrspace(1) %p) { define ptr @ptrmask_simplify_poison_ptr(i64 %m) { ; CHECK-LABEL: define ptr @ptrmask_simplify_poison_ptr ; CHECK-SAME: (i64 [[M:%.*]]) { -; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr poison, i64 [[M]]) -; CHECK-NEXT: ret ptr [[R]] +; CHECK-NEXT: ret ptr poison ; %r = call ptr @llvm.ptrmask.p0.i64(ptr poison, i64 %m) ret ptr %r @@ -132,8 +122,7 @@ define ptr @ptrmask_simplify_poison_ptr(i64 %m) { define ptr addrspace(1) @ptrmask_simplify_undef_ptr(i32 %m) { ; CHECK-LABEL: define ptr addrspace(1) @ptrmask_simplify_undef_ptr ; CHECK-SAME: (i32 [[M:%.*]]) { -; CHECK-NEXT: [[R:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) undef, i32 [[M]]) -; CHECK-NEXT: ret ptr addrspace(1) [[R]] +; CHECK-NEXT: ret ptr addrspace(1) null ; %r = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) undef, i32 %m) ret ptr addrspace(1) %r @@ -142,8 +131,7 @@ define ptr addrspace(1) @ptrmask_simplify_undef_ptr(i32 %m) { define ptr @ptrmask_simplify_null_ptr(i64 %m) { ; CHECK-LABEL: define ptr @ptrmask_simplify_null_ptr ; CHECK-SAME: (i64 [[M:%.*]]) { -; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr null, i64 [[M]]) -; CHECK-NEXT: ret ptr [[R]] +; CHECK-NEXT: ret ptr null ; %r = call ptr @llvm.ptrmask.p0.i64(ptr null, i64 %m) ret ptr %r @@ -152,9 +140,7 @@ define ptr @ptrmask_simplify_null_ptr(i64 %m) { define ptr @ptrmask_simplify_ptrmask(ptr %p) { ; CHECK-LABEL: define ptr @ptrmask_simplify_ptrmask ; CHECK-SAME: (ptr [[P:%.*]]) { -; CHECK-NEXT: [[M:%.*]] = ptrtoint ptr [[P]] to i64 -; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 [[M]]) -; CHECK-NEXT: ret ptr [[R]] +; CHECK-NEXT: ret ptr [[P]] ; %m = ptrtoint ptr %p to i64 %r = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 %m) @@ -164,9 +150,7 @@ define ptr @ptrmask_simplify_ptrmask(ptr %p) { define ptr addrspace(1) @ptrmask_simplify_ptrmask_i32(ptr addrspace(1) %p) { ; CHECK-LABEL: define ptr addrspace(1) @ptrmask_simplify_ptrmask_i32 ; CHECK-SAME: (ptr addrspace(1) [[P:%.*]]) { -; CHECK-NEXT: [[M:%.*]] = ptrtoint ptr addrspace(1) [[P]] to i32 -; CHECK-NEXT: [[R:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[P]], i32 [[M]]) -; CHECK-NEXT: ret ptr addrspace(1) [[R]] +; CHECK-NEXT: ret ptr addrspace(1) [[P]] ; %m = ptrtoint ptr addrspace(1) %p to i32 %r = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) %p, i32 %m) @@ -176,8 +160,7 @@ define ptr addrspace(1) @ptrmask_simplify_ptrmask_i32(ptr addrspace(1) %p) { define ptr @ptrmask_simplify_aligned_unused(ptr align 64 %p) { ; CHECK-LABEL: define ptr @ptrmask_simplify_aligned_unused ; CHECK-SAME: (ptr align 64 [[P:%.*]]) { -; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 -64) -; CHECK-NEXT: ret ptr [[R]] +; CHECK-NEXT: ret ptr [[P]] ; %r = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 -64) ret ptr %r @@ -206,8 +189,7 @@ define <2 x ptr> @ptrmask_simplify_aligned_unused_vec_todo(<2 x ptr> align 128 % define ptr addrspace(1) @ptrmask_simplify_aligned_unused_i32(ptr addrspace(1) align 64 %p) { ; CHECK-LABEL: define ptr addrspace(1) @ptrmask_simplify_aligned_unused_i32 ; CHECK-SAME: (ptr addrspace(1) align 64 [[P:%.*]]) { -; CHECK-NEXT: [[R:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[P]], i32 -64) -; CHECK-NEXT: ret ptr addrspace(1) [[R]] +; CHECK-NEXT: ret ptr addrspace(1) [[P]] ; %r = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) %p, i32 -64) ret ptr addrspace(1) %r @@ -218,8 +200,7 @@ define ptr @ptrmask_simplify_known_unused(ptr %p) { ; CHECK-SAME: (ptr [[P:%.*]]) { ; CHECK-NEXT: [[PM0:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 -64) ; CHECK-NEXT: [[PGEP:%.*]] = getelementptr i8, ptr [[PM0]], i64 32 -; CHECK-NEXT: [[R:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PGEP]], i64 -32) -; CHECK-NEXT: ret ptr [[R]] +; CHECK-NEXT: ret ptr [[PGEP]] ; %pm0 = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 -64) %pgep = getelementptr i8, ptr %pm0, i64 32 @@ -232,8 +213,7 @@ define <2 x ptr> @ptrmask_simplify_known_unused_vec(<2 x ptr> %p) { ; CHECK-SAME: (<2 x ptr> [[P:%.*]]) { ; CHECK-NEXT: [[PM0:%.*]] = call <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> [[P]], <2 x i64> ) ; CHECK-NEXT: [[PGEP:%.*]] = getelementptr i8, <2 x ptr> [[PM0]], <2 x i64> -; CHECK-NEXT: [[R:%.*]] = call <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> [[PGEP]], <2 x i64> ) -; CHECK-NEXT: ret <2 x ptr> [[R]] +; CHECK-NEXT: ret <2 x ptr> [[PGEP]] ; %pm0 = call <2 x ptr> @llvm.ptrmask.v2p1.v2i64(<2 x ptr> %p, <2 x i64> ) %pgep = getelementptr i8, <2 x ptr> %pm0, <2 x i64> @@ -246,8 +226,7 @@ define <2 x ptr> @ptrmask_simplify_known_unused_vec2(<2 x ptr> %p) { ; CHECK-SAME: (<2 x ptr> [[P:%.*]]) { ; CHECK-NEXT: [[PM0:%.*]] = call <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> [[P]], <2 x i64> ) ; CHECK-NEXT: [[PGEP:%.*]] = getelementptr i8, <2 x ptr> [[PM0]], <2 x i64> -; CHECK-NEXT: [[R:%.*]] = call <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> [[PGEP]], <2 x i64> ) -; CHECK-NEXT: ret <2 x ptr> [[R]] +; CHECK-NEXT: ret <2 x ptr> [[PGEP]] ; %pm0 = call <2 x ptr> @llvm.ptrmask.v2p1.v2i64(<2 x ptr> %p, <2 x i64> ) %pgep = getelementptr i8, <2 x ptr> %pm0, <2 x i64> @@ -260,8 +239,7 @@ define <2 x ptr> @ptrmask_simplify_known_unused_vec3(<2 x ptr> %p) { ; CHECK-SAME: (<2 x ptr> [[P:%.*]]) { ; CHECK-NEXT: [[PM0:%.*]] = call <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> [[P]], <2 x i64> ) ; CHECK-NEXT: [[PGEP:%.*]] = getelementptr i8, <2 x ptr> [[PM0]], <2 x i64> -; CHECK-NEXT: [[R:%.*]] = call <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> [[PGEP]], <2 x i64> ) -; CHECK-NEXT: ret <2 x ptr> [[R]] +; CHECK-NEXT: ret <2 x ptr> [[PGEP]] ; %pm0 = call <2 x ptr> @llvm.ptrmask.v2p1.v2i64(<2 x ptr> %p, <2 x i64> ) %pgep = getelementptr i8, <2 x ptr> %pm0, <2 x i64> @@ -274,8 +252,7 @@ define <2 x ptr> @ptrmask_simplify_known_unused_vec4(<2 x ptr> %p) { ; CHECK-SAME: (<2 x ptr> [[P:%.*]]) { ; CHECK-NEXT: [[PM0:%.*]] = call <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> [[P]], <2 x i64> ) ; CHECK-NEXT: [[PGEP:%.*]] = getelementptr i8, <2 x ptr> [[PM0]], <2 x i64> -; CHECK-NEXT: [[R:%.*]] = call <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> [[PGEP]], <2 x i64> ) -; CHECK-NEXT: ret <2 x ptr> [[R]] +; CHECK-NEXT: ret <2 x ptr> [[PGEP]] ; %pm0 = call <2 x ptr> @llvm.ptrmask.v2p1.v2i64(<2 x ptr> %p, <2 x i64> ) %pgep = getelementptr i8, <2 x ptr> %pm0, <2 x i64>