diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 4e96e6f4f4bd8..2411ad9ac8da2 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -3884,8 +3884,15 @@ void SelectionDAGBuilder::visitSIToFP(const User &I) { } void SelectionDAGBuilder::visitPtrToAddr(const User &I) { - // FIXME: this is not correct for pointers with addr width != pointer width - visitPtrToInt(I); + const auto &TLI = DAG.getTargetLoweringInfo(); + const DataLayout &DL = DAG.getDataLayout(); + // ptrtoaddr is equivalent to a truncate of ptrtoint to address/index width + auto Op0 = I.getOperand(0); + SDValue N = getValue(Op0); + EVT AddrVT = TLI.getValueType(DL, DL.getAddressType(Op0->getType())); + N = DAG.getPtrExtOrTrunc(N, getCurSDLoc(), AddrVT); + N = DAG.getZExtOrTrunc(N, getCurSDLoc(), TLI.getValueType(DL, I.getType())); + setValue(&I, N); } void SelectionDAGBuilder::visitPtrToInt(const User &I) { diff --git a/llvm/test/CodeGen/AMDGPU/ptrtoint-ptrtoaddr-p8.ll b/llvm/test/CodeGen/AMDGPU/ptrtoint-ptrtoaddr-p8.ll index 49d91e59dff2d..a230609a09eb8 100644 --- a/llvm/test/CodeGen/AMDGPU/ptrtoint-ptrtoaddr-p8.ll +++ b/llvm/test/CodeGen/AMDGPU/ptrtoint-ptrtoaddr-p8.ll @@ -51,9 +51,9 @@ define <2 x i64> @ptrtoaddr_vec(ptr addrspace(8) %ignored, <2 x ptr addrspace(8) ; CHECK-LABEL: ptrtoaddr_vec: ; CHECK: ; %bb.0: ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) -; CHECK-NEXT: v_mov_b32_e32 v3, v9 ; CHECK-NEXT: v_mov_b32_e32 v2, v8 -; CHECK-NEXT: v_mov_b32_e32 v1, v5 +; CHECK-NEXT: v_and_b32_e32 v1, 0xffff, v5 +; CHECK-NEXT: v_and_b32_e32 v3, 0xffff, v9 ; CHECK-NEXT: v_mov_b32_e32 v0, v4 ; CHECK-NEXT: s_setpc_b64 s[30:31] %ret = ptrtoaddr <2 x ptr addrspace(8)> %ptr to <2 x i64> @@ -78,15 +78,14 @@ define zeroext i256 @ptrtoint_ext(ptr addrspace(8) %ignored, ptr addrspace(8) %p } ;; Check that we extend the offset to i256 instead of reinterpreting all bits. -;; FIXME: this is wrong, we are removing the trunc to i48: define zeroext i256 @ptrtoaddr_ext(ptr addrspace(8) %ignored, ptr addrspace(8) %ptr) { ; CHECK-LABEL: ptrtoaddr_ext: ; CHECK: ; %bb.0: ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) -; CHECK-NEXT: v_mov_b32_e32 v3, v7 -; CHECK-NEXT: v_mov_b32_e32 v2, v6 -; CHECK-NEXT: v_mov_b32_e32 v1, v5 ; CHECK-NEXT: v_mov_b32_e32 v0, v4 +; CHECK-NEXT: v_and_b32_e32 v1, 0xffff, v5 +; CHECK-NEXT: v_mov_b32_e32 v2, 0 +; CHECK-NEXT: v_mov_b32_e32 v3, 0 ; CHECK-NEXT: v_mov_b32_e32 v4, 0 ; CHECK-NEXT: v_mov_b32_e32 v5, 0 ; CHECK-NEXT: v_mov_b32_e32 v6, 0