xref: /llvm-project/mlir/test/Target/SPIRV/phi.mlir (revision e4889c0a046e251bfaf27a637df606112659be89)
1*e4889c0aSrkayaith// RUN: mlir-translate -no-implicit-module -split-input-file -test-spirv-roundtrip %s | FileCheck %s
201178654SLei Zhang
301178654SLei Zhang// Test branch with one block argument
401178654SLei Zhang
55ab6ef75SJakub Kuderskispirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
65ab6ef75SJakub Kuderski  spirv.func @foo() -> () "None" {
75ab6ef75SJakub Kuderski// CHECK:        %[[CST:.*]] = spirv.Constant 0
85ab6ef75SJakub Kuderski    %zero = spirv.Constant 0 : i32
95ab6ef75SJakub Kuderski// CHECK-NEXT:   spirv.Branch ^bb1(%[[CST]] : i32)
105ab6ef75SJakub Kuderski    spirv.Branch ^bb1(%zero : i32)
1101178654SLei Zhang// CHECK-NEXT: ^bb1(%{{.*}}: i32):
1201178654SLei Zhang  ^bb1(%arg0: i32):
135ab6ef75SJakub Kuderski   spirv.Return
1401178654SLei Zhang  }
1501178654SLei Zhang
165ab6ef75SJakub Kuderski  spirv.func @main() -> () "None" {
175ab6ef75SJakub Kuderski    spirv.Return
1801178654SLei Zhang  }
195ab6ef75SJakub Kuderski  spirv.EntryPoint "GLCompute" @main
2001178654SLei Zhang}
2101178654SLei Zhang
2201178654SLei Zhang// -----
2301178654SLei Zhang
2401178654SLei Zhang// Test branch with multiple block arguments
2501178654SLei Zhang
265ab6ef75SJakub Kuderskispirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
275ab6ef75SJakub Kuderski  spirv.func @foo() -> () "None" {
285ab6ef75SJakub Kuderski// CHECK:        %[[ZERO:.*]] = spirv.Constant 0
295ab6ef75SJakub Kuderski    %zero = spirv.Constant 0 : i32
305ab6ef75SJakub Kuderski// CHECK-NEXT:   %[[ONE:.*]] = spirv.Constant 1
315ab6ef75SJakub Kuderski    %one = spirv.Constant 1.0 : f32
325ab6ef75SJakub Kuderski// CHECK-NEXT:   spirv.Branch ^bb1(%[[ZERO]], %[[ONE]] : i32, f32)
335ab6ef75SJakub Kuderski    spirv.Branch ^bb1(%zero, %one : i32, f32)
3401178654SLei Zhang
3501178654SLei Zhang// CHECK-NEXT: ^bb1(%{{.*}}: i32, %{{.*}}: f32):     // pred: ^bb0
3601178654SLei Zhang  ^bb1(%arg0: i32, %arg1: f32):
375ab6ef75SJakub Kuderski   spirv.Return
3801178654SLei Zhang  }
3901178654SLei Zhang
405ab6ef75SJakub Kuderski  spirv.func @main() -> () "None" {
415ab6ef75SJakub Kuderski    spirv.Return
4201178654SLei Zhang  }
435ab6ef75SJakub Kuderski  spirv.EntryPoint "GLCompute" @main
4401178654SLei Zhang}
4501178654SLei Zhang
4601178654SLei Zhang// -----
4701178654SLei Zhang
4801178654SLei Zhang// Test using block arguments within branch
4901178654SLei Zhang
505ab6ef75SJakub Kuderskispirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
515ab6ef75SJakub Kuderski  spirv.func @foo() -> () "None" {
525ab6ef75SJakub Kuderski// CHECK:        %[[CST0:.*]] = spirv.Constant 0
535ab6ef75SJakub Kuderski    %zero = spirv.Constant 0 : i32
545ab6ef75SJakub Kuderski// CHECK-NEXT:   spirv.Branch ^bb1(%[[CST0]] : i32)
555ab6ef75SJakub Kuderski    spirv.Branch ^bb1(%zero : i32)
5601178654SLei Zhang
5701178654SLei Zhang// CHECK-NEXT: ^bb1(%[[ARG:.*]]: i32):
5801178654SLei Zhang  ^bb1(%arg0: i32):
595ab6ef75SJakub Kuderski// CHECK-NEXT:   %[[ADD:.*]] = spirv.IAdd %[[ARG]], %[[ARG]] : i32
605ab6ef75SJakub Kuderski    %0 = spirv.IAdd %arg0, %arg0 : i32
615ab6ef75SJakub Kuderski// CHECK-NEXT:   %[[CST1:.*]] = spirv.Constant 0
625ab6ef75SJakub Kuderski// CHECK-NEXT:   spirv.Branch ^bb2(%[[CST1]], %[[ADD]] : i32, i32)
635ab6ef75SJakub Kuderski    spirv.Branch ^bb2(%zero, %0 : i32, i32)
6401178654SLei Zhang
6501178654SLei Zhang// CHECK-NEXT: ^bb2(%{{.*}}: i32, %{{.*}}: i32):
6601178654SLei Zhang  ^bb2(%arg1: i32, %arg2: i32):
675ab6ef75SJakub Kuderski   spirv.Return
6801178654SLei Zhang  }
6901178654SLei Zhang
705ab6ef75SJakub Kuderski  spirv.func @main() -> () "None" {
715ab6ef75SJakub Kuderski    spirv.Return
7201178654SLei Zhang  }
735ab6ef75SJakub Kuderski  spirv.EntryPoint "GLCompute" @main
7401178654SLei Zhang}
7501178654SLei Zhang
7601178654SLei Zhang// -----
7701178654SLei Zhang
7801178654SLei Zhang// Test block not following domination order
7901178654SLei Zhang
805ab6ef75SJakub Kuderskispirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
815ab6ef75SJakub Kuderski  spirv.func @foo() -> () "None" {
825ab6ef75SJakub Kuderski// CHECK:        spirv.Branch ^bb1
835ab6ef75SJakub Kuderski    spirv.Branch ^bb1
8401178654SLei Zhang
8501178654SLei Zhang// CHECK-NEXT: ^bb1:
865ab6ef75SJakub Kuderski// CHECK-NEXT:   %[[ZERO:.*]] = spirv.Constant 0
875ab6ef75SJakub Kuderski// CHECK-NEXT:   %[[ONE:.*]] = spirv.Constant 1
885ab6ef75SJakub Kuderski// CHECK-NEXT:   spirv.Branch ^bb2(%[[ZERO]], %[[ONE]] : i32, f32)
8901178654SLei Zhang
9001178654SLei Zhang// CHECK-NEXT: ^bb2(%{{.*}}: i32, %{{.*}}: f32):
9101178654SLei Zhang  ^bb2(%arg0: i32, %arg1: f32):
925ab6ef75SJakub Kuderski// CHECK-NEXT:   spirv.Return
935ab6ef75SJakub Kuderski   spirv.Return
9401178654SLei Zhang
9501178654SLei Zhang  // This block is reordered to follow domination order.
9601178654SLei Zhang  ^bb1:
975ab6ef75SJakub Kuderski    %zero = spirv.Constant 0 : i32
985ab6ef75SJakub Kuderski    %one = spirv.Constant 1.0 : f32
995ab6ef75SJakub Kuderski    spirv.Branch ^bb2(%zero, %one : i32, f32)
10001178654SLei Zhang  }
10101178654SLei Zhang
1025ab6ef75SJakub Kuderski  spirv.func @main() -> () "None" {
1035ab6ef75SJakub Kuderski    spirv.Return
10401178654SLei Zhang  }
1055ab6ef75SJakub Kuderski  spirv.EntryPoint "GLCompute" @main
10601178654SLei Zhang}
10701178654SLei Zhang
10801178654SLei Zhang// -----
10901178654SLei Zhang
11001178654SLei Zhang// Test multiple predecessors
11101178654SLei Zhang
1125ab6ef75SJakub Kuderskispirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
1135ab6ef75SJakub Kuderski  spirv.func @foo() -> () "None" {
1145ab6ef75SJakub Kuderski    %var = spirv.Variable : !spirv.ptr<i32, Function>
11501178654SLei Zhang
1165ab6ef75SJakub Kuderski// CHECK:      spirv.mlir.selection
1175ab6ef75SJakub Kuderski    spirv.mlir.selection {
1185ab6ef75SJakub Kuderski      %true = spirv.Constant true
1195ab6ef75SJakub Kuderski// CHECK:        spirv.BranchConditional %{{.*}}, ^bb1, ^bb2
1205ab6ef75SJakub Kuderski      spirv.BranchConditional %true, ^true, ^false
12101178654SLei Zhang
12201178654SLei Zhang// CHECK-NEXT: ^bb1:
12301178654SLei Zhang    ^true:
1245ab6ef75SJakub Kuderski// CHECK-NEXT:   %[[ZERO:.*]] = spirv.Constant 0
1255ab6ef75SJakub Kuderski      %zero = spirv.Constant 0 : i32
1265ab6ef75SJakub Kuderski// CHECK-NEXT:   spirv.Branch ^bb3(%[[ZERO]] : i32)
1275ab6ef75SJakub Kuderski      spirv.Branch ^phi(%zero: i32)
12801178654SLei Zhang
12901178654SLei Zhang// CHECK-NEXT: ^bb2:
13001178654SLei Zhang    ^false:
1315ab6ef75SJakub Kuderski// CHECK-NEXT:   %[[ONE:.*]] = spirv.Constant 1
1325ab6ef75SJakub Kuderski      %one = spirv.Constant 1 : i32
1335ab6ef75SJakub Kuderski// CHECK-NEXT:   spirv.Branch ^bb3(%[[ONE]] : i32)
1345ab6ef75SJakub Kuderski      spirv.Branch ^phi(%one: i32)
13501178654SLei Zhang
13601178654SLei Zhang// CHECK-NEXT: ^bb3(%[[ARG:.*]]: i32):
13701178654SLei Zhang    ^phi(%arg: i32):
1385ab6ef75SJakub Kuderski// CHECK-NEXT:   spirv.Store "Function" %{{.*}}, %[[ARG]] : i32
1395ab6ef75SJakub Kuderski      spirv.Store "Function" %var, %arg : i32
1405ab6ef75SJakub Kuderski// CHECK-NEXT:   spirv.Return
1415ab6ef75SJakub Kuderski      spirv.Return
14201178654SLei Zhang
14301178654SLei Zhang// CHECK-NEXT: ^bb4:
14401178654SLei Zhang    ^merge:
1455ab6ef75SJakub Kuderski// CHECK-NEXT:   spirv.mlir.merge
1465ab6ef75SJakub Kuderski      spirv.mlir.merge
14701178654SLei Zhang    }
1485ab6ef75SJakub Kuderski    spirv.Return
14901178654SLei Zhang  }
15001178654SLei Zhang
1515ab6ef75SJakub Kuderski  spirv.func @main() -> () "None" {
1525ab6ef75SJakub Kuderski    spirv.Return
15301178654SLei Zhang  }
1545ab6ef75SJakub Kuderski  spirv.EntryPoint "GLCompute" @main
15501178654SLei Zhang}
15601178654SLei Zhang
15701178654SLei Zhang// -----
15801178654SLei Zhang
15901178654SLei Zhang// Test nested loops with block arguments
16001178654SLei Zhang
1615ab6ef75SJakub Kuderskispirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
1625ab6ef75SJakub Kuderski  spirv.GlobalVariable @__builtin_var_NumWorkgroups__ built_in("NumWorkgroups") : !spirv.ptr<vector<3xi32>, Input>
1635ab6ef75SJakub Kuderski  spirv.GlobalVariable @__builtin_var_WorkgroupId__ built_in("WorkgroupId") : !spirv.ptr<vector<3xi32>, Input>
1645ab6ef75SJakub Kuderski  spirv.func @fmul_kernel() "None" {
1655ab6ef75SJakub Kuderski    %3 = spirv.Constant 12 : i32
1665ab6ef75SJakub Kuderski    %4 = spirv.Constant 32 : i32
1675ab6ef75SJakub Kuderski    %5 = spirv.Constant 4 : i32
1685ab6ef75SJakub Kuderski    %6 = spirv.mlir.addressof @__builtin_var_WorkgroupId__ : !spirv.ptr<vector<3xi32>, Input>
1695ab6ef75SJakub Kuderski    %7 = spirv.Load "Input" %6 : vector<3xi32>
1705ab6ef75SJakub Kuderski    %8 = spirv.CompositeExtract %7[0 : i32] : vector<3xi32>
1715ab6ef75SJakub Kuderski    %9 = spirv.mlir.addressof @__builtin_var_WorkgroupId__ : !spirv.ptr<vector<3xi32>, Input>
1725ab6ef75SJakub Kuderski    %10 = spirv.Load "Input" %9 : vector<3xi32>
1735ab6ef75SJakub Kuderski    %11 = spirv.CompositeExtract %10[1 : i32] : vector<3xi32>
1745ab6ef75SJakub Kuderski    %18 = spirv.mlir.addressof @__builtin_var_NumWorkgroups__ : !spirv.ptr<vector<3xi32>, Input>
1755ab6ef75SJakub Kuderski    %19 = spirv.Load "Input" %18 : vector<3xi32>
1765ab6ef75SJakub Kuderski    %20 = spirv.CompositeExtract %19[0 : i32] : vector<3xi32>
1775ab6ef75SJakub Kuderski    %21 = spirv.mlir.addressof @__builtin_var_NumWorkgroups__ : !spirv.ptr<vector<3xi32>, Input>
1785ab6ef75SJakub Kuderski    %22 = spirv.Load "Input" %21 : vector<3xi32>
1795ab6ef75SJakub Kuderski    %23 = spirv.CompositeExtract %22[1 : i32] : vector<3xi32>
1805ab6ef75SJakub Kuderski    %30 = spirv.IMul %11, %4 : i32
1815ab6ef75SJakub Kuderski    %31 = spirv.IMul %23, %4 : i32
18201178654SLei Zhang
1835ab6ef75SJakub Kuderski// CHECK:   spirv.Branch ^[[FN_BB:.*]](%{{.*}} : i32)
18401178654SLei Zhang// CHECK: ^[[FN_BB]](%[[FN_BB_ARG:.*]]: i32):
1855ab6ef75SJakub Kuderski// CHECK:   spirv.mlir.loop {
1865ab6ef75SJakub Kuderski    spirv.mlir.loop {
1875ab6ef75SJakub Kuderski// CHECK:     spirv.Branch ^bb1(%[[FN_BB_ARG]] : i32)
1885ab6ef75SJakub Kuderski      spirv.Branch ^bb1(%30 : i32)
18901178654SLei Zhang// CHECK:   ^[[LP1_HDR:.*]](%[[LP1_HDR_ARG:.*]]: i32):
19001178654SLei Zhang    ^bb1(%32: i32):
1915ab6ef75SJakub Kuderski// CHECK:     spirv.SLessThan
1925ab6ef75SJakub Kuderski      %33 = spirv.SLessThan %32, %3 : i32
1935ab6ef75SJakub Kuderski// CHECK:     spirv.BranchConditional %{{.*}}, ^[[LP1_BDY:.*]], ^[[LP1_MG:.*]]
1945ab6ef75SJakub Kuderski      spirv.BranchConditional %33, ^bb2, ^bb3
19501178654SLei Zhang// CHECK:   ^[[LP1_BDY]]:
19601178654SLei Zhang    ^bb2:
1975ab6ef75SJakub Kuderski// CHECK:     %[[MUL:.*]] = spirv.IMul
1985ab6ef75SJakub Kuderski      %34 = spirv.IMul %8, %5 : i32
1995ab6ef75SJakub Kuderski// CHECK:     spirv.IMul
2005ab6ef75SJakub Kuderski      %35 = spirv.IMul %20, %5 : i32
2015ab6ef75SJakub Kuderski// CHECK:     spirv.Branch ^[[LP1_CNT:.*]](%[[MUL]] : i32)
20201178654SLei Zhang// CHECK:   ^[[LP1_CNT]](%[[LP1_CNT_ARG:.*]]: i32):
2035ab6ef75SJakub Kuderski// CHECK:     spirv.mlir.loop {
2045ab6ef75SJakub Kuderski      spirv.mlir.loop {
2055ab6ef75SJakub Kuderski// CHECK:       spirv.Branch ^[[LP2_HDR:.*]](%[[LP1_CNT_ARG]] : i32)
2065ab6ef75SJakub Kuderski        spirv.Branch ^bb1(%34 : i32)
20701178654SLei Zhang// CHECK:     ^[[LP2_HDR]](%[[LP2_HDR_ARG:.*]]: i32):
20801178654SLei Zhang      ^bb1(%37: i32):
2095ab6ef75SJakub Kuderski// CHECK:       spirv.SLessThan %[[LP2_HDR_ARG]]
2105ab6ef75SJakub Kuderski        %38 = spirv.SLessThan %37, %5 : i32
2115ab6ef75SJakub Kuderski// CHECK:       spirv.BranchConditional %{{.*}}, ^[[LP2_BDY:.*]], ^[[LP2_MG:.*]]
2125ab6ef75SJakub Kuderski        spirv.BranchConditional %38, ^bb2, ^bb3
21301178654SLei Zhang// CHECK:     ^[[LP2_BDY]]:
21401178654SLei Zhang      ^bb2:
2155ab6ef75SJakub Kuderski// CHECK:       %[[ADD1:.*]] = spirv.IAdd
2165ab6ef75SJakub Kuderski        %48 = spirv.IAdd %37, %35 : i32
2175ab6ef75SJakub Kuderski// CHECK:       spirv.Branch ^[[LP2_HDR]](%[[ADD1]] : i32)
2185ab6ef75SJakub Kuderski        spirv.Branch ^bb1(%48 : i32)
21901178654SLei Zhang// CHECK:     ^[[LP2_MG]]:
22001178654SLei Zhang      ^bb3:
2215ab6ef75SJakub Kuderski// CHECK:       spirv.mlir.merge
2225ab6ef75SJakub Kuderski        spirv.mlir.merge
22301178654SLei Zhang      }
2245ab6ef75SJakub Kuderski// CHECK:     %[[ADD2:.*]] = spirv.IAdd %[[LP1_HDR_ARG]]
2255ab6ef75SJakub Kuderski      %36 = spirv.IAdd %32, %31 : i32
2265ab6ef75SJakub Kuderski// CHECK:     spirv.Branch ^[[LP1_HDR]](%[[ADD2]] : i32)
2275ab6ef75SJakub Kuderski      spirv.Branch ^bb1(%36 : i32)
22801178654SLei Zhang// CHECK:   ^[[LP1_MG]]:
22901178654SLei Zhang    ^bb3:
2305ab6ef75SJakub Kuderski// CHECK:     spirv.mlir.merge
2315ab6ef75SJakub Kuderski      spirv.mlir.merge
23201178654SLei Zhang    }
2335ab6ef75SJakub Kuderski    spirv.Return
23401178654SLei Zhang  }
23501178654SLei Zhang
2365ab6ef75SJakub Kuderski  spirv.EntryPoint "GLCompute" @fmul_kernel, @__builtin_var_WorkgroupId__, @__builtin_var_NumWorkgroups__
2375ab6ef75SJakub Kuderski  spirv.ExecutionMode @fmul_kernel "LocalSize", 32, 1, 1
23801178654SLei Zhang}
23901178654SLei Zhang
24001178654SLei Zhang// -----
24101178654SLei Zhang
24201178654SLei Zhang// Test back-to-back loops with block arguments
24301178654SLei Zhang
2445ab6ef75SJakub Kuderskispirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
2455ab6ef75SJakub Kuderski  spirv.func @fmul_kernel() "None" {
2465ab6ef75SJakub Kuderski    %cst4 = spirv.Constant 4 : i32
24701178654SLei Zhang
2485ab6ef75SJakub Kuderski    %val1 = spirv.Constant 43 : i32
2495ab6ef75SJakub Kuderski    %val2 = spirv.Constant 44 : i32
25001178654SLei Zhang
2515ab6ef75SJakub Kuderski// CHECK:        spirv.Constant 43
2525ab6ef75SJakub Kuderski// CHECK-NEXT:   spirv.Branch ^[[BB1:.+]](%{{.+}} : i32)
25301178654SLei Zhang// CHECK-NEXT: ^[[BB1]](%{{.+}}: i32):
2545ab6ef75SJakub Kuderski// CHECK-NEXT:   spirv.mlir.loop
2555ab6ef75SJakub Kuderski    spirv.mlir.loop { // loop 1
2565ab6ef75SJakub Kuderski      spirv.Branch ^bb1(%val1 : i32)
25701178654SLei Zhang    ^bb1(%loop1_bb_arg: i32):
2585ab6ef75SJakub Kuderski      %loop1_lt = spirv.SLessThan %loop1_bb_arg, %cst4 : i32
2595ab6ef75SJakub Kuderski      spirv.BranchConditional %loop1_lt, ^bb2, ^bb3
26001178654SLei Zhang    ^bb2:
2615ab6ef75SJakub Kuderski      %loop1_add = spirv.IAdd %loop1_bb_arg, %cst4 : i32
2625ab6ef75SJakub Kuderski      spirv.Branch ^bb1(%loop1_add : i32)
26301178654SLei Zhang    ^bb3:
2645ab6ef75SJakub Kuderski      spirv.mlir.merge
26501178654SLei Zhang    }
26601178654SLei Zhang
2675ab6ef75SJakub Kuderski// CHECK:        spirv.Constant 44
2685ab6ef75SJakub Kuderski// CHECK-NEXT:   spirv.Branch ^[[BB2:.+]](%{{.+}} : i32)
26901178654SLei Zhang// CHECK-NEXT: ^[[BB2]](%{{.+}}: i32):
2705ab6ef75SJakub Kuderski// CHECK-NEXT:   spirv.mlir.loop
2715ab6ef75SJakub Kuderski    spirv.mlir.loop { // loop 2
2725ab6ef75SJakub Kuderski      spirv.Branch ^bb1(%val2 : i32)
27301178654SLei Zhang    ^bb1(%loop2_bb_arg: i32):
2745ab6ef75SJakub Kuderski      %loop2_lt = spirv.SLessThan %loop2_bb_arg, %cst4 : i32
2755ab6ef75SJakub Kuderski      spirv.BranchConditional %loop2_lt, ^bb2, ^bb3
27601178654SLei Zhang    ^bb2:
2775ab6ef75SJakub Kuderski      %loop2_add = spirv.IAdd %loop2_bb_arg, %cst4 : i32
2785ab6ef75SJakub Kuderski      spirv.Branch ^bb1(%loop2_add : i32)
27901178654SLei Zhang    ^bb3:
2805ab6ef75SJakub Kuderski      spirv.mlir.merge
28101178654SLei Zhang    }
28201178654SLei Zhang
2835ab6ef75SJakub Kuderski    spirv.Return
28401178654SLei Zhang  }
28501178654SLei Zhang
2865ab6ef75SJakub Kuderski  spirv.EntryPoint "GLCompute" @fmul_kernel
2875ab6ef75SJakub Kuderski  spirv.ExecutionMode @fmul_kernel "LocalSize", 32, 1, 1
28801178654SLei Zhang}
289e4dee7e7SKareemErgawy-TomTom
290e4dee7e7SKareemErgawy-TomTom// -----
291e4dee7e7SKareemErgawy-TomTom
2925ab6ef75SJakub Kuderskispirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
293e4dee7e7SKareemErgawy-TomTom// CHECK-LABEL: @cond_branch_true_argument
2945ab6ef75SJakub Kuderski  spirv.func @cond_branch_true_argument() -> () "None" {
2955ab6ef75SJakub Kuderski    %true = spirv.Constant true
2965ab6ef75SJakub Kuderski    %zero = spirv.Constant 0 : i32
2975ab6ef75SJakub Kuderski    %one = spirv.Constant 1 : i32
2985ab6ef75SJakub Kuderski// CHECK:   spirv.BranchConditional %{{.*}}, ^[[true1:.*]](%{{.*}}, %{{.*}} : i32, i32), ^[[false1:.*]]
2995ab6ef75SJakub Kuderski    spirv.BranchConditional %true, ^true1(%zero, %zero: i32, i32), ^false1
300e4dee7e7SKareemErgawy-TomTom// CHECK: [[true1]](%{{.*}}: i32, %{{.*}}: i32)
301e4dee7e7SKareemErgawy-TomTom  ^true1(%arg0: i32, %arg1: i32):
3025ab6ef75SJakub Kuderski    spirv.Return
303e4dee7e7SKareemErgawy-TomTom// CHECK: [[false1]]:
304e4dee7e7SKareemErgawy-TomTom  ^false1:
3055ab6ef75SJakub Kuderski    spirv.Return
306e4dee7e7SKareemErgawy-TomTom  }
307e4dee7e7SKareemErgawy-TomTom}
308e4dee7e7SKareemErgawy-TomTom
309e4dee7e7SKareemErgawy-TomTom// -----
310e4dee7e7SKareemErgawy-TomTom
3115ab6ef75SJakub Kuderskispirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
312e4dee7e7SKareemErgawy-TomTom// CHECK-LABEL: @cond_branch_false_argument
3135ab6ef75SJakub Kuderski  spirv.func @cond_branch_false_argument() -> () "None" {
3145ab6ef75SJakub Kuderski    %true = spirv.Constant true
3155ab6ef75SJakub Kuderski    %zero = spirv.Constant 0 : i32
3165ab6ef75SJakub Kuderski    %one = spirv.Constant 1 : i32
3175ab6ef75SJakub Kuderski// CHECK:   spirv.BranchConditional %{{.*}}, ^[[true1:.*]], ^[[false1:.*]](%{{.*}}, %{{.*}} : i32, i32)
3185ab6ef75SJakub Kuderski    spirv.BranchConditional %true, ^true1, ^false1(%zero, %zero: i32, i32)
319e4dee7e7SKareemErgawy-TomTom// CHECK: [[true1]]:
320e4dee7e7SKareemErgawy-TomTom  ^true1:
3215ab6ef75SJakub Kuderski    spirv.Return
322e4dee7e7SKareemErgawy-TomTom// CHECK: [[false1]](%{{.*}}: i32, %{{.*}}: i32):
323e4dee7e7SKareemErgawy-TomTom  ^false1(%arg0: i32, %arg1: i32):
3245ab6ef75SJakub Kuderski    spirv.Return
325e4dee7e7SKareemErgawy-TomTom  }
326e4dee7e7SKareemErgawy-TomTom}
327e4dee7e7SKareemErgawy-TomTom
328e4dee7e7SKareemErgawy-TomTom// -----
329e4dee7e7SKareemErgawy-TomTom
3305ab6ef75SJakub Kuderskispirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> {
331e4dee7e7SKareemErgawy-TomTom// CHECK-LABEL: @cond_branch_true_and_false_argument
3325ab6ef75SJakub Kuderski  spirv.func @cond_branch_true_and_false_argument() -> () "None" {
3335ab6ef75SJakub Kuderski    %true = spirv.Constant true
3345ab6ef75SJakub Kuderski    %zero = spirv.Constant 0 : i32
3355ab6ef75SJakub Kuderski    %one = spirv.Constant 1 : i32
3365ab6ef75SJakub Kuderski// CHECK:   spirv.BranchConditional %{{.*}}, ^[[true1:.*]](%{{.*}} : i32), ^[[false1:.*]](%{{.*}}, %{{.*}} : i32, i32)
3375ab6ef75SJakub Kuderski    spirv.BranchConditional %true, ^true1(%one: i32), ^false1(%zero, %zero: i32, i32)
338e4dee7e7SKareemErgawy-TomTom// CHECK: [[true1]](%{{.*}}: i32):
339e4dee7e7SKareemErgawy-TomTom  ^true1(%arg0: i32):
3405ab6ef75SJakub Kuderski    spirv.Return
341e4dee7e7SKareemErgawy-TomTom// CHECK: [[false1]](%{{.*}}: i32, %{{.*}}: i32):
342e4dee7e7SKareemErgawy-TomTom  ^false1(%arg1: i32, %arg2: i32):
3435ab6ef75SJakub Kuderski    spirv.Return
344e4dee7e7SKareemErgawy-TomTom  }
345e4dee7e7SKareemErgawy-TomTom}
346