blob: 9837d7babb7b1509665277c059bfe75a9312404c [file] [log] [blame]
// RUN: mlir-opt %s -split-input-file -pass-pipeline='spv.module(inline)' -mlir-disable-inline-simplify | FileCheck %s
spv.module "Logical" "GLSL450" {
func @callee() {
spv.Return
}
// CHECK-LABEL: func @calling_single_block_ret_func
func @calling_single_block_ret_func() {
// CHECK-NEXT: spv.Return
spv.FunctionCall @callee() : () -> ()
spv.Return
}
}
// -----
spv.module "Logical" "GLSL450" {
func @callee() -> i32 {
%0 = spv.constant 42 : i32
spv.ReturnValue %0 : i32
}
// CHECK-LABEL: func @calling_single_block_retval_func
func @calling_single_block_retval_func() -> i32 {
// CHECK-NEXT: %[[CST:.*]] = spv.constant 42
%0 = spv.FunctionCall @callee() : () -> (i32)
// CHECK-NEXT: spv.ReturnValue %[[CST]]
spv.ReturnValue %0 : i32
}
}
// -----
spv.module "Logical" "GLSL450" {
spv.globalVariable @data bind(0, 0) : !spv.ptr<!spv.struct<!spv.rtarray<i32> [0]>, StorageBuffer>
func @callee() {
%0 = spv._address_of @data : !spv.ptr<!spv.struct<!spv.rtarray<i32> [0]>, StorageBuffer>
%1 = spv.constant 0: i32
%2 = spv.AccessChain %0[%1, %1] : !spv.ptr<!spv.struct<!spv.rtarray<i32> [0]>, StorageBuffer>
spv.Branch ^next
^next:
%3 = spv.constant 42: i32
spv.Store "StorageBuffer" %2, %3 : i32
spv.Return
}
// CHECK-LABEL: func @calling_multi_block_ret_func
func @calling_multi_block_ret_func() {
// CHECK-NEXT: spv._address_of
// CHECK-NEXT: spv.constant 0
// CHECK-NEXT: spv.AccessChain
// CHECK-NEXT: spv.Branch ^bb1
// CHECK-NEXT: ^bb1:
// CHECK-NEXT: spv.constant
// CHECK-NEXT: spv.Store
// CHECK-NEXT: spv.Branch ^bb2
spv.FunctionCall @callee() : () -> ()
// CHECK-NEXT: ^bb2:
// CHECK-NEXT: spv.Return
spv.Return
}
}
// TODO: calling_multi_block_retval_func
// -----
spv.module "Logical" "GLSL450" {
func @callee(%cond : i1) -> () {
spv.selection {
spv.BranchConditional %cond, ^then, ^merge
^then:
spv.Return
^merge:
spv._merge
}
spv.Return
}
// CHECK-LABEL: calling_selection_ret_func
func @calling_selection_ret_func() {
%0 = spv.constant true
// CHECK: spv.FunctionCall
spv.FunctionCall @callee(%0) : (i1) -> ()
spv.Return
}
}
// -----
spv.module "Logical" "GLSL450" {
func @callee(%cond : i1) -> () {
spv.selection {
spv.BranchConditional %cond, ^then, ^merge
^then:
spv.Branch ^merge
^merge:
spv._merge
}
spv.Return
}
// CHECK-LABEL: calling_selection_no_ret_func
func @calling_selection_no_ret_func() {
// CHECK-NEXT: %[[TRUE:.*]] = spv.constant true
%0 = spv.constant true
// CHECK-NEXT: spv.selection
// CHECK-NEXT: spv.BranchConditional %[[TRUE]], ^bb1, ^bb2
// CHECK-NEXT: ^bb1:
// CHECK-NEXT: spv.Branch ^bb2
// CHECK-NEXT: ^bb2:
// CHECK-NEXT: spv._merge
spv.FunctionCall @callee(%0) : (i1) -> ()
spv.Return
}
}
// -----
spv.module "Logical" "GLSL450" {
func @callee(%cond : i1) -> () {
spv.loop {
spv.Branch ^header
^header:
spv.BranchConditional %cond, ^body, ^merge
^body:
spv.Return
^continue:
spv.Branch ^header
^merge:
spv._merge
}
spv.Return
}
// CHECK-LABEL: calling_loop_ret_func
func @calling_loop_ret_func() {
%0 = spv.constant true
// CHECK: spv.FunctionCall
spv.FunctionCall @callee(%0) : (i1) -> ()
spv.Return
}
}
// -----
spv.module "Logical" "GLSL450" {
func @callee(%cond : i1) -> () {
spv.loop {
spv.Branch ^header
^header:
spv.BranchConditional %cond, ^body, ^merge
^body:
spv.Branch ^continue
^continue:
spv.Branch ^header
^merge:
spv._merge
}
spv.Return
}
// CHECK-LABEL: calling_loop_no_ret_func
func @calling_loop_no_ret_func() {
// CHECK-NEXT: %[[TRUE:.*]] = spv.constant true
%0 = spv.constant true
// CHECK-NEXT: spv.loop
// CHECK-NEXT: spv.Branch ^bb1
// CHECK-NEXT: ^bb1:
// CHECK-NEXT: spv.BranchConditional %[[TRUE]], ^bb2, ^bb4
// CHECK-NEXT: ^bb2:
// CHECK-NEXT: spv.Branch ^bb3
// CHECK-NEXT: ^bb3:
// CHECK-NEXT: spv.Branch ^bb1
// CHECK-NEXT: ^bb4:
// CHECK-NEXT: spv._merge
spv.FunctionCall @callee(%0) : (i1) -> ()
spv.Return
}
}