Skip to content

Commit a87640c

Browse files
authored
AMDGPU: Fix assertion on load of vector of pointers (#110436)
Fix InferAddressSpaces asserting on a load of a vector of flat pointers. Fixes #110433
1 parent af47038 commit a87640c

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -799,12 +799,11 @@ bool AMDGPUTargetMachine::isNoopAddrSpaceCast(unsigned SrcAS,
799799

800800
unsigned AMDGPUTargetMachine::getAssumedAddrSpace(const Value *V) const {
801801
const auto *LD = dyn_cast<LoadInst>(V);
802-
if (!LD)
802+
if (!LD) // TODO: Handle invariant load like constant.
803803
return AMDGPUAS::UNKNOWN_ADDRESS_SPACE;
804804

805805
// It must be a generic pointer loaded.
806-
assert(V->getType()->isPointerTy() &&
807-
V->getType()->getPointerAddressSpace() == AMDGPUAS::FLAT_ADDRESS);
806+
assert(V->getType()->getPointerAddressSpace() == AMDGPUAS::FLAT_ADDRESS);
808807

809808
const auto *Ptr = LD->getPointerOperand();
810809
if (Ptr->getType()->getPointerAddressSpace() != AMDGPUAS::CONSTANT_ADDRESS)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=infer-address-spaces %s | FileCheck %s
3+
4+
define <8 x i1> @load_vector_of_flat_ptr_from_constant(ptr addrspace(4) %ptr) {
5+
; CHECK-LABEL: define <8 x i1> @load_vector_of_flat_ptr_from_constant(
6+
; CHECK-SAME: ptr addrspace(4) [[PTR:%.*]]) {
7+
; CHECK-NEXT: [[LD:%.*]] = load <8 x ptr>, ptr addrspace(4) [[PTR]], align 128
8+
; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast <8 x ptr> [[LD]] to <8 x ptr addrspace(1)>
9+
; CHECK-NEXT: [[TMP2:%.*]] = addrspacecast <8 x ptr addrspace(1)> [[TMP1]] to <8 x ptr>
10+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <8 x ptr> [[TMP2]], zeroinitializer
11+
; CHECK-NEXT: ret <8 x i1> [[CMP]]
12+
;
13+
%ld = load <8 x ptr>, ptr addrspace(4) %ptr, align 128
14+
%cmp = icmp eq <8 x ptr> %ld, zeroinitializer
15+
ret <8 x i1> %cmp
16+
}
17+
18+
define <8 x i1> @load_vector_of_flat_ptr_from_global(ptr addrspace(1) %ptr) {
19+
; CHECK-LABEL: define <8 x i1> @load_vector_of_flat_ptr_from_global(
20+
; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) {
21+
; CHECK-NEXT: [[LD:%.*]] = load <8 x ptr>, ptr addrspace(1) [[PTR]], align 128
22+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <8 x ptr> [[LD]], zeroinitializer
23+
; CHECK-NEXT: ret <8 x i1> [[CMP]]
24+
;
25+
%ld = load <8 x ptr>, ptr addrspace(1) %ptr, align 128
26+
%cmp = icmp eq <8 x ptr> %ld, zeroinitializer
27+
ret <8 x i1> %cmp
28+
}
29+
30+
define <8 x i1> @load_vector_of_flat_ptr_from_global_invariant(ptr addrspace(1) %ptr) {
31+
; CHECK-LABEL: define <8 x i1> @load_vector_of_flat_ptr_from_global_invariant(
32+
; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) {
33+
; CHECK-NEXT: [[LD:%.*]] = load <8 x ptr>, ptr addrspace(1) [[PTR]], align 128, !invariant [[META0:![0-9]+]]
34+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <8 x ptr> [[LD]], zeroinitializer
35+
; CHECK-NEXT: ret <8 x i1> [[CMP]]
36+
;
37+
%ld = load <8 x ptr>, ptr addrspace(1) %ptr, align 128, !invariant !0
38+
%cmp = icmp eq <8 x ptr> %ld, zeroinitializer
39+
ret <8 x i1> %cmp
40+
}
41+
42+
!0 = !{}
43+
;.
44+
; CHECK: [[META0]] = !{}
45+
;.

0 commit comments

Comments
 (0)