'func' Dialect
This dialect provides documentation for operations within the Func dialect.
This dialect contains operations surrounding high order function abstractions, such as calls.
Please post an RFC on the forum before adding or changing any operation in this dialect.
Operations ¶
func.call_indirect
(func::CallIndirectOp) ¶
Indirect call operation
Syntax:
operation ::= `func.call_indirect` $callee `(` $callee_operands `)` attr-dict `:` type($callee)
The func.call_indirect
operation represents an indirect call to a value
of function type. The operands and result types of the call must match the
specified function type.
Function values can be created with the
func.constant
operation.
Example:
%func = func.constant @my_func : (tensor<16xf32>, tensor<16xf32>) -> tensor<16xf32>
%result = func.call_indirect %func(%0, %1) : (tensor<16xf32>, tensor<16xf32>) -> tensor<16xf32>
Interfaces: CallOpInterface
Operands: ¶
Operand | Description |
---|---|
callee | function type |
callee_operands | variadic of any type |
Results: ¶
Result | Description |
---|---|
results | variadic of any type |
func.call
(func::CallOp) ¶
Call operation
Syntax:
operation ::= `func.call` $callee `(` $operands `)` attr-dict `:` functional-type($operands, results)
The func.call
operation represents a direct call to a function that is
within the same symbol scope as the call. The operands and result types of
the call must match the specified function type. The callee is encoded as a
symbol reference attribute named “callee”.
Example:
%2 = func.call @my_add(%0, %1) : (f32, f32) -> f32
Traits: MemRefsNormalizable
Interfaces: CallOpInterface
, SymbolUserOpInterface
Attributes: ¶
Attribute | MLIR Type | Description |
---|---|---|
callee | ::mlir::FlatSymbolRefAttr | flat symbol reference attribute |
Operands: ¶
Operand | Description |
---|---|
operands | variadic of any type |
Results: ¶
Result | Description |
---|---|
«unnamed» | variadic of any type |
func.constant
(func::ConstantOp) ¶
Constant
Syntax:
operation ::= `func.constant` attr-dict $value `:` type(results)
The func.constant
operation produces an SSA value from a symbol reference
to a func.func
operation
Example:
// Reference to function @myfn.
%2 = func.constant @myfn : (tensor<16xf32>, f32) -> tensor<16xf32>
// Equivalent generic forms
%2 = "func.constant"() { value = @myfn } : () -> ((tensor<16xf32>, f32) -> tensor<16xf32>)
MLIR does not allow direct references to functions in SSA operands because the compiler is multithreaded, and disallowing SSA values to directly reference a function simplifies this ( rationale).
Traits: AlwaysSpeculatableImplTrait
, ConstantLike
Interfaces: ConditionallySpeculatable
, NoMemoryEffect (MemoryEffectOpInterface)
, OpAsmOpInterface
, SymbolUserOpInterface
Effects: MemoryEffects::Effect{}
Attributes: ¶
Attribute | MLIR Type | Description |
---|---|---|
value | ::mlir::FlatSymbolRefAttr | flat symbol reference attribute |
Results: ¶
Result | Description |
---|---|
«unnamed» | any type |
func.func
(func::FuncOp) ¶
An operation with a name containing a single SSACFG
region
Operations within the function cannot implicitly capture values defined
outside of the function, i.e. Functions are IsolatedFromAbove
. All
external references must use function arguments or attributes that establish
a symbolic connection (e.g. symbols referenced by name via a string
attribute like SymbolRefAttr). An external function declaration (used when
referring to a function declared in some other module) has no body. While
the MLIR textual form provides a nice inline syntax for function arguments,
they are internally represented as “block arguments” to the first block in
the region.
Only dialect attribute names may be specified in the attribute dictionaries for function arguments, results, or the function itself.
Example:
// External function definitions.
func.func private @abort()
func.func private @scribble(i32, i64, memref<? x 128 x f32, #layout_map0>) -> f64
// A function that returns its argument twice:
func.func @count(%x: i64) -> (i64, i64)
attributes {fruit = "banana"} {
return %x, %x: i64, i64
}
// A function with an argument attribute
func.func private @example_fn_arg(%x: i32 {swift.self = unit})
// A function with a result attribute
func.func private @example_fn_result() -> (f64 {dialectName.attrName = 0 : i64})
// A function with an attribute
func.func private @example_fn_attr() attributes {dialectName.attrName = false}
Traits: AffineScope
, AutomaticAllocationScope
, IsolatedFromAbove
Interfaces: CallableOpInterface
, FunctionOpInterface
, OpAsmOpInterface
, Symbol
Attributes: ¶
Attribute | MLIR Type | Description |
---|---|---|
sym_name | ::mlir::StringAttr | string attribute |
function_type | ::mlir::TypeAttr | type attribute of function type |
sym_visibility | ::mlir::StringAttr | string attribute |
arg_attrs | ::mlir::ArrayAttr | Array of dictionary attributes |
res_attrs | ::mlir::ArrayAttr | Array of dictionary attributes |
func.return
(func::ReturnOp) ¶
Function return operation
Syntax:
operation ::= `func.return` attr-dict ($operands^ `:` type($operands))?
The func.return
operation represents a return operation within a function.
The operation takes variable number of operands and produces no results.
The operand number and types must match the signature of the function
that contains the operation.
Example:
func.func @foo() : (i32, f8) {
...
return %0, %1 : i32, f8
}
Traits: AlwaysSpeculatableImplTrait
, HasParent<FuncOp>
, MemRefsNormalizable
, ReturnLike
, Terminator
Interfaces: ConditionallySpeculatable
, NoMemoryEffect (MemoryEffectOpInterface)
, RegionBranchTerminatorOpInterface
Effects: MemoryEffects::Effect{}
Operands: ¶
Operand | Description |
---|---|
operands | variadic of any type |