Index: llvm/lib/CodeGen/IntrinsicLowering.cpp =================================================================== --- llvm/lib/CodeGen/IntrinsicLowering.cpp +++ llvm/lib/CodeGen/IntrinsicLowering.cpp @@ -333,6 +333,11 @@ case Intrinsic::var_annotation: break; // Strip out these intrinsics + case Intrinsic::experimental_ptr_provenance: + // Drop the provenance, but forward the value + CI->replaceAllUsesWith(CI->getOperand(0)); + break; + case Intrinsic::memcpy: { Type *IntPtr = DL.getIntPtrType(Context); Value *Size = Builder.CreateIntCast(CI->getArgOperand(2), IntPtr, Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp =================================================================== --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -6651,6 +6651,7 @@ case Intrinsic::ptr_annotation: case Intrinsic::launder_invariant_group: case Intrinsic::strip_invariant_group: + case Intrinsic::experimental_ptr_provenance: // Drop the intrinsic, but forward the value setValue(&I, getValue(I.getOperand(0))); return; Index: llvm/test/CodeGen/ptr_provenance.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/ptr_provenance.ll @@ -0,0 +1,8 @@ +; RUN: llc < %s + +define i32* @test(i32* %p, i32* %p.provenance) { + %p.joined = call i32* @llvm.experimental.ptr.provenance.p0i32.p0i32(i32* %p, i32* %p.provenance) + ret i32* %p.joined +} + +declare i32* @llvm.experimental.ptr.provenance.p0i32.p0i32(i32*, i32*) nounwind readnone