xref: /llvm-project/llvm/test/CodeGen/SPIRV/pointers/phi-chain-types.ll (revision b5132b7d044a5bc83eba9b09bd158cd77a511403)
1; The goal of the test case is to ensure that correct types are applied to PHI's as arguments of other PHI's.
2; Pass criterion is that spirv-val considers output valid.
3
4; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
5; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
6
7; CHECK-DAG: OpName %[[#Foo:]] "foo"
8; CHECK-DAG: OpName %[[#FooVal1:]] "val1"
9; CHECK-DAG: OpName %[[#FooVal2:]] "val2"
10; CHECK-DAG: OpName %[[#FooVal3:]] "val3"
11; CHECK-DAG: OpName %[[#Bar:]] "bar"
12; CHECK-DAG: OpName %[[#BarVal1:]] "val1"
13; CHECK-DAG: OpName %[[#BarVal2:]] "val2"
14; CHECK-DAG: OpName %[[#BarVal3:]] "val3"
15
16; CHECK-DAG: %[[#Short:]] = OpTypeInt 16 0
17; CHECK-DAG: %[[#ShortGenPtr:]] = OpTypePointer Generic %[[#Short]]
18; CHECK-DAG: %[[#ShortWrkPtr:]] = OpTypePointer Workgroup %[[#Short]]
19; CHECK-DAG: %[[#G1:]] = OpVariable %[[#ShortWrkPtr]] Workgroup
20
21; CHECK: %[[#Foo:]] = OpFunction %[[#]] None %[[#]]
22; CHECK: %[[#FooArgP:]] = OpFunctionParameter %[[#ShortGenPtr]]
23; CHECK: OpFunctionParameter
24; CHECK: OpFunctionParameter
25; CHECK: OpFunctionParameter
26; CHECK: %[[#FooG1:]] = OpPtrCastToGeneric %[[#ShortGenPtr]] %[[#G1]]
27; CHECK: %[[#FooVal2]] = OpPhi %[[#ShortGenPtr]] %[[#FooArgP]] %[[#]] %[[#FooVal3]] %[[#]]
28; CHECK: %[[#FooVal1]] = OpPhi %[[#ShortGenPtr]] %[[#FooG1]] %[[#]] %[[#FooVal2]] %[[#]]
29; CHECK: %[[#FooVal3]] = OpLoad %[[#ShortGenPtr]] %[[#]]
30
31; CHECK: %[[#Bar:]] = OpFunction %[[#]] None %[[#]]
32; CHECK: %[[#BarArgP:]] = OpFunctionParameter %[[#ShortGenPtr]]
33; CHECK: OpFunctionParameter
34; CHECK: OpFunctionParameter
35; CHECK: OpFunctionParameter
36; CHECK: %[[#BarVal3]] = OpLoad %[[#ShortGenPtr]] %[[#]]
37; CHECK: %[[#BarG1:]] = OpPtrCastToGeneric %[[#ShortGenPtr]] %[[#G1]]
38; CHECK: %[[#BarVal1]] = OpPhi %[[#ShortGenPtr]] %[[#BarG1]] %[[#]] %[[#BarVal2]] %[[#]]
39; CHECK: %[[#BarVal2]] = OpPhi %[[#ShortGenPtr]] %[[#BarArgP]] %[[#]] %[[#BarVal3]] %[[#]]
40
41@G1 = internal addrspace(3) global i16 undef, align 8
42@G2 = internal unnamed_addr addrspace(3) global ptr addrspace(4) undef, align 8
43
44define spir_kernel void @foo(ptr addrspace(4) %p, i1 %f1, i1 %f2, i1 %f3) {
45entry:
46  br label %l1
47
48l1:
49  br i1 %f1, label %l2, label %exit
50
51l2:
52  %val2 = phi ptr addrspace(4) [ %p, %l1 ], [ %val3, %l3 ]
53  %val1 = phi ptr addrspace(4) [ addrspacecast (ptr addrspace(3) @G1 to ptr addrspace(4)), %l1 ], [ %val2, %l3 ]
54  br i1 %f2, label %l3, label %exit
55
56l3:
57  %val3 = load ptr addrspace(4), ptr addrspace(3) @G2, align 8
58  br i1 %f3, label %l2, label %exit
59
60exit:
61  ret void
62}
63
64define spir_kernel void @bar(ptr addrspace(4) %p, i1 %f1, i1 %f2, i1 %f3) {
65entry:
66  %val3 = load ptr addrspace(4), ptr addrspace(3) @G2, align 8
67  br label %l1
68
69l3:
70  br i1 %f3, label %l2, label %exit
71
72l1:
73  br i1 %f1, label %l2, label %exit
74
75l2:
76  %val1 = phi ptr addrspace(4) [ addrspacecast (ptr addrspace(3) @G1 to ptr addrspace(4)), %l1 ], [ %val2, %l3 ]
77  %val2 = phi ptr addrspace(4) [ %p, %l1 ], [ %val3, %l3 ]
78  br i1 %f2, label %l3, label %exit
79
80exit:
81  ret void
82}
83