Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / InferAddressSpaces / AMDGPU / builtin-assumed-addrspace.ll
blob14614ae3dd6cc12f8757e3281cc1d66b8b12ab6f
1 ; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=infer-address-spaces -o - %s | FileCheck %s
3 ; CHECK-LABEL: @f0
4 ; CHECK: addrspacecast ptr {{%.*}} to ptr addrspace(3)
5 ; CHECK: getelementptr inbounds float, ptr addrspace(3)
6 ; CHECK: load float, ptr addrspace(3)
7 define float @f0(ptr %p) {
8 entry:
9   %0 = call i1 @llvm.amdgcn.is.shared(ptr %p)
10   tail call void @llvm.assume(i1 %0)
11   %1 = tail call i32 @llvm.amdgcn.workitem.id.x()
12   %idxprom = zext i32 %1 to i64
13   %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom
14   %2 = load float, ptr %arrayidx, align 4
15   ret float %2
18 ; CHECK-LABEL: @f1
19 ; CHECK: addrspacecast ptr {{%.*}} to ptr addrspace(5)
20 ; CHECK: getelementptr inbounds float, ptr addrspace(5)
21 ; CHECK: load float, ptr addrspace(5)
22 define float @f1(ptr %p) {
23 entry:
24   %0 = call i1 @llvm.amdgcn.is.private(ptr %p)
25   tail call void @llvm.assume(i1 %0)
26   %1 = tail call i32 @llvm.amdgcn.workitem.id.x()
27   %idxprom = zext i32 %1 to i64
28   %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom
29   %2 = load float, ptr %arrayidx, align 4
30   ret float %2
33 ; CHECK-LABEL: @f2
34 ; CHECK: addrspacecast ptr {{%.*}} to ptr addrspace(1)
35 ; CHECK: getelementptr inbounds float, ptr addrspace(1)
36 ; CHECK: load float, ptr addrspace(1)
37 define float @f2(ptr %p) {
38 entry:
39   %0 = call i1 @llvm.amdgcn.is.private(ptr %p)
40   %1 = xor i1 %0, -1
41   %2 = call i1 @llvm.amdgcn.is.shared(ptr %p)
42   %3 = xor i1 %2, -1
43   %4 = and i1 %1, %3
44   tail call void @llvm.assume(i1 %4)
45   %5 = tail call i32 @llvm.amdgcn.workitem.id.x()
46   %idxprom = zext i32 %5 to i64
47   %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom
48   %6 = load float, ptr %arrayidx, align 4
49   ret float %6
52 ; CHECK-LABEL: @g0
53 ; CHECK: if.then:
54 ; CHECK: addrspacecast ptr {{%.*}} to ptr addrspace(3)
55 ; CHECK: getelementptr inbounds float, ptr addrspace(3)
56 ; CHECK: load float, ptr addrspace(3)
57 ; CHECK: if.end:
58 ; CHECK: getelementptr inbounds float, ptr
59 ; CHECK: load float, ptr
60 define float @g0(i32 %c, ptr %p) {
61 entry:
62   %tobool.not = icmp eq i32 %c, 0
63   br i1 %tobool.not, label %if.end, label %if.then
65 if.then:
66   %0 = call i1 @llvm.amdgcn.is.shared(ptr %p)
67   tail call void @llvm.assume(i1 %0)
68   %1 = tail call i32 @llvm.amdgcn.workitem.id.x()
69   %idxprom = zext i32 %1 to i64
70   %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom
71   %2 = load float, ptr %arrayidx, align 4
72   %add = fadd float %2, 0.
73   br label %if.end
75 if.end:
76   %s = phi float [ %add, %if.then ], [ 0., %entry ]
77   %3 = tail call i32 @llvm.amdgcn.workitem.id.y()
78   %idxprom2 = zext i32 %3 to i64
79   %arrayidx2 = getelementptr inbounds float, ptr %p, i64 %idxprom2
80   %4 = load float, ptr %arrayidx2, align 4
81   %add2 = fadd float %s, %4
82   ret float %add2
85 declare void @llvm.assume(i1)
86 declare i1 @llvm.amdgcn.is.shared(ptr nocapture)
87 declare i1 @llvm.amdgcn.is.private(ptr nocapture)
88 declare i32 @llvm.amdgcn.workitem.id.x()
89 declare i32 @llvm.amdgcn.workitem.id.y()