diff --git a/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp b/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp index ed73dc8903908..139cad60ebcb2 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp @@ -2366,8 +2366,12 @@ static bool containsBufferFatPointers(const Function &F, BufferFatPtrToStructTypeMap *TypeMap) { bool HasFatPointers = false; for (const BasicBlock &BB : F) - for (const Instruction &I : BB) + for (const Instruction &I : BB) { HasFatPointers |= (I.getType() != TypeMap->remapType(I.getType())); + // Catch null pointer constants in loads, stores, etc. + for (const Value *V : I.operand_values()) + HasFatPointers |= (V->getType() != TypeMap->remapType(V->getType())); + } return HasFatPointers; } diff --git a/llvm/test/CodeGen/AMDGPU/lower-buffer-fat-pointers-constants.ll b/llvm/test/CodeGen/AMDGPU/lower-buffer-fat-pointers-constants.ll index a0c1e573f8fbb..a09e392b89e63 100644 --- a/llvm/test/CodeGen/AMDGPU/lower-buffer-fat-pointers-constants.ll +++ b/llvm/test/CodeGen/AMDGPU/lower-buffer-fat-pointers-constants.ll @@ -223,3 +223,43 @@ define i32 @fancy_zero() { ptr addrspace(7) addrspacecast (ptr addrspace(8) @buf to ptr addrspace(7)) to i32) } + +define i32 @load_null() { +; CHECK-LABEL: define i32 @load_null +; CHECK-SAME: () #[[ATTR0]] { +; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) align 4 null, i32 0, i32 0, i32 0) +; CHECK-NEXT: ret i32 [[X]] +; + %x = load i32, ptr addrspace(7) null, align 4 + ret i32 %x +} + +define void @store_null() { +; CHECK-LABEL: define void @store_null +; CHECK-SAME: () #[[ATTR0]] { +; CHECK-NEXT: call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 0, ptr addrspace(8) align 4 null, i32 0, i32 0, i32 0) +; CHECK-NEXT: ret void +; + store i32 0, ptr addrspace(7) null, align 4 + ret void +} + +define i32 @load_poison() { +; CHECK-LABEL: define i32 @load_poison +; CHECK-SAME: () #[[ATTR0]] { +; CHECK-NEXT: [[X:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) align 4 poison, i32 poison, i32 0, i32 0) +; CHECK-NEXT: ret i32 [[X]] +; + %x = load i32, ptr addrspace(7) poison, align 4 + ret i32 %x +} + +define void @store_poison() { +; CHECK-LABEL: define void @store_poison +; CHECK-SAME: () #[[ATTR0]] { +; CHECK-NEXT: call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 0, ptr addrspace(8) align 4 poison, i32 poison, i32 0, i32 0) +; CHECK-NEXT: ret void +; + store i32 0, ptr addrspace(7) poison, align 4 + ret void +}