| ; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s |
| |
| ;; NOTE: This does not check for structured control-flow operations. |
| |
| ; CHECK-DAG: OpName [[FOO:%.+]] "foo" |
| ; CHECK-DAG: OpName [[BAR:%.+]] "bar" |
| |
| ; CHECK-DAG: %[[#I32:]] = OpTypeInt 32 |
| ; CHECK-DAG: %[[#BOOL:]] = OpTypeBool |
| |
| declare i32 @foo() |
| declare i32 @bar() |
| |
| define i32 @test_if(i32 %a, i32 %b) { |
| entry: |
| %cond = icmp eq i32 %a, %b |
| br i1 %cond, label %true_label, label %false_label |
| |
| true_label: |
| %v1 = call i32 @foo() |
| br label %merge_label |
| |
| false_label: |
| %v2 = call i32 @bar() |
| br label %merge_label |
| |
| merge_label: |
| %v = phi i32 [%v1, %true_label], [%v2, %false_label] |
| ret i32 %v |
| } |
| |
| ; CHECK: OpFunction |
| ; CHECK: %[[#A:]] = OpFunctionParameter %[[#I32]] |
| ; CHECK: %[[#B:]] = OpFunctionParameter %[[#I32]] |
| |
| ; CHECK: %[[#ENTRY:]] = OpLabel |
| ; CHECK: %[[#COND:]] = OpIEqual %[[#BOOL]] %[[#A]] %[[#B]] |
| ; CHECK: OpBranchConditional %[[#COND]] %[[#TRUE_LABEL:]] %[[#FALSE_LABEL:]] |
| |
| ; CHECK: %[[#FALSE_LABEL]] = OpLabel |
| ; CHECK: %[[#V2:]] = OpFunctionCall %[[#I32]] [[BAR]] |
| ; CHECK: OpBranch %[[#MERGE_LABEL:]] |
| |
| ; CHECK: %[[#TRUE_LABEL]] = OpLabel |
| ; CHECK: %[[#V1:]] = OpFunctionCall %[[#I32]] [[FOO]] |
| ; CHECK: OpBranch %[[#MERGE_LABEL]] |
| |
| |
| ; CHECK: %[[#MERGE_LABEL]] = OpLabel |
| ; CHECK-NEXT: [[V:%.+]] = OpPhi %[[#I32]] %[[#V1]] %[[#TRUE_LABEL]] %[[#V2]] %[[#FALSE_LABEL]] |
| ; CHECK: OpReturnValue [[V]] |
| |
| ; CHECK-NEXT: OpFunctionEnd |