diff --git a/llvm/include/llvm/CodeGen/GlobalISel/IRTranslator.h b/llvm/include/llvm/CodeGen/GlobalISel/IRTranslator.h index 3d7ccd55ee042..41d03c9fb3ed5 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/IRTranslator.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/IRTranslator.h @@ -486,10 +486,7 @@ class IRTranslator : public MachineFunctionPass { bool translatePtrToInt(const User &U, MachineIRBuilder &MIRBuilder) { return translateCast(TargetOpcode::G_PTRTOINT, U, MIRBuilder); } - bool translatePtrToAddr(const User &U, MachineIRBuilder &MIRBuilder) { - // FIXME: this is not correct for pointers with addr width != pointer width - return translatePtrToInt(U, MIRBuilder); - } + bool translatePtrToAddr(const User &U, MachineIRBuilder &MIRBuilder); bool translateTrunc(const User &U, MachineIRBuilder &MIRBuilder) { return translateCast(TargetOpcode::G_TRUNC, U, MIRBuilder); } diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index fe5dcd14d8804..1c7507c60384e 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -1583,6 +1583,20 @@ bool IRTranslator::translateCast(unsigned Opcode, const User &U, return true; } +bool IRTranslator::translatePtrToAddr(const User &U, + MachineIRBuilder &MIRBuilder) { + Register Op = getOrCreateVReg(*U.getOperand(0)); + Type *PtrTy = U.getOperand(0)->getType(); + LLT AddrTy = getLLTForType(*DL->getAddressType(PtrTy), *DL); + auto IntPtrTy = getLLTForType(*DL->getIntPtrType(PtrTy), *DL); + auto PtrToInt = MIRBuilder.buildPtrToInt(IntPtrTy, Op); + auto Addr = PtrToInt; + if (AddrTy != IntPtrTy) + Addr = MIRBuilder.buildTrunc(AddrTy, PtrToInt.getReg(0)); + MIRBuilder.buildZExtOrTrunc(getOrCreateVReg(U), Addr.getReg(0)); + return true; +} + bool IRTranslator::translateGetElementPtr(const User &U, MachineIRBuilder &MIRBuilder) { Value &Op0 = *U.getOperand(0); diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/ptrtoint-ptrtoaddr-p8.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/ptrtoint-ptrtoaddr-p8.ll index 8f7867c8030d9..6f31de9dd2909 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/ptrtoint-ptrtoaddr-p8.ll +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/ptrtoint-ptrtoaddr-p8.ll @@ -52,9 +52,9 @@ define <2 x i64> @ptrtoaddr_vec(ptr addrspace(8) %ignored, <2 x ptr addrspace(8) ; CHECK: ; %bb.0: ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) ; CHECK-NEXT: v_mov_b32_e32 v0, v4 -; 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 v2, v8 -; CHECK-NEXT: v_mov_b32_e32 v3, v9 ; CHECK-NEXT: s_setpc_b64 s[30:31] %ret = ptrtoaddr <2 x ptr addrspace(8)> %ptr to <2 x i64> ret <2 x i64> %ret @@ -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 v0, v4 -; CHECK-NEXT: v_mov_b32_e32 v1, v5 -; CHECK-NEXT: v_mov_b32_e32 v2, v6 -; CHECK-NEXT: v_mov_b32_e32 v3, v7 +; 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