1; RUN: llc -O0 %s -o - | FileCheck %s
2
3target triple = "spirv32-unknown-unknown"
4
5; CHECK-DAG: OpName [[BAR:%.+]] "bar"
6; CHECK-DAG: OpName [[FOO:%.+]] "foo"
7; CHECK-DAG: OpName [[GOO:%.+]] "goo"
8
9; CHECK: [[INT:%.+]] = OpTypeInt 32
10; CHECK-DAG: [[STACK_PTR:%.+]] = OpTypePointer Function [[INT]]
11; CHECK-DAG: [[GLOBAL_PTR:%.+]] = OpTypePointer CrossWorkgroup [[INT]]
12; CHECK-DAG: [[FN1:%.+]] = OpTypeFunction [[INT]] [[INT]]
13; CHECK-DAG: [[FN2:%.+]] = OpTypeFunction [[INT]] [[INT]] [[GLOBAL_PTR]]
14
15define i32 @bar(i32 %a) {
16  %p = alloca i32
17  store i32 %a, i32* %p
18  %b = load i32, i32* %p
19  ret i32 %b
20}
21
22; CHECK: [[BAR]] = OpFunction [[INT]] None [[FN1]]
23; CHECK: [[A:%.+]] = OpFunctionParameter [[INT]]
24; CHECK: OpLabel
25; CHECK: [[P:%.+]] = OpVariable [[STACK_PTR]] Function
26; CHECK: OpStore [[P]] [[A]]
27; CHECK: [[B:%.+]] = OpLoad [[INT]] [[P]]
28; CHECK: OpReturnValue [[B]]
29; CHECK: OpFunctionEnd
30
31
32define i32 @foo(i32 %a) {
33  %p = alloca i32
34  store volatile i32 %a, i32* %p
35  %b = load volatile i32, i32* %p
36  ret i32 %b
37}
38
39; CHECK: [[FOO]] = OpFunction [[INT]] None [[FN1]]
40; CHECK: [[A:%.+]] = OpFunctionParameter [[INT]]
41; CHECK: OpLabel
42; CHECK: [[P:%.+]] = OpVariable [[STACK_PTR]] Function
43; CHECK: OpStore [[P]] [[A]] Volatile
44; CHECK: [[B:%.+]] = OpLoad [[INT]] [[P]] Volatile
45; CHECK: OpReturnValue [[B]]
46; CHECK: OpFunctionEnd
47
48
49; Test load and store in global address space.
50define i32 @goo(i32 %a, i32 addrspace(1)* %p) {
51  store i32 %a, i32 addrspace(1)* %p
52  %b = load i32, i32 addrspace(1)* %p
53  ret i32 %b
54}
55
56; CHECK: [[GOO]] = OpFunction [[INT]] None [[FN2]]
57; CHECK: [[A:%.+]] = OpFunctionParameter [[INT]]
58; CHECK: [[P:%.+]] = OpFunctionParameter [[GLOBAL_PTR]]
59; CHECK: OpLabel
60; CHECK: OpStore [[P]] [[A]]
61; CHECK: [[B:%.+]] = OpLoad [[INT]] [[P]]
62; CHECK: OpReturnValue [[B]]
63; CHECK: OpFunctionEnd
64