xref: /llvm-project/llvm/test/CodeGen/SPIRV/simple.ll (revision 0a443f13b49b3f392461a0bb60b0146cfc4607c7)
1; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
2; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
3
4;; Support of doubles is required.
5; CHECK: OpCapability Float64
6; CHECK: "fun01"
7define spir_kernel void @fun01(i32 addrspace(1)* noalias %a, i32 addrspace(1)* %b, i32 %c) {
8entry:
9  %a.addr = alloca i32 addrspace(1)*, align 8
10  %b.addr = alloca i32 addrspace(1)*, align 8
11  %c.addr = alloca i32, align 4
12  store i32 addrspace(1)* %a, i32 addrspace(1)** %a.addr, align 8
13  store i32 addrspace(1)* %b, i32 addrspace(1)** %b.addr, align 8
14  store i32 %c, i32* %c.addr, align 4
15  %0 = load i32 addrspace(1)*, i32 addrspace(1)** %b.addr, align 8
16  %arrayidx = getelementptr inbounds i32, i32 addrspace(1)* %0, i64 0
17  %1 = load i32, i32 addrspace(1)* %arrayidx, align 4
18  %2 = load i32 addrspace(1)*, i32 addrspace(1)** %a.addr, align 8
19  %arrayidx1 = getelementptr inbounds i32, i32 addrspace(1)* %2, i64 0
20  store i32 %1, i32 addrspace(1)* %arrayidx1, align 4
21  %3 = load i32 addrspace(1)*, i32 addrspace(1)** %b.addr, align 8
22  %cmp = icmp ugt i32 addrspace(1)* %3, null
23  br i1 %cmp, label %if.then, label %if.end
24
25if.then:                                          ; preds = %entry
26  %4 = load i32 addrspace(1)*, i32 addrspace(1)** %a.addr, align 8
27  %arrayidx2 = getelementptr inbounds i32, i32 addrspace(1)* %4, i64 0
28  store i32 2, i32 addrspace(1)* %arrayidx2, align 4
29  br label %if.end
30
31if.end:                                           ; preds = %if.then, %entry
32  ret void
33}
34
35; CHECK: "fun02"
36define spir_kernel void @fun02(double addrspace(1)* %a, double addrspace(1)* %b, i32 %c) {
37entry:
38  %a.addr = alloca double addrspace(1)*, align 8
39  %b.addr = alloca double addrspace(1)*, align 8
40  %c.addr = alloca i32, align 4
41  store double addrspace(1)* %a, double addrspace(1)** %a.addr, align 8
42  store double addrspace(1)* %b, double addrspace(1)** %b.addr, align 8
43  store i32 %c, i32* %c.addr, align 4
44  %0 = load i32, i32* %c.addr, align 4
45  %idxprom = sext i32 %0 to i64
46  %1 = load double addrspace(1)*, double addrspace(1)** %b.addr, align 8
47  %arrayidx = getelementptr inbounds double, double addrspace(1)* %1, i64 %idxprom
48  %2 = load double, double addrspace(1)* %arrayidx, align 8
49  %3 = load i32, i32* %c.addr, align 4
50  %idxprom1 = sext i32 %3 to i64
51  %4 = load double addrspace(1)*, double addrspace(1)** %a.addr, align 8
52  %arrayidx2 = getelementptr inbounds double, double addrspace(1)* %4, i64 %idxprom1
53  store double %2, double addrspace(1)* %arrayidx2, align 8
54  ret void
55}
56
57; CHECK: "test_builtin"
58define spir_func void @test_builtin(i32 addrspace(1)* %in, i32 addrspace(1)* %out) {
59entry:
60  %in.addr = alloca i32 addrspace(1)*, align 8
61  %out.addr = alloca i32 addrspace(1)*, align 8
62  %n = alloca i32, align 4
63  store i32 addrspace(1)* %in, i32 addrspace(1)** %in.addr, align 8
64  store i32 addrspace(1)* %out, i32 addrspace(1)** %out.addr, align 8
65  %call = call spir_func i64 @_Z13get_global_idj(i32 0)
66  %conv = trunc i64 %call to i32
67  store i32 %conv, i32* %n, align 4
68  %0 = load i32, i32* %n, align 4
69  %idxprom = sext i32 %0 to i64
70  %1 = load i32 addrspace(1)*, i32 addrspace(1)** %in.addr, align 8
71  %arrayidx = getelementptr inbounds i32, i32 addrspace(1)* %1, i64 %idxprom
72  %2 = load i32, i32 addrspace(1)* %arrayidx, align 4
73  %call1 = call spir_func i32 @_Z3absi(i32 %2)
74  %3 = load i32, i32* %n, align 4
75  %idxprom2 = sext i32 %3 to i64
76  %4 = load i32 addrspace(1)*, i32 addrspace(1)** %out.addr, align 8
77  %arrayidx3 = getelementptr inbounds i32, i32 addrspace(1)* %4, i64 %idxprom2
78  store i32 %call1, i32 addrspace(1)* %arrayidx3, align 4
79  ret void
80}
81
82; CHECK-NOT: "_Z13get_global_idj"
83declare spir_func i64 @_Z13get_global_idj(i32)
84
85; CHECK-NOT: "_Z3absi"
86declare spir_func i32 @_Z3absi(i32)
87
88; CHECK: "myabs"
89define spir_func i32 @myabs(i32 %x) {
90entry:
91  %x.addr = alloca i32, align 4
92  store i32 %x, i32* %x.addr, align 4
93  %0 = load i32, i32* %x.addr, align 4
94  %call = call spir_func i32 @_Z3absi(i32 %0)
95  ret i32 %call
96}
97
98; CHECK: "test_function_call"
99define spir_func void @test_function_call(i32 addrspace(1)* %in, i32 addrspace(1)* %out) {
100entry:
101  %in.addr = alloca i32 addrspace(1)*, align 8
102  %out.addr = alloca i32 addrspace(1)*, align 8
103  %n = alloca i32, align 4
104  store i32 addrspace(1)* %in, i32 addrspace(1)** %in.addr, align 8
105  store i32 addrspace(1)* %out, i32 addrspace(1)** %out.addr, align 8
106  %call = call spir_func i64 @_Z13get_global_idj(i32 0)
107  %conv = trunc i64 %call to i32
108  store i32 %conv, i32* %n, align 4
109  %0 = load i32, i32* %n, align 4
110  %idxprom = sext i32 %0 to i64
111  %1 = load i32 addrspace(1)*, i32 addrspace(1)** %in.addr, align 8
112  %arrayidx = getelementptr inbounds i32, i32 addrspace(1)* %1, i64 %idxprom
113  %2 = load i32, i32 addrspace(1)* %arrayidx, align 4
114  %call1 = call spir_func i32 @myabs(i32 %2)
115  %3 = load i32, i32* %n, align 4
116  %idxprom2 = sext i32 %3 to i64
117  %4 = load i32 addrspace(1)*, i32 addrspace(1)** %out.addr, align 8
118  %arrayidx3 = getelementptr inbounds i32, i32 addrspace(1)* %4, i64 %idxprom2
119  store i32 %call1, i32 addrspace(1)* %arrayidx3, align 4
120  ret void
121}
122