xref: /llvm-project/llvm/test/CodeGen/SPIRV/pointers/phi-valid-operand-types.ll (revision b5132b7d044a5bc83eba9b09bd158cd77a511403)
1; RUN: llc -verify-machineinstrs -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; CHECK-DAG: %[[#Char:]] = OpTypeInt 8 0
5; CHECK-DAG: %[[#PtrChar:]] = OpTypePointer Function %[[#Char]]
6; CHECK-DAG: %[[#Int:]] = OpTypeInt 32 0
7; CHECK-DAG: %[[#PtrInt:]] = OpTypePointer Function %[[#Int]]
8; CHECK: %[[#R1:]] = OpFunctionCall %[[#PtrChar]] %[[#]]
9; CHECK: %[[#R2:]] = OpFunctionCall %[[#PtrInt]] %[[#]]
10; CHECK: %[[#Casted:]] = OpBitcast %[[#PtrChar]] %[[#R2]]
11; CHECK: OpPhi %[[#PtrChar]] %[[#R1]] %[[#]] %[[#Casted]] %[[#]]
12
13define ptr @foo(i1 %arg) {
14entry:
15  %r1 = tail call ptr @f1()
16  %r2 = tail call ptr @f2()
17  br i1 %arg, label %l1, label %l2
18
19l1:
20  br label %exit
21
22l2:
23  br label %exit
24
25exit:
26  %ret = phi ptr [ %r1, %l1 ], [ %r2, %l2 ]
27  %ret2 = phi ptr [ %r1, %l1 ], [ %r2, %l2 ]
28  tail call void @f0(ptr %ret)
29  ret ptr %ret2
30}
31
32define void @f0(ptr %arg) {
33entry:
34  ret void
35}
36
37define ptr @f1() {
38entry:
39  %p = alloca i8
40  store i8 8, ptr %p
41  ret ptr %p
42}
43
44define ptr @f2() {
45entry:
46  %p = alloca i32
47  store i32 32, ptr %p
48  ret ptr %p
49}
50