xref: /llvm-project/llvm/test/Transforms/InferAddressSpaces/AMDGPU/builtin-assumed-addrspace.ll (revision 1db674b83d2bb165d038846cbd0b88120a67535e)
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 -o - %s | FileCheck %s
3
4define float @f0(ptr %p) {
5; CHECK-LABEL: define float @f0(
6; CHECK-SAME: ptr [[P:%.*]]) {
7; CHECK-NEXT:  [[ENTRY:.*:]]
8; CHECK-NEXT:    [[IS_SHARED:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[P]])
9; CHECK-NEXT:    tail call void @llvm.assume(i1 [[IS_SHARED]])
10; CHECK-NEXT:    [[WORKITEM_ID_X:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x()
11; CHECK-NEXT:    [[IDXPROM:%.*]] = zext i32 [[WORKITEM_ID_X]] to i64
12; CHECK-NEXT:    [[TMP0:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(3)
13; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr addrspace(3) [[TMP0]], i64 [[IDXPROM]]
14; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr addrspace(3) [[ARRAYIDX]], align 4
15; CHECK-NEXT:    ret float [[LOAD]]
16;
17entry:
18  %is.shared = call i1 @llvm.amdgcn.is.shared(ptr %p)
19  tail call void @llvm.assume(i1 %is.shared)
20  %workitem.id.x = tail call i32 @llvm.amdgcn.workitem.id.x()
21  %idxprom = zext i32 %workitem.id.x to i64
22  %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom
23  %load = load float, ptr %arrayidx, align 4
24  ret float %load
25}
26
27define float @f1(ptr %p) {
28; CHECK-LABEL: define float @f1(
29; CHECK-SAME: ptr [[P:%.*]]) {
30; CHECK-NEXT:  [[ENTRY:.*:]]
31; CHECK-NEXT:    [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[P]])
32; CHECK-NEXT:    tail call void @llvm.assume(i1 [[IS_PRIVATE]])
33; CHECK-NEXT:    [[WORKITEM_ID_X:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x()
34; CHECK-NEXT:    [[IDXPROM:%.*]] = zext i32 [[WORKITEM_ID_X]] to i64
35; CHECK-NEXT:    [[TMP0:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(5)
36; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr addrspace(5) [[TMP0]], i64 [[IDXPROM]]
37; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr addrspace(5) [[ARRAYIDX]], align 4
38; CHECK-NEXT:    ret float [[LOAD]]
39;
40entry:
41  %is.private = call i1 @llvm.amdgcn.is.private(ptr %p)
42  tail call void @llvm.assume(i1 %is.private)
43  %workitem.id.x = tail call i32 @llvm.amdgcn.workitem.id.x()
44  %idxprom = zext i32 %workitem.id.x to i64
45  %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom
46  %load = load float, ptr %arrayidx, align 4
47  ret float %load
48}
49
50define float @f2(ptr %p) {
51; CHECK-LABEL: define float @f2(
52; CHECK-SAME: ptr [[P:%.*]]) {
53; CHECK-NEXT:  [[ENTRY:.*:]]
54; CHECK-NEXT:    [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[P]])
55; CHECK-NEXT:    [[NOT_PRIVATE:%.*]] = xor i1 [[IS_PRIVATE]], true
56; CHECK-NEXT:    [[IS_SHARED:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[P]])
57; CHECK-NEXT:    [[NOT_SHARED:%.*]] = xor i1 [[IS_SHARED]], true
58; CHECK-NEXT:    [[NOT_PRIVATE_AND_NOT_SHARED:%.*]] = and i1 [[NOT_PRIVATE]], [[NOT_SHARED]]
59; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NOT_PRIVATE_AND_NOT_SHARED]])
60; CHECK-NEXT:    [[WORKITEM_ID_X:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x()
61; CHECK-NEXT:    [[IDXPROM:%.*]] = zext i32 [[WORKITEM_ID_X]] to i64
62; CHECK-NEXT:    [[TMP0:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(1)
63; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr addrspace(1) [[TMP0]], i64 [[IDXPROM]]
64; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr addrspace(1) [[ARRAYIDX]], align 4
65; CHECK-NEXT:    ret float [[LOAD]]
66;
67entry:
68  %is.private = call i1 @llvm.amdgcn.is.private(ptr %p)
69  %not.private = xor i1 %is.private, true
70  %is.shared = call i1 @llvm.amdgcn.is.shared(ptr %p)
71  %not.shared = xor i1 %is.shared, true
72  %not.private.and.not.shared = and i1 %not.private, %not.shared
73  tail call void @llvm.assume(i1 %not.private.and.not.shared)
74  %workitem.id.x = tail call i32 @llvm.amdgcn.workitem.id.x()
75  %idxprom = zext i32 %workitem.id.x to i64
76  %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom
77  %load = load float, ptr %arrayidx, align 4
78  ret float %load
79}
80
81define float @g0(i32 %c, ptr %p) {
82; CHECK-LABEL: define float @g0(
83; CHECK-SAME: i32 [[C:%.*]], ptr [[P:%.*]]) {
84; CHECK-NEXT:  [[ENTRY:.*]]:
85; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[C]], 0
86; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label %[[IF_END:.*]], label %[[IF_THEN:.*]]
87; CHECK:       [[IF_THEN]]:
88; CHECK-NEXT:    [[IS_SHARED:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[P]])
89; CHECK-NEXT:    tail call void @llvm.assume(i1 [[IS_SHARED]])
90; CHECK-NEXT:    [[WORKITEM_ID_X_0:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x()
91; CHECK-NEXT:    [[IDXPROM:%.*]] = zext i32 [[WORKITEM_ID_X_0]] to i64
92; CHECK-NEXT:    [[TMP0:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(3)
93; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr addrspace(3) [[TMP0]], i64 [[IDXPROM]]
94; CHECK-NEXT:    [[LOAD0:%.*]] = load float, ptr addrspace(3) [[ARRAYIDX]], align 4
95; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[LOAD0]], 0.000000e+00
96; CHECK-NEXT:    br label %[[IF_END]]
97; CHECK:       [[IF_END]]:
98; CHECK-NEXT:    [[S:%.*]] = phi float [ [[ADD]], %[[IF_THEN]] ], [ 0.000000e+00, %[[ENTRY]] ]
99; CHECK-NEXT:    [[WORKITEM_ID_X_1:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.y()
100; CHECK-NEXT:    [[IDXPROM2:%.*]] = zext i32 [[WORKITEM_ID_X_1]] to i64
101; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds float, ptr [[P]], i64 [[IDXPROM2]]
102; CHECK-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX2]], align 4
103; CHECK-NEXT:    [[ADD2:%.*]] = fadd float [[S]], [[LOAD1]]
104; CHECK-NEXT:    ret float [[ADD2]]
105;
106entry:
107  %tobool.not = icmp eq i32 %c, 0
108  br i1 %tobool.not, label %if.end, label %if.then
109
110if.then:
111  %is.shared = call i1 @llvm.amdgcn.is.shared(ptr %p)
112  tail call void @llvm.assume(i1 %is.shared)
113  %workitem.id.x.0 = tail call i32 @llvm.amdgcn.workitem.id.x()
114  %idxprom = zext i32 %workitem.id.x.0 to i64
115  %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom
116  %load0 = load float, ptr %arrayidx, align 4
117  %add = fadd float %load0, 0.0
118  br label %if.end
119
120if.end:
121  %s = phi float [ %add, %if.then ], [ 0.0, %entry ]
122  %workitem.id.x.1 = tail call i32 @llvm.amdgcn.workitem.id.y()
123  %idxprom2 = zext i32 %workitem.id.x.1 to i64
124  %arrayidx2 = getelementptr inbounds float, ptr %p, i64 %idxprom2
125  %load1 = load float, ptr %arrayidx2, align 4
126  %add2 = fadd float %s, %load1
127  ret float %add2
128}
129
130declare void @llvm.assume(i1)
131declare i1 @llvm.amdgcn.is.shared(ptr nocapture)
132declare i1 @llvm.amdgcn.is.private(ptr nocapture)
133declare i32 @llvm.amdgcn.workitem.id.x()
134declare i32 @llvm.amdgcn.workitem.id.y()
135