Skip to content

Commit 87ad912

Browse files
authored
[AMDGPULowerBufferFatPointers] Handle ptrtoaddr by extending the offset
Reviewed By: krzysz00 Pull Request: #139413
1 parent 4cdfc0d commit 87ad912

File tree

2 files changed

+30
-15
lines changed

2 files changed

+30
-15
lines changed

llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1361,6 +1361,7 @@ class SplitPtrStructs : public InstVisitor<SplitPtrStructs, PtrParts> {
13611361
PtrParts visitAtomicCmpXchgInst(AtomicCmpXchgInst &AI);
13621362
PtrParts visitGetElementPtrInst(GetElementPtrInst &GEP);
13631363

1364+
PtrParts visitPtrToAddrInst(PtrToAddrInst &PA);
13641365
PtrParts visitPtrToIntInst(PtrToIntInst &PI);
13651366
PtrParts visitIntToPtrInst(IntToPtrInst &IP);
13661367
PtrParts visitAddrSpaceCastInst(AddrSpaceCastInst &I);
@@ -1954,6 +1955,21 @@ PtrParts SplitPtrStructs::visitPtrToIntInst(PtrToIntInst &PI) {
19541955
return {nullptr, nullptr};
19551956
}
19561957

1958+
PtrParts SplitPtrStructs::visitPtrToAddrInst(PtrToAddrInst &PA) {
1959+
Value *Ptr = PA.getPointerOperand();
1960+
if (!isSplitFatPtr(Ptr->getType()))
1961+
return {nullptr, nullptr};
1962+
IRB.SetInsertPoint(&PA);
1963+
1964+
auto [Rsrc, Off] = getPtrParts(Ptr);
1965+
Value *Res = IRB.CreateIntCast(Off, PA.getType(), /*isSigned=*/false);
1966+
copyMetadata(Res, &PA);
1967+
Res->takeName(&PA);
1968+
SplitUsers.insert(&PA);
1969+
PA.replaceAllUsesWith(Res);
1970+
return {nullptr, nullptr};
1971+
}
1972+
19571973
PtrParts SplitPtrStructs::visitIntToPtrInst(IntToPtrInst &IP) {
19581974
if (!isSplitFatPtr(IP.getType()))
19591975
return {nullptr, nullptr};

llvm/test/CodeGen/AMDGPU/lower-buffer-fat-pointers-pointer-ops.ll

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2-
; FIXME: Currently generates invalid IR for ptrtoaddr
3-
; RUN: opt -S -mcpu=gfx900 -amdgpu-lower-buffer-fat-pointers -disable-verify < %s | FileCheck %s
4-
; RUN: opt -S -mcpu=gfx900 -passes=amdgpu-lower-buffer-fat-pointers -disable-verify < %s | FileCheck %s
2+
; RUN: opt -S -mcpu=gfx900 -amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s
3+
; RUN: opt -S -mcpu=gfx900 -passes=amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s
54

65
target triple = "amdgcn--"
76

@@ -256,50 +255,50 @@ define i32 @ptrtoint_offset(ptr addrspace(7) %ptr) {
256255
ret i32 %ret
257256
}
258257

259-
;; FIXME: this currently generates invalid IR
260258
define i32 @ptrtoaddr(ptr addrspace(7) %ptr) {
261259
; CHECK-LABEL: define i32 @ptrtoaddr
262260
; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]]) #[[ATTR0]] {
263-
; CHECK-NEXT: [[RET:%.*]] = ptrtoaddr { ptr addrspace(8), i32 } [[PTR]] to i32
261+
; CHECK-NEXT: [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0
262+
; CHECK-NEXT: [[RET:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1
264263
; CHECK-NEXT: ret i32 [[RET]]
265264
;
266265
%ret = ptrtoaddr ptr addrspace(7) %ptr to i32
267266
ret i32 %ret
268267
}
269268

270-
;; FIXME: this currently generates invalid IR
271269
define <2 x i32> @ptrtoaddr_vec(<2 x ptr addrspace(7)> %ptr) {
272270
; CHECK-LABEL: define <2 x i32> @ptrtoaddr_vec
273271
; CHECK-SAME: ({ <2 x ptr addrspace(8)>, <2 x i32> } [[PTR:%.*]]) #[[ATTR0]] {
274-
; CHECK-NEXT: [[RET:%.*]] = ptrtoaddr { <2 x ptr addrspace(8)>, <2 x i32> } [[PTR]] to <2 x i32>
272+
; CHECK-NEXT: [[PTR_RSRC:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[PTR]], 0
273+
; CHECK-NEXT: [[RET:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[PTR]], 1
275274
; CHECK-NEXT: ret <2 x i32> [[RET]]
276275
;
277276
%ret = ptrtoaddr <2 x ptr addrspace(7)> %ptr to <2 x i32>
278277
ret <2 x i32> %ret
279278
}
280279

281280
;; Check that we extend the offset to i160.
282-
;; FIXME: this currently generates invalid IR
283281
define i160 @ptrtoaddr_ext(ptr addrspace(7) %ptr) {
284282
; CHECK-LABEL: define i160 @ptrtoaddr_ext
285283
; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]]) #[[ATTR0]] {
286-
; CHECK-NEXT: [[ADDR:%.*]] = ptrtoaddr { ptr addrspace(8), i32 } [[PTR]] to i32
287-
; CHECK-NEXT: [[EXT:%.*]] = zext i32 [[ADDR]] to i160
288-
; CHECK-NEXT: ret i160 [[EXT]]
284+
; CHECK-NEXT: [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0
285+
; CHECK-NEXT: [[PTR_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1
286+
; CHECK-NEXT: [[RET:%.*]] = zext i32 [[PTR_OFF]] to i160
287+
; CHECK-NEXT: ret i160 [[RET]]
289288
;
290289
%addr = ptrtoaddr ptr addrspace(7) %ptr to i32
291290
%ext = zext i32 %addr to i160
292291
ret i160 %ext
293292
}
294293

295-
;; FIXME: this currently generates invalid IR
296294
;; Check that we truncate the offset to i16.
297295
define i16 @ptrtoaddr_trunc(ptr addrspace(7) %ptr) {
298296
; CHECK-LABEL: define i16 @ptrtoaddr_trunc
299297
; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]]) #[[ATTR0]] {
300-
; CHECK-NEXT: [[ADDR:%.*]] = ptrtoaddr { ptr addrspace(8), i32 } [[PTR]] to i32
301-
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i32 [[ADDR]] to i16
302-
; CHECK-NEXT: ret i16 [[TRUNC]]
298+
; CHECK-NEXT: [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0
299+
; CHECK-NEXT: [[PTR_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1
300+
; CHECK-NEXT: [[RET:%.*]] = trunc i32 [[PTR_OFF]] to i16
301+
; CHECK-NEXT: ret i16 [[RET]]
303302
;
304303
%addr = ptrtoaddr ptr addrspace(7) %ptr to i32
305304
%trunc = trunc i32 %addr to i16

0 commit comments

Comments
 (0)