Skip to content

Commit 84a4c37

Browse files
aadeshps-mcwsys-ce-bb
authored andcommitted
Addition of alloca-load-store.ll, identity-function.ll, multiple-anonymous-functions.ll, trivial-function-definition.ll, trivial-function-with-call.ll (#3307)
--Test for function definitions and calls, ported from function subdirectory of llvm project. Original commit: KhronosGroup/SPIRV-LLVM-Translator@1104165ff017019
1 parent 3c2df0e commit 84a4c37

File tree

6 files changed

+235
-36
lines changed

6 files changed

+235
-36
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
; RUN: llvm-as %s -o %t.bc
2+
; RUN: llvm-spirv %t.bc -spirv-text -o %t.spt
3+
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
4+
; RUN: llvm-spirv %t.bc -o %t.spv
5+
; RUN: spirv-val %t.spv
6+
; RUN: llvm-spirv -r %t.spv -o %t.bc
7+
; RUN: llvm-dis < %t.bc | FileCheck %s --check-prefix=CHECK-LLVM
8+
9+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
10+
target triple = "spir64-unknown-unknown"
11+
12+
; CHECK-SPIRV: TypeInt [[#I32:]] 32 0
13+
; CHECK-SPIRV: TypeFunction [[#FTY_BARFOO:]] [[#I32]] [[#I32]]
14+
; CHECK-SPIRV: TypePointer [[#PTR:]] [[#]] [[#I32]]
15+
; CHECK-SPIRV: TypePointer [[#PTR_FUNC:]] [[#]] [[#]]
16+
; CHECK-SPIRV: TypeFunction [[#FTY_GOO:]] [[#I32]] [[#I32]] [[#PTR_FUNC]]
17+
18+
define i32 @bar(i32 %a) {
19+
%p = alloca i32
20+
store i32 %a, ptr %p
21+
%b = load i32, ptr %p
22+
ret i32 %b
23+
}
24+
; CHECK-SPIRV: Function [[#I32]] [[#]] 0 [[#FTY_BARFOO]]
25+
; CHECK-SPIRV: FunctionParameter [[#I32]] [[#BAR_ARG:]]
26+
; CHECK-SPIRV: Label [[#]]
27+
; CHECK-SPIRV: Variable [[#PTR]] [[#BAR_VAR:]] [[#]]
28+
; CHECK-SPIRV: Store [[#BAR_VAR]] [[#BAR_ARG]] 2 4
29+
; CHECK-SPIRV: Load [[#I32]] [[#BAR_LOAD:]] [[#BAR_VAR]] 2 4
30+
; CHECK-SPIRV: ReturnValue [[#BAR_LOAD]]
31+
; CHECK-SPIRV: FunctionEnd
32+
33+
; CHECK-LLVM: define spir_func i32 @bar(i32 [[a:%.*]])
34+
; CHECK-LLVM: [[p:%.*]] = alloca i32
35+
; CHECK-LLVM: store i32 [[a]], ptr [[p]]
36+
; CHECK-LLVM: [[b:%.*]] = load i32, ptr [[p]]
37+
38+
define i32 @foo(i32 %a) {
39+
%p = alloca i32
40+
store volatile i32 %a, ptr %p
41+
%b = load volatile i32, ptr %p
42+
ret i32 %b
43+
}
44+
45+
; CHECK-SPIRV: Function [[#I32]] [[#]] 0 [[#FTY_BARFOO]]
46+
; CHECK-SPIRV: FunctionParameter [[#I32]] [[#FOO_ARG:]]
47+
; CHECK-SPIRV: Label [[#]]
48+
; CHECK-SPIRV: Variable [[#PTR]] [[#FOO_VAR:]] [[#]]
49+
; CHECK-SPIRV: Store [[#FOO_VAR]] [[#FOO_ARG]] 3 4
50+
; CHECK-SPIRV: Load [[#I32]] [[#FOO_LOAD:]] [[#FOO_VAR]] 3 4
51+
; CHECK-SPIRV: ReturnValue [[#FOO_LOAD]]
52+
; CHECK-SPIRV: FunctionEnd
53+
54+
; CHECK-LLVM: define spir_func i32 @foo(i32 [[a:%.*]])
55+
; CHECK-LLVM: [[p:%.*]] = alloca i32
56+
; CHECK-LLVM: store volatile i32 [[a]], ptr [[p]]
57+
; CHECK-LLVM: [[b:%.*]] = load volatile i32, ptr [[p]]
58+
59+
;; Test load and store in global address space.
60+
define i32 @goo(i32 %a, ptr addrspace(1) %p) {
61+
store i32 %a, ptr addrspace(1) %p
62+
%b = load i32, ptr addrspace(1) %p
63+
ret i32 %b
64+
}
65+
66+
; CHECK-SPIRV: Function [[#I32]] [[#]] 0 [[#FTY_GOO]]
67+
; CHECK-SPIRV: FunctionParameter [[#I32]] [[#GOO_ARG:]]
68+
; CHECK-SPIRV: FunctionParameter [[#PTR_FUNC]] [[#GOO_PTR:]]
69+
; CHECK-SPIRV: Label [[#]]
70+
; CHECK-SPIRV: Store [[#GOO_PTR]] [[#GOO_ARG]] 2 4
71+
; CHECK-SPIRV: Load [[#I32]] [[#GOO_LOAD:]] [[#GOO_PTR]] 2 4
72+
; CHECK-SPIRV: ReturnValue [[#GOO_LOAD]]
73+
; CHECK-SPIRV: FunctionEnd
74+
75+
; CHECK-LLVM: define spir_func i32 @goo(i32 [[a:%.*]], ptr addrspace(1) [[p:%.*]])
76+
; CHECK-LLVM: store i32 [[a]], ptr addrspace(1) [[p]]
77+
; CHECK-LLVM: [[b:%.*]] = load i32, ptr addrspace(1) [[p]]
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
; RUN: llvm-as %s -o %t.bc
2+
; RUN: llvm-spirv %t.bc -spirv-text -o %t.spt
3+
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
4+
; RUN: llvm-spirv %t.bc -o %t.spv
5+
; RUN: spirv-val %t.spv
6+
; RUN: llvm-spirv -r %t.spv -o %t.bc
7+
; RUN: llvm-dis < %t.bc | FileCheck %s --check-prefix=CHECK-LLVM
8+
9+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
10+
target triple = "spir64-unknown-unknown"
11+
12+
; CHECK-SPIRV: TypeInt [[#I32_TY:]] 32 0
13+
; CHECK-SPIRV: TypeFunction [[#FUN_TY:]] [[#I32_TY]] [[#I32_TY]]
14+
15+
; CHECK-SPIRV: Function [[#I32_TY]] [[#]] 0 [[#FUN_TY]]
16+
; CHECK-SPIRV: FunctionParameter [[#I32_TY]] [[#]]
17+
; CHECK-SPIRV: Label [[#LBL:]]
18+
; CHECK-SPIRV: ReturnValue [[#]]
19+
; CHECK-SPIRV: FunctionEnd
20+
21+
; CHECK-LLVM: define spir_func i32 @identity(i32 [[value:%.*]])
22+
; CHECK-LLVM: ret i32 [[value]]
23+
24+
define i32 @identity(i32 %value) {
25+
ret i32 %value
26+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
; RUN: llvm-as %s -o %t.bc
2+
; RUN: llvm-spirv %t.bc -spirv-text -o %t.spt
3+
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
4+
; RUN: llvm-spirv %t.bc -o %t.spv
5+
; RUN: spirv-val %t.spv
6+
; RUN: llvm-spirv -r %t.spv -o %t.bc
7+
; RUN: llvm-dis < %t.bc | FileCheck %s --check-prefix=CHECK-LLVM
8+
9+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
10+
target triple = "spir64-unknown-unknown"
11+
12+
; CHECK-SPIRV: TypeInt [[#I32_TY:]] 32 0
13+
; CHECK-SPIRV: TypeFunction [[#I32_FUNC_TY:]] [[#I32_TY]] [[#I32_TY]]
14+
; CHECK-SPIRV: TypeFloat [[#F32_TY:]] 32
15+
; CHECK-SPIRV: TypeFunction [[#F32_FUNC_TY:]] [[#F32_TY]] [[#F32_TY]]
16+
; CHECK-SPIRV: Function [[#I32_TY]] [[#ID_1:]] 0 [[#I32_FUNC_TY]]
17+
; CHECK-SPIRV: FunctionParameter [[#I32_TY]] [[#ID_A1:]]
18+
; CHECK-SPIRV: Label [[#LBL_1:]]
19+
; CHECK-SPIRV: ReturnValue [[#ID_A1]]
20+
; CHECK-SPIRV: FunctionEnd
21+
22+
; CHECK-LLVM: define internal spir_func i32 @0(i32 %a)
23+
; CHECK-LLVM: ret i32 %a
24+
25+
define internal spir_func i32 @0(i32 %a) {
26+
ret i32 %a
27+
}
28+
29+
; CHECK-SPIRV: Function [[#F32_TY]] [[#ID_2:]] 0 [[#F32_FUNC_TY]]
30+
; CHECK-SPIRV: FunctionParameter [[#F32_TY]] [[#ID_A2:]]
31+
; CHECK-SPIRV: Label [[#LBL_2:]]
32+
; CHECK-SPIRV: ReturnValue [[#ID_A2]]
33+
; CHECK-SPIRV: FunctionEnd
34+
35+
; CHECK-LLVM: define internal spir_func float @1(float %a)
36+
; CHECK-LLVM: ret float %a
37+
38+
define internal spir_func float @1(float %a) {
39+
ret float %a
40+
}
41+
42+
; CHECK-SPIRV: FunctionCall [[#I32_TY]] [[#CALL1_ID:]] [[#ID_1]] [[#]]
43+
; CHECK-SPIRV: FunctionCall [[#F32_TY]] [[#CALL2_ID:]] [[#ID_2]] [[#]]
44+
45+
; CHECK-LLVM: define spir_kernel void @foo(i32 [[a:%.*]])
46+
; CHECK-LLVM: [[call1:%.*]] = call spir_func i32 @0(i32 [[a]])
47+
; CHECK-LLVM: [[b:%.*]] = sitofp i32 [[a]] to float
48+
; CHECK-LLVM: [[call2:%.*]] = call spir_func float @1(float [[b]])
49+
50+
define spir_kernel void @foo(i32 %a) {
51+
%call1 = call spir_func i32 @0(i32 %a)
52+
%b = sitofp i32 %a to float
53+
%call2 = call spir_func float @1(float %b)
54+
ret void
55+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
; RUN: llvm-as %s -o %t.bc
2+
; RUN: llvm-spirv %t.bc -spirv-text -o %t.spt
3+
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
4+
; RUN: llvm-spirv %t.bc -o %t.spv
5+
; RUN: spirv-val %t.spv
6+
; RUN: llvm-spirv -r %t.spv -o %t.bc
7+
; RUN: llvm-dis < %t.bc | FileCheck %s --check-prefix=CHECK-LLVM
8+
9+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
10+
target triple = "spir64-unknown-unknown"
11+
12+
;; Debug info:
13+
; CHECK-SPIRV: Name [[#FOO_ID:]] "foo"
14+
15+
;; Types:
16+
; CHECK-SPIRV: TypeVoid [[#VOID_TY:]]
17+
; CHECK-SPIRV: TypeFunction [[#VOID_FUNC_TY:]] [[#VOID_TY]]
18+
19+
;; Functions:
20+
; CHECK-SPIRV: Function [[#VOID_TY]] [[#FOO_ID]] 0 [[#VOID_FUNC_TY]]
21+
; CHECK-SPIRV-NOT: FunctionParameter
22+
;; NOTE: In 2.4, it isn't explicitly written that a function always has a least
23+
;; one block. In fact, 2.4.11 seems to imply that there are at least two
24+
;; blocks in functions with a body, but that doesn't make much sense.
25+
;; However, in order to distinguish between function declaration and
26+
;; definition, a function needs at least one block, hence why this test
27+
;; expects one OpLabel + OpReturn.
28+
; CHECK-SPIRV: Label [[#LBL_ID:]]
29+
; CHECK-SPIRV: Return
30+
; CHECK-SPIRV: FunctionEnd
31+
32+
;; Reverse translation checks:
33+
; CHECK-LLVM: define spir_func void @foo()
34+
35+
define void @foo() {
36+
ret void
37+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
; RUN: llvm-as %s -o %t.bc
2+
; RUN: llvm-spirv %t.bc -spirv-text -o %t.spt
3+
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
4+
; RUN: llvm-spirv %t.bc -o %t.spv
5+
; RUN: spirv-val %t.spv
6+
; RUN: llvm-spirv -r %t.spv -o %t.bc
7+
; RUN: llvm-dis < %t.bc | FileCheck %s --check-prefix=CHECK-LLVM
8+
9+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
10+
target triple = "spir64-unknown-unknown"
11+
12+
; CHECK-SPIRV: Name [[#BAR_ID:]] "bar"
13+
; CHECK-SPIRV: Name [[#FOO_ID:]] "foo"
14+
; CHECK-SPIRV: TypeInt [[#I32_TY:]] 32 0
15+
; CHECK-SPIRV: TypeFunction [[#BAR_FUNC_TY:]] [[#I32_TY]] [[#I32_TY]]
16+
; CHECK-SPIRV: TypeVoid [[#VOID_TY:]]
17+
; CHECK-SPIRV: TypeFunction [[#FOO_FUNC_TY:]] [[#VOID_TY]] [[#I32_TY]]
18+
;; Function decl:
19+
; CHECK-SPIRV: Function [[#I32_TY]] [[#BAR_ID]] 0 [[#BAR_FUNC_TY]]
20+
; CHECK-SPIRV: FunctionParameter [[#I32_TY]] [[#]]
21+
; CHECK-SPIRV: FunctionEnd
22+
23+
; CHECK-SPIRV: Function [[#VOID_TY]] [[#FOO_ID]] 0 [[#FOO_FUNC_TY]]
24+
; CHECK-SPIRV: FunctionParameter [[#I32_TY]] [[#X_ID:]]
25+
; CHECK-SPIRV: Label [[#LBL:]]
26+
; CHECK-SPIRV: FunctionCall [[#I32_TY]] [[#]] [[#BAR_ID]] [[#X_ID]]
27+
; CHECK-SPIRV: Return
28+
; CHECK-SPIRV-NOT: Label
29+
; CHECK-SPIRV: FunctionEnd
30+
31+
; CHECK-LLVM: declare spir_func i32 @bar(i32)
32+
; CHECK-LLVM: define spir_func void @foo(i32 [[x:%.*]])
33+
; CHECK-LLVM: [[call1:%.*]] = call spir_func i32 @bar(i32 [[x]])
34+
35+
declare i32 @bar(i32 %x)
36+
37+
define spir_func void @foo(i32 %x) {
38+
%call1 = call spir_func i32 @bar(i32 %x)
39+
ret void
40+
}

llvm-spirv/test/store.ll

Lines changed: 0 additions & 36 deletions
This file was deleted.

0 commit comments

Comments
 (0)