summaryrefslogtreecommitdiffstats
path: root/mlir/include/mlir-c
Commit message (Collapse)AuthorAgeFilesLines
* Adjust License.txt file to use the LLVM licenseMehdi Amini2019-12-231-13/+4
| | | | PiperOrigin-RevId: 286906740
* Add support for float and string attributes to the C API and python bindingsMLIR Team2019-12-171-0/+6
| | | | PiperOrigin-RevId: 286115042
* Expose mlir::parseType to bindingsAlex Zinenko2019-10-151-13/+6
| | | | | | | | | | | | | | Python bindings currently currently provide a makeScalarType function that constructs one of the predefined types. It was implemented in the bindings directly to circumvent the absence of standalone type parsing function. Now that mlir::parseType has been made available, rely on the core parsing procedure to construct types from strings in the bindings. This changes includes a library reshuffling that splits out "CoreAPIs" implementing the binding helper APIs into a separate library and makes that dependent on the Parser library. PiperOrigin-RevId: 274794516
* NFC: Rename Function to FuncOp.River Riddle2019-07-101-1/+1
| | | | PiperOrigin-RevId: 257293379
* Drop MLIREmitter-based version of the EDSCAlex Zinenko2019-04-031-209/+0
| | | | | | | | | | | | | | | This version has been deprecated and can now be removed completely since the last remaining user (Python bindings) migrated to declarative builders. Several functions in lib/EDSC/Types.cpp construct core IR objects for the C bindings. Move these functions into lib/EDSC/CoreAPIs.cpp until we decide where they should live. This completes the migration from the delayed-construction EDSC to Declarative Builders. -- PiperOrigin-RevId: 241716729
* Remove index free functionJacques Pienaar2019-03-291-6/+0
| | | | | | | | | | | | | | | Avoids including function in C++ side that resulted in OSS C++ errors: include/mlir-c/Core.h:228:16: error: functions that differ only in their return type cannot be overloaded edsc_indexed_t index(edsc_indexed_t indexed, edsc_expr_list_t indices); ~~~~~~~~~~~~~~ ^ /usr/include/string.h:484:14: note: previous declaration is here extern char *index (const char *__s, int __c) And as these are going away soon, just removing the function requires the least changes. PiperOrigin-RevId: 239110470
* EDSC bindings: expose generic Op construction interfaceAlex Zinenko2019-03-291-0/+30
| | | | | | | | | | | | | | | | EDSC Expressions can now be used to build arbitrary MLIR operations identified by their canonical name, i.e. the name obtained from `OpClass::getOperationName()` for registered operations. Expose this functionality to the C API and Python bindings. This exposes builder-level interface to Python and avoids the need for experimental Python code to implement EDSC free function calls for constructing each op type. This modification required exposing mlir::Attribute to the C API and Python bindings, which only supports integer attributes for now. This is step 4/n to making EDSCs more generalizable. PiperOrigin-RevId: 236306776
* EDSC: support conditional branch instructionsAlex Zinenko2019-03-291-0/+10
| | | | | | | | | | | | | Leverage the recently introduced support for multiple argument groups and multiple destination blocks in EDSC Expressions to implement conditional branches in EDSC. Conditional branches have two successors and three argument groups. The first group contains a single expression of i1 type that corresponds to the condition of the branch. The two following groups contain arguments of the two successors of the conditional branch instruction, in the same order as the successors. Expose this instruction to the C API and Python bindings. PiperOrigin-RevId: 235542768
* EDSC: support branch instructionsAlex Zinenko2019-03-291-2/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The new implementation of blocks was designed to support blocks with arguments. More specifically, StmtBlock can be constructed with a list of Bindables that will be bound to block aguments upon construction. Leverage this functionality to implement branch instructions with arguments. This additionally requires the statement storage to have a list of successors, similarly to core IR operations. Becauase successor chains can form loops, we need a possibility to decouple block declaration, after which it becomes usable by branch instructions, from block body definition. This is achieved by creating an empty block and by resetting its body with a new list of instructions. Note that assigning a block from another block will not affect any instructions that may have designated this block as their successor (this behavior is necessary to make value-type semantics of EDSC types consistent). Combined, one can now write generators like EDSCContext context; Type indexType = ...; Bindable i(indexType), ii(indexType), zero(indexType), one(indexType); StmtBlock loopBlock({i}, {}); loopBlock.set({ii = i + one, Branch(loopBlock, {ii})}); MLIREmitter(&builder) .bindConstant<ConstantIndexOp>(zero, 0) .bindConstant<ConstantIndexOp>(one, 1) .emitStmt(Branch(loopBlock, {zero})); where the emitter will emit the statement and its successors, if present. PiperOrigin-RevId: 235541892
* Exposed division and remainder operations in EDSCSergei Lebedev2019-03-291-1/+5
| | | | | | | | | | This change introduces three new operators in EDSC: Div (also exposed via Expr.__div__ aka /) -- floating-point division, FloorDiv and CeilDiv for flooring/ceiling index division. The lowering to LLVM will be implemented in b/124872679. PiperOrigin-RevId: 234963217
* EDSC: support call instructionsAlex Zinenko2019-03-291-0/+6
| | | | | | | | | | | | | | | | | | | | | | | | Introduce support for binding MLIR functions as constant expressions. Standard constant operation supports functions as possible constant values. Provide C APIs to look up existing named functions in an MLIR module and expose them to the Python bindings. Provide Python bindings to declare a function in an MLIR module without defining it and to add a definition given a function declaration. These declarations are useful when attempting to link MLIR modules with, e.g., the standard library. Introduce EDSC support for direct and indirect calls to other MLIR functions. Internally, an indirect call is always emitted to leverage existing support for delayed construction of MLIR Values using EDSC Exprs. If the expression is bound to a constant function (looked up or declared beforehand), MLIR constant folding will be able to replace an indirect call by a direct call. Currently, only zero- and one-result functions are supported since we don't have support for multi-valued expressions in EDSC. Expose function calling interface to Python bindings on expressions by defining a `__call__` function accepting a variable number of arguments. PiperOrigin-RevId: 234959444
* EDSC: introduce min/max only usable inside for upper/lower bounds of a loopAlex Zinenko2019-03-291-3/+12
| | | | | | | | | | | | | | | | | | | Introduce a type-safe way of building a 'for' loop with max/min bounds in EDSC. Define new types MaxExpr and MinExpr in C++ EDSC API and expose them to Python bindings. Use values of these type to construct 'for' loops with max/min in newly introduced overloads of the `edsc::For` factory function. Note that in C APIs, we still must expose MaxMinFor as a different function because C has no overloads. Also note that MaxExpr and MinExpr do _not_ derive from Expr because they are not allowed to be used in a regular Expr context (which may produce `affine.apply` instructions not expecting `min` or `max`). Factory functions `Min` and `Max` in Python can be further overloaded to produce chains of comparisons and selects on non-index types. This is not trivial in C++ since overloaded functions cannot differ by the return type only (`MaxExpr` or `Expr`) and making `MaxExpr` derive from `Expr` defies the purpose of type-safe construction. PiperOrigin-RevId: 234786131
* EDSC: support multi-expression loop boundsAlex Zinenko2019-03-291-4/+11
| | | | | | | | | | | | | | MLIR supports 'for' loops with lower(upper) bound defined by taking a maximum(minimum) of a list of expressions, but does not have first-class affine constructs for the maximum(minimum). All these expressions must have affine provenance, similarly to a single-expression bound. Add support for constructing such loops using EDSC. The expression factory function is called `edsc::MaxMinFor` to (1) highlight that the maximum(minimum) operation is applied to the lower(upper) bound expressions and (2) differentiate it from a `edsc::For` that creates multiple perfectly nested loops (and should arguably be called `edsc::ForNest`). PiperOrigin-RevId: 234785996
* EDSC: create constants as expressionsAlex Zinenko2019-03-291-0/+4
| | | | | | | | | | | | | Introduce a functionality to create EDSC expressions from typed constants. This complements the current functionality that uses "unbound" expressions and binds them to a specific constant before emission. It comes in handy in cases where we want to check if something is a constant early during construciton rather than late during emission, for example multiplications and divisions in affine expressions. This is also consistent with MLIR vision of constants being defined by an operation (rather than being special kinds of values in the IR) by exposing this operation as EDSC expression. PiperOrigin-RevId: 234758020
* EDSC: make Expr typed and extensibleAlex Zinenko2019-03-291-1/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Expose the result types of edsc::Expr, which are now stored for all types of Exprs and not only for the variadic ones. Require return types when an Expr is constructed, if it will ever have some. An empty return type list is interpreted as an Expr that does not create a value (e.g. `return` or `store`). Conceptually, all edss::Exprs are now typed, with the type being a (potentially empty) tuple of return types. Unbound expressions and Bindables must now be constructed with a specific type they will take. This makes EDSC less evidently type-polymorphic, but we can still write generic code such as Expr sumOfSquares(Expr lhs, Expr rhs) { return lhs * lhs + rhs * rhs; } and use it to construct different typed expressions as sumOfSquares(Bindable(IndexType::get(ctx)), Bindable(IndexType::get(ctx))); sumOfSquares(Bindable(FloatType::getF32(ctx)), Bindable(FloatType::getF32(ctx))); On the positive side, we get the following. 1. We can now perform type checking when constructing Exprs rather than during MLIR emission. Nevertheless, this is still duplicates the Op::verify() until we can factor out type checking from that. 2. MLIREmitter is significantly simplified. 3. ExprKind enum is only used for actual kinds of expressions. Data structures are converging with AbstractOperation, and the users can now create a VariadicExpr("canonical_op_name", {types}, {exprs}) for any operation, even an unregistered one without having to extend the enum and make pervasive changes to EDSCs. On the negative side, we get the following. 1. Typed bindables are more verbose, even in Python. 2. We lose the ability to do print debugging for higher-level EDSC abstractions that are implemented as multiple MLIR Ops, for example logical disjunction. This is the step 2/n towards making EDSC extensible. *** Move MLIR Op construction from MLIREmitter::emitExpr to Expr::build since Expr now has sufficient information to build itself. This is the step 3/n towards making EDSC extensible. Both of these strive to minimize the amount of irrelevant changes. In particular, this introduces more complex pretty-printing for affine and binary expression to make sure tests continue to pass. It also relies on string comparison to identify specific operations that an Expr produces. PiperOrigin-RevId: 234609882
* EDSC: introduce support for blocksAlex Zinenko2019-03-291-5/+5
| | | | | | | | | | | | | | | | | | | | | | | EDSC currently implement a block as a statement that is itself a list of statements. This suffers from two modeling problems: (1) these blocks are not addressable, i.e. one cannot create an instruction where thus constructed block is a successor; (2) they support block nesting, which is not supported by MLIR blocks. Furthermore, emitting such "compound statement" (misleadingly named `Block` in Python bindings) does not actually produce a new Block in the IR. Implement support for creating actual IR Blocks in EDSC. In particular, define a new StmtBlock EDSC class that is neither an Expr nor a Stmt but contains a list of Stmts. Additionally, StmtBlock may have (early-) typed arguments. These arguments are Bindable expressions that can be used inside the block. Provide two calls in the MLIREmitter, `emitBlock` that actually emits a new block and `emitBlockBody` that only emits the instructions contained in the block without creating a new block. In the latter case, the instructions must not use block arguments. Update Python bindings to make it clear when instruction emission happens without creating a new block. PiperOrigin-RevId: 234556474
* Make IndexType a standard type instead of a builtin. This also cleans up ↵River Riddle2019-03-291-6/+6
| | | | | | some unnecessary factory methods on the Type class. PiperOrigin-RevId: 233640730
* Implemented __eq__ and __ne__ in EDSC Python bindingsSergei Lebedev2019-03-291-0/+2
| | | | PiperOrigin-RevId: 232473201
* Exposing logical operators in EDSC all the way up to Python.Dimitrios Vytiniotis2019-03-291-0/+4
| | | | PiperOrigin-RevId: 232299839
* Cleanup EDSCs and start a functional auto-generated library of custom OpsNicolas Vasilache2019-03-291-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This CL applies the following simplifications to EDSCs: 1. Rename Block to StmtList because an MLIR Block is a different, not yet supported, notion; 2. Rework Bindable to drop specific storage and just use it as a simple wrapper around Expr. The only value of Bindable is to force a static cast when used by the user to bind into the emitter. For all intended purposes, Bindable is just a lightweight check that an Expr is Unbound. This simplifies usage and reduces the API footprint. After playing with it for some time, it wasn't worth the API cognition overhead; 3. Replace makeExprs and makeBindables by makeNewExprs and copyExprs which is more explicit and less easy to misuse; 4. Add generally useful functionality to MLIREmitter: a. expose zero and one for the ubiquitous common lower bounds and step; b. add support to create already bound Exprs for all function arguments as well as shapes and views for Exprs bound to memrefs. 5. Delete Stmt::operator= and replace by a `Stmt::set` method which is more explicit. 6. Make Stmt::operator Expr() explicit. 7. Indexed.indices assertions are removed to pave the way for expressing slices and views as well as to work with 0-D memrefs. The CL plugs those simplifications with TableGen and allows emitting a full MLIR function for pointwise add. This "x.add" op is both type and rank-agnostic (by allowing ArrayRef of Expr passed to For loops) and opens the door to spinning up a composable library of existing and custom ops that should automate a lot of the tedious work in TF/XLA -> MLIR. Testing needs to be significantly improved but can be done in a separate CL. PiperOrigin-RevId: 231982325
* Add a C API for EDSCs in other languages + pythonNicolas Vasilache2019-03-291-0/+248
This CL adds support for calling EDSCs from other languages than C++. Following the LLVM convention this CL: 1. declares simple opaque types and a C API in mlir-c/Core.h; 2. defines the implementation directly in lib/EDSC/Types.cpp and lib/EDSC/MLIREmitter.cpp. Unlike LLVM however the nomenclature for these types and API functions is not well-defined, naming suggestions are most welcome. To avoid the need for conversion functions, Types.h and MLIREmitter.h include mlir-c/Core.h and provide constructors and conversion operators between the mlir::edsc type and the corresponding C type. In this first commit, mlir-c/Core.h only contains the types for the C API to allow EDSCs to work from Python. This includes both a minimal set of core MLIR types (mlir_context_t, mlir_type_t, mlir_func_t) as well as the EDSC types (edsc_mlir_emitter_t, edsc_expr_t, edsc_stmt_t, edsc_indexed_t). This can be restructured in the future as concrete needs arise. For now, the API only supports: 1. scalar types; 2. memrefs of scalar types with static or symbolic shapes; 3. functions with input and output of these types. The C API is not complete wrt ownership semantics. This is in large part due to the fact that python bindings are written with Pybind11 which allows very idiomatic C++ bindings. An effort is made to write a large chunk of these bindings using the C API but some C++isms are used where the design benefits from this simplication. A fully isolated C API will make more sense once we also integrate with another language like Swift and have enough use cases to drive the design. Lastly, this CL also fixes a bug in mlir::ExecutionEngine were the order of declaration of llvmContext and the JIT result in an improper order of destructors (which used to crash before the fix). PiperOrigin-RevId: 231290250
OpenPOWER on IntegriCloud