xref: /llvm-project/llvm/test/CodeGen/SPIRV/branching/if-merging.ll (revision 42633cf27bd2cfb44e9f332c33cfd6750b9d7be4)
1; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
2
3;; NOTE: This does not check for structured control-flow operations.
4
5; CHECK-DAG: OpName [[FOO:%.+]] "foo"
6; CHECK-DAG: OpName [[BAR:%.+]] "bar"
7
8; CHECK-DAG: %[[#I32:]] = OpTypeInt 32
9; CHECK-DAG: %[[#BOOL:]] = OpTypeBool
10
11declare i32 @foo()
12declare i32 @bar()
13
14define i32 @test_if(i32 %a, i32 %b) {
15entry:
16  %cond = icmp eq i32 %a, %b
17  br i1 %cond, label %true_label, label %false_label
18
19true_label:
20  %v1 = call i32 @foo()
21  br label %merge_label
22
23false_label:
24  %v2 = call i32 @bar()
25  br label %merge_label
26
27merge_label:
28  %v = phi i32 [%v1, %true_label], [%v2, %false_label]
29  ret i32 %v
30}
31
32; CHECK: OpFunction
33; CHECK: %[[#A:]] = OpFunctionParameter %[[#I32]]
34; CHECK: %[[#B:]] = OpFunctionParameter %[[#I32]]
35
36; CHECK: %[[#ENTRY:]] = OpLabel
37; CHECK: %[[#COND:]] = OpIEqual %[[#BOOL]] %[[#A]] %[[#B]]
38; CHECK: OpBranchConditional %[[#COND]] %[[#TRUE_LABEL:]] %[[#FALSE_LABEL:]]
39
40; CHECK: %[[#FALSE_LABEL]] = OpLabel
41; CHECK: %[[#V2:]] = OpFunctionCall %[[#I32]] [[BAR]]
42; CHECK: OpBranch %[[#MERGE_LABEL:]]
43
44; CHECK: %[[#TRUE_LABEL]] = OpLabel
45; CHECK: %[[#V1:]] = OpFunctionCall %[[#I32]] [[FOO]]
46; CHECK: OpBranch %[[#MERGE_LABEL]]
47
48
49; CHECK: %[[#MERGE_LABEL]] = OpLabel
50; CHECK-NEXT: [[V:%.+]] = OpPhi %[[#I32]] %[[#V1]] %[[#TRUE_LABEL]] %[[#V2]] %[[#FALSE_LABEL]]
51; CHECK: OpReturnValue [[V]]
52
53; CHECK-NEXT: OpFunctionEnd
54