summaryrefslogtreecommitdiffstats
path: root/mlir/lib/IR/AsmPrinter.cpp
Commit message (Collapse)AuthorAgeFilesLines
...
* Add support to constant splat vector/tensor attribute.Feng Liu2019-03-291-0/+9
| | | | | | | | | This attribute represents a reference to a splat vector or tensor, where all the elements have the same value. The syntax of the attribute is: `splat<` (tensor-type | vector-type)`,` attribute-value `>` PiperOrigin-RevId: 216537997
* Change the representation of an operation name to be either anChris Lattner2019-03-291-2/+6
| | | | | | | | | AbstractOperation* or an Identifier. This makes it possible to get to stuff in AbstractOperation faster than going through a hash table lookup. This makes constant folding a bit faster now, but will become more important with subsequent changes. PiperOrigin-RevId: 216476772
* [MLIR] AffineMap value typeNicolas Vasilache2019-03-291-40/+40
| | | | | | | | This CL applies the same pattern as AffineExpr to AffineMap: a simple struct that acts as the storage is allocated in the bump pointer. The AffineMap is immutable and accessed everywhere by value. PiperOrigin-RevId: 216445930
* [MLIR] Sketch AffineExpr value typeNicolas Vasilache2019-03-291-32/+31
| | | | | | | | | | | | | | | | This CL sketches what it takes for AffineExpr to fully have by-value semantics and not be a not-so-smart pointer anymore. This essentially makes the underyling class a simple storage struct and implements the operations on the value type directly. Since there is no forwarding of operations anymore, we can full isolate the storage class and make a hard visibility barrier by moving detail::AffineExpr into AffineExprDetail.h. AffineExprDetail.h is only included where storage-related information is needed. PiperOrigin-RevId: 216385459
* [MLIR] AffineExpr final cleanupsNicolas Vasilache2019-03-291-27/+27
| | | | | | | | | | | This CL: 1. performs the global codemod AffineXExpr->AffineXExprClass and AffineXExprRef -> AffineXExpr; 2. simplifies function calls by removing the redundant MLIRContext parameter; 3. adds missing binary operator versions of scalar op AffineExpr where it makes sense. PiperOrigin-RevId: 216242674
* [MLIR] Cleanup AffineExprNicolas Vasilache2019-03-291-10/+11
| | | | | | | | | | | | | | | | | | | | | | | | This CL introduces a series of cleanups for AffineExpr value types: 1. to make it clear that the value types should be used, the pointer AffineExpr types are put in the detail namespace. Unfortunately, since the value type operator-> only forwards to the underlying pointer type, we still need to expose this in the include file for now; 2. AffineExprKind is ok to use, it thus comes out of detail and thus of AffineExpr 3. getAffineDimExpr, getAffineSymbolExpr, getAffineConstantExpr are similarly extracted as free functions and their naming is mande consistent across Builder, MLContext and AffineExpr 4. AffineBinaryOpEx::simplify functions are made into static free functions. In particular it is moved away from AffineMap.cpp where it does not belong 5. operator AffineExprType is made explicit 6. uses the binary operators everywhere possible 7. drops the pointer usage everywhere outside of AffineExpr.cpp, MLIRContext.cpp and AsmPrinter.cpp PiperOrigin-RevId: 216207212
* [MLIR] Value types for AffineXXXExprNicolas Vasilache2019-03-291-11/+11
| | | | | | | | | | | | | | | | | | | | | This CL makes AffineExprRef into a value type. Notably: 1. drops llvm isa, cast, dyn_cast on pointer type and uses member functions on the value type. It may be possible to still use classof (in a followup CL) 2. AffineBaseExprRef aggressively casts constness away: if we mean the type is immutable then let's jump in with both feet; 3. Drop implicit casts to the underlying pointer type because that always results in surprising behavior and is not needed in practice once enough cleanup has been applied. The remaining negative I see is that we still need to mix operator. and operator->. There is an ugly solution that forwards the methods but that ends up duplicating the class hierarchy which I tried to avoid as much as possible. But maybe it's not that bad anymore since AffineExpr.h would still contain a single class hierarchy (the duplication would be impl detail in.cpp) PiperOrigin-RevId: 216188003
* Rename affineint type to index type. The name 'index' may not be perfect, ↵Chris Lattner2019-03-291-3/+3
| | | | | | | | | | | | | | but is better than the old name. Here is some justification: 1) affineint (as it is named) is not a type suitable for general computation (e.g. the multiply/adds in an integer matmul). It has undefined width and is undefined on overflow. They are used as the indices for forstmt because they are intended to be used as indexes inside the loop. 2) It can be used in both cfg and ml functions, and in cfg functions. As you mention, “symbols” are not affine, and we use affineint values for symbols. 3) Integers aren’t affine, the algorithms applied to them can be. :) 4) The only suitable use for affineint in MLIR is for indexes and dimension sizes (i.e. the bounds of those indexes). PiperOrigin-RevId: 216057974
* [RFC][MLIR] Use AffineExprRef in place of AffineExpr* in IRNicolas Vasilache2019-03-291-41/+39
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This CL starts by replacing AffineExpr* with value-type AffineExprRef in a few places in the IR. By a domino effect that is pretty telling of the inconsistencies in the codebase, const is removed where it makes sense. The rationale is that the decision was concisously made that unique'd types have pointer semantics without const specifier. This is fine but we should be consistent. In the end, the only logical invariant is that there should never be such a thing as a const AffineExpr*, const AffineMap* or const IntegerSet* in our codebase. This CL takes a number of shortcuts to killing const with fire, in particular forcing const AffineExprRef to return the underlying non-const AffineExpr*. This will be removed once AffineExpr* has disappeared in containers but for now such shortcuts allow a bit of sanity in this long quest for cleanups. The **only** places where const AffineExpr*, const AffineMap* or const IntegerSet* may still appear is by transitive needs from containers, comparison operators etc. There is still one major thing remaining here: figure out why cast/dyn_cast return me a const AffineXXX*, which in turn requires a bunch of ugly const_casts. I suspect this is due to the classof taking const AffineXXXExpr*. I wonder whether this is a side effect of 1., if it is coming from llvm itself (I'd doubt it) or something else (clattner@?) In light of this, the whole discussion about const makes total sense to me now and I would systematically apply the rule that in the end, we should never have any const XXX in our codebase for unique'd types (assuming we can remove them all in containers and no additional constness constraint is added on us from the outside world). PiperOrigin-RevId: 215811554
* [MLIR] Remove uses of AffineExpr* outside of IRNicolas Vasilache2019-03-291-3/+5
| | | | | | | | | | | | | This CL uniformizes the uses of AffineExprWrap outside of IR. The public API of AffineExpr builder is modified to only use AffineExprWrap. A few places access AffineExprWrap.expr, this is only while the API is in transition to easily keep track (i.e. make expr private and let the compiler track the errors). Parser.cpp exhibits patterns that are dependent on nullptr values so converting it is left for another CL. PiperOrigin-RevId: 215642005
* Add support to TF f32_ref type in MLIRFeng Liu2019-03-291-0/+3
| | | | PiperOrigin-RevId: 214722005
* [MLIR] Fix AsmPrinter for short-hand bound notationNicolas Vasilache2019-03-291-13/+18
| | | | | | | | | | | | | | | | | | | This CL retricts shorthand notation printing to only the bounds that can be roundtripped unambiguously; i.e.: 1. ()[]->(%some_cst) ()[] 2. ()[s0]->(s0) ()[%some_symbol] Upon inspection it turns out that the constant case was lossy so this CL also updates it. Note however that fixing this issue exhibits a potential issues in unroll.mlir. L488 exhibits a map ()[s0] -> (1)()[%arg0] which could be simplified down to ()[]->(1)()[]. This does not seem like a bug but maybe an undesired complexity in the maps generated by unrolling. bondhugula@, care to take a look? PiperOrigin-RevId: 214531410
* [MLIR] Fix AsmPrinter.cpp for single ssa-id AffineMapNicolas Vasilache2019-03-291-3/+8
| | | | | | | | | | | | | | | | | | | | | | | The AsmPrinter wrongly assumes that all single ssa-id AffineMap are the identity map for the purpose of printing. This CL adds the missing level of indirection as well as a test. This bug was originally shaken off by the experimental TC->MLIR path. Before this CL, the test would print: ``` mlfunc @mlfuncsimplemap(%arg0 : affineint, %arg1 : affineint, %arg2 : affineint) { for %i0 = 0 to %arg0 { for %i1 = 0 to %i0 { ~~~ should be %arg1 %c42_i32 = constant 42 : i32 } } return } ``` PiperOrigin-RevId: 214120817
* Introduce [post]dominator tree and related infrastructure, use it in CFG funcChris Lattner2019-03-291-5/+22
| | | | | | | | | | | | | | | | verifier. We get most of this infrastructure directly from LLVM, we just need to adapt it to our CFG abstraction. This has a few unrelated changes engangled in it: - getFunction() in various classes was const incorrect, fix it. - This moves Verifier.cpp to the analysis library, since Verifier depends on dominance and these are both really analyses. - IndexedAccessorIterator::reference was defined wrong, leading to really exciting template errors that were fun to diagnose. - This flips the boolean sense of the foldOperation() function in constant folding pass in response to previous patch feedback. PiperOrigin-RevId: 214046593
* Supports TF Complex64/Complex128 types in the tf/mlir roundtrip pass.Feng Liu2019-03-291-0/+6
| | | | | | | | Alternatively, we can defined a TFComplexType with a width parameter in the mlir, then both types can be converted to the same mlir type with different width (like IntegerType). We chose to use a direct mapping because there are only two TF Complex types. PiperOrigin-RevId: 213856651
* Support TF Variant type in the tf/mlir roundtrip pass.Feng Liu2019-03-291-0/+3
| | | | PiperOrigin-RevId: 213748573
* Handle the TF resource data type in the TF/XLA roundtrip pass.Feng Liu2019-03-291-0/+3
| | | | PiperOrigin-RevId: 213650346
* Add function attributes for ExtFunction, CFGFunction and MLFunction.Feng Liu2019-03-291-40/+59
| | | | PiperOrigin-RevId: 213540509
* Change unranked tensor syntax from tensor<??f32> to tensor<*xf32> perChris Lattner2019-03-291-1/+1
| | | | | | discussion on the list. PiperOrigin-RevId: 212838226
* Extend getConstantTripCount to deal with a larger subset of loop bounds; ↵Uday Bondhugula2019-03-291-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | make loop unroll/unroll-and-jam more powerful; add additional affine expr builder methods - use previously added analysis/simplification to infer multiple of unroll factor trip counts, making loop unroll/unroll-and-jam more general. - for loop unroll, support bounds that are single result affine map's with the same set of operands. For unknown loop bounds, loop unroll will now work as long as trip count can be determined to be a multiple of unroll factor. - extend getConstantTripCount to deal with single result affine map's with the same operands. move it to mlir/Analysis/LoopAnalysis.cpp - add additional builder utility methods for affine expr arithmetic (difference, mod/floordiv/ceildiv w.r.t postitive constant). simplify code to use the utility methods. - move affine analysis routines to AffineAnalysis.cpp/.h from AffineStructures.cpp/.h. - Rename LoopUnrollJam to LoopUnrollAndJam to match class name. - add an additional simplification for simplifyFloorDiv, simplifyCeilDiv - Rename AffineMap::getNumOperands() getNumInputs: an affine map by itself does not have operands. Operands are passed to it through affine_apply, from loop bounds/if condition's, etc., operands are stored in the latter. This should be sufficiently powerful for now as far as unroll/unroll-and-jam go for TPU code generation, and can move to other analyses/transformations. Loop nests like these are now unrolled without any cleanup loop being generated. for %i = 1 to 100 { // unroll factor 4: no cleanup loop will be generated. for %j = (d0) -> (d0) (%i) to (d0) -> (5*d0 + 3) (%i) { %x = "foo"(%j) : (affineint) -> i32 } } for %i = 1 to 100 { // unroll factor 4: no cleanup loop will be generated. for %j = (d0) -> (d0) (%i) to (d0) -> (d0 - d mod 4 - 1) (%i) { %y = "foo"(%j) : (affineint) -> i32 } } for %i = 1 to 100 { for %j = (d0) -> (d0) (%i) to (d0) -> (d0 + 128) (%i) { %x = "foo"() : () -> i32 } } TODO(bondhugula): extend this to LoopUnrollAndJam as well in the next CL (with minor changes). PiperOrigin-RevId: 212661212
* Several minor infra improvements:Chris Lattner2019-03-291-0/+4
| | | | | | | | | | | | | | | - Make the tf-lower-control flow handle error cases better. Add a testcase that (currently) fails due to type mismatches. - Factor more code in the verifier for basic block argument checking, and check more invariants. - Fix a crasher in the asmprinter on null instructions (which only occurs on invalid code). - Fix a bug handling conditional branches with no block operands, it would access &operands[0] instead of using operands.data(). - Enhance the mlir-opt driver to use the verifier() in a non-crashing mode, allowing issues to be reported as diagnostics. PiperOrigin-RevId: 211818291
* Implement operands for the 'if' statement.Tatiana Shpeisman2019-03-291-4/+6
| | | | | | | | This CL also includes two other minor changes: - change the implemented syntax from 'if (cond)' to 'if cond', as specified by MLIR spec. - a minor fix to the implementation of the ForStmt. PiperOrigin-RevId: 210618122
* Implement operands for the lower and upper bounds of the for statement.Tatiana Shpeisman2019-03-291-7/+79
| | | | | | | | | | | | | | | This revamps implementation of the loop bounds in the ForStmt, using general representation that supports operands. The frequent case of constant bounds is supported via special access methods. This also includes: - Operand iterators for the Statement class. - OpPointer::is() method to query the class of the Operation. - Support for the bound shorthand notation parsing and printing. - Validity checks for the bound operands used as dim ids and symbols I didn't mean this CL to be so large. It just happened this way, as one thing led to another. PiperOrigin-RevId: 210204858
* Implement call and call_indirect ops.Chris Lattner2019-03-291-1/+10
| | | | | | This also fixes an infinite recursion in VariadicOperands that this turned up. PiperOrigin-RevId: 209692932
* Extend loop unrolling to unroll by a given factor; add builder for affineUday Bondhugula2019-03-291-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | apply op. - add builder for AffineApplyOp (first one for an operation that has non-zero operands) - add support for loop unrolling by a given factor; uses the affine apply op builder. While on this, change 'step' of ForStmt to be 'unsigned' instead of AffineConstantExpr *. Add setters for ForStmt lb, ub, step. Sample Input: // CHECK-LABEL: mlfunc @loop_nest_unroll_cleanup() { mlfunc @loop_nest_unroll_cleanup() { for %i = 1 to 100 { for %j = 0 to 17 { %x = "addi32"(%j, %j) : (affineint, affineint) -> i32 %y = "addi32"(%x, %x) : (i32, i32) -> i32 } } return } Output: $ mlir-opt -loop-unroll -unroll-factor=4 /tmp/single2.mlir #map0 = (d0) -> (d0 + 1) #map1 = (d0) -> (d0 + 2) #map2 = (d0) -> (d0 + 3) mlfunc @loop_nest_unroll_cleanup() { for %i0 = 1 to 100 { for %i1 = 0 to 17 step 4 { %0 = "addi32"(%i1, %i1) : (affineint, affineint) -> i32 %1 = "addi32"(%0, %0) : (i32, i32) -> i32 %2 = affine_apply #map0(%i1) %3 = "addi32"(%2, %2) : (affineint, affineint) -> i32 %4 = affine_apply #map1(%i1) %5 = "addi32"(%4, %4) : (affineint, affineint) -> i32 %6 = affine_apply #map2(%i1) %7 = "addi32"(%6, %6) : (affineint, affineint) -> i32 } for %i2 = 16 to 17 { %8 = "addi32"(%i2, %i2) : (affineint, affineint) -> i32 %9 = "addi32"(%8, %8) : (i32, i32) -> i32 } } return } PiperOrigin-RevId: 209676220
* Implement initial support for function attributes, including parser, printer,Chris Lattner2019-03-291-3/+18
| | | | | | | | | | resolver support. Still TODO are verifier support (to make sure you don't use an attribute for a function in another module) and the TODO in ModuleParser::finalizeModule that I will handle in the next patch. PiperOrigin-RevId: 209361648
* Implement a module-level symbol table for functions, enforcing uniqueness ofChris Lattner2019-03-291-3/+3
| | | | | | | names across the module and auto-renaming conflicts. Have the parser reject malformed modules that have redefinitions. PiperOrigin-RevId: 209227560
* Escape and unescape strings in the parser and printer so they can roundtrip,Chris Lattner2019-03-291-18/+62
| | | | | | | | | | | print floating point in a structured form that we know can round trip, enumerate attributes in the visitor so we print affine mapping attributes symbolically (the majority of the testcase updates). We still have an issue where the hexadecimal floating point syntax is reparsed as an integer, but that can evolve in subsequent patches. PiperOrigin-RevId: 208828876
* Implement return statement as RetOp operation. Add verification of the ↵Tatiana Shpeisman2019-03-291-1/+0
| | | | | | | | return statement placement and operands. Add parser and parsing error tests for return statements with non-zero number of operands. Add a few missing tests for ForStmt parsing errors. Prior to this CL, return statement had no explicit representation in MLIR. Now, it is represented as ReturnOp standard operation and is pretty printed according to the return statement syntax. This way statement walkers can process ML function return operands without making special case for them. PiperOrigin-RevId: 208092424
* Rework the cloning infrastructure for statements to be able to take and updateChris Lattner2019-03-291-8/+8
| | | | | | | | an operand mapping, which simplifies it a bit. Implement cloning for IfStmt, rename getThenClause() to getThen() which is unambiguous and less repetitive in use cases. PiperOrigin-RevId: 207915990
* Support for affine integer setsUday Bondhugula2019-03-291-6/+146
| | | | | | | | | | | | | - introduce affine integer sets into the IR - parse and print affine integer sets (both inline or outlined) similar to affine maps - use integer set for IfStmt's conditional, and implement parsing of IfStmt's conditional - fixed an affine expr paren omission bug while one this. TODO: parse/represent/print MLValue operands to affine integer set references. PiperOrigin-RevId: 207779408
* Use OperationState to simplify the create<Op> methods, move them out of line,Chris Lattner2019-03-291-3/+3
| | | | | | | and simplify some other things. Change ConstantIntOp to not match affine integers, since we now have ConstantAffineIntOp. PiperOrigin-RevId: 207756316
* Implement ML function arguments. Add representation for argument list in ML ↵Tatiana Shpeisman2019-03-291-13/+43
| | | | | | | | Function using TrailingObjects template. Implement argument iterators, parsing and printing. Unrelated minor change - remove OperationStmt::dropReferences(). Since MLFunction does not have cyclic operand references (it's an AST) destruction can be safely done w/o a special pass to drop references. PiperOrigin-RevId: 207583024
* Loop unrolling update.Uday Bondhugula2019-03-291-0/+9
| | | | | | | | | | | | | | | | - deal with non-operation stmt's (if/for stmt's) in loops being unrolled (unrolling of non-innermost loops works). - update uses in unrolled bodies to use results of new operations that may be introduced in the unrolled bodies. Unrolling now works for all kinds of loop nests - perfect nests, imperfect nests, loops at any depth, and with any kind of operation in the body. (IfStmt support not done, hence untested there). Added missing dump/print method for StmtBlock. TODO: add test case for outer loop unrolling. PiperOrigin-RevId: 207314286
* Fix segfaults when printing unlinked statements, instructions and blocks. ↵Tatiana Shpeisman2019-03-291-0/+14
| | | | | | Fancy printing requires a pointer to the function since SSA values get function-specific names. This CL adds checks to ensure that we don't dereference null pointers in unliked objects. Unlinked statements, instructions and blocks are printed as <<UNLINKED STATEMENT>> etc. PiperOrigin-RevId: 207293992
* [mlir] Correctly indent block terminatorsJames Molloy2019-03-291-0/+1
| | | | | | These were non-indented, which I thought was deliberate until Chris corrected me in cl/207115253 :) PiperOrigin-RevId: 207246887
* [mlir] Add a TypeAttr class, allow type attributesJames Molloy2019-03-291-0/+3
| | | | PiperOrigin-RevId: 207235956
* Have the asmprinter give true/false constants nice names, add a dump/printChris Lattner2019-03-291-3/+29
| | | | | | method to SSAValue. PiperOrigin-RevId: 207193088
* Give custom ops the ability to also access general additional attributes in theChris Lattner2019-03-291-8/+41
| | | | | | parser and printer. Fix the spelling of 'delimeter' PiperOrigin-RevId: 207189892
* [mlir] Fix ReturnInst printing for zero operandsJames Molloy2019-03-291-2/+3
| | | | | | No longer prints a trailing ':'. PiperOrigin-RevId: 207103812
* More simplification for affine binary op expr's.Uday Bondhugula2019-03-291-2/+2
| | | | | | | | | | | | | | | - simplify operations with identity elements (multiply by 1, add with 0). - simplify successive add/mul: fold constants, propagate constants to the right. - simplify floordiv and ceildiv when divisors are constants, and the LHS is a multiply expression with RHS constant. - fix an affine expression printing bug on paren emission. - while on this, fix affine-map test cases file (memref's using layout maps that were duplicates of existing ones should be emitted pointing to the unique'd one). PiperOrigin-RevId: 207046738
* [mlir] Add a string typeJames Molloy2019-03-291-0/+3
| | | | PiperOrigin-RevId: 206977161
* Use SFINAE to generalize << overloads, give 'constant' a pretty form,Chris Lattner2019-03-291-22/+91
| | | | | | | | | generalize the asmprinters handling of pretty names to allow arbitrary sugar to be dumped on various constructs. Give CFG function arguments nice "arg0" names like MLFunctions get, and give constant integers pretty names like %c37 for a constant 377 PiperOrigin-RevId: 206953080
* Clean up and extend MLFuncBuilder to allow creating statements in the middle ↵Tatiana Shpeisman2019-03-291-2/+3
| | | | | | | | of a statement block. Rename Statement::getFunction() and StmtBlock()::getFunction() to findFunction() to make it clear that this is not a constant time getter. Fix b/112039912 - we were recording 'i' instead of '%i' for loop induction variables causing "use of undefined SSA value" error. PiperOrigin-RevId: 206884644
* Fix some issues where we weren't printing affine map references symbolically.Chris Lattner2019-03-291-2/+8
| | | | | | | | Two problems: 1) we didn't visit the types in ops correctly, and 2) the general "T" version of the OpAsmPrinter inserter would match things like MemRefType& and print it directly. PiperOrigin-RevId: 206863642
* Revise the AffineExpr printing logic to be more careful about paren emission.Chris Lattner2019-03-291-35/+64
| | | | | | | | | This is still (intentionally) generating redundant parens for nested tightly binding expressions, but I think that is reasonable for readability sake. This also print x-y instead of x-(y*1) PiperOrigin-RevId: 206847212
* Use for statement directly as an operand instead of having it pretend to be ↵Tatiana Shpeisman2019-03-291-7/+5
| | | | | | an induction variable. PiperOrigin-RevId: 206759180
* Implement induction variables. Pretty print induction variable operands as ↵Tatiana Shpeisman2019-03-291-10/+41
| | | | | | | | | | %i<ssa value number>. Add support for future pretty printing of ML function arguments as %arg<ssa value number>. Induction variables are implemented by inheriting ForStmt from MLValue. ForStmt provides APIs that make this design decision invisible to the ForStmt users. This CL in combination with cl/206253643 resolves http://b/111769060. PiperOrigin-RevId: 206655937
* Change mlir-opt.cpp to take a list of passes to run, simplifying the driverChris Lattner2019-03-291-12/+12
| | | | | | | code. Change printing of affine map's to not print a space between the dim and symbol list. PiperOrigin-RevId: 206505419
* Finish parser/printer support for AffineMapOp, implement operand iterators onChris Lattner2019-03-291-14/+10
| | | | | | | VariadicOperands, tidy up some code in the asmprinter, fill out more verification logic in for LoadOp. PiperOrigin-RevId: 206443020
OpenPOWER on IntegriCloud