summaryrefslogtreecommitdiffstats
path: root/mlir/lib/TableGen
Commit message (Collapse)AuthorAgeFilesLines
...
* [doc] Generate more readable description for operandsLei Zhang2019-03-291-6/+4
| | | | | | | | This CL mandated TypeConstraint and Type to provide descriptions and fixed various subclasses and definitions to provide so. The purpose is to enforce good documentation; using empty string as the default just invites oversight. PiperOrigin-RevId: 231579629
* TableGen: Use DAG for op resultsLei Zhang2019-03-291-0/+15
| | | | | | | | | Similar to op operands and attributes, use DAG to specify operation's results. This will allow us to provide names and matchers for outputs. Also Defined `outs` as a marker to indicate the start of op result list. PiperOrigin-RevId: 231422455
* Prefix Operator getter methods with "get" to be consistentLei Zhang2019-03-291-2/+2
| | | | PiperOrigin-RevId: 231416230
* Add tblgen::Pattern to model Patterns defined in TableGenLei Zhang2019-03-292-0/+141
| | | | | | | Similar to other tblgen:: abstractions, tblgen::Pattern hides the native TableGen API and provides a nicer API that is more coherent with the TableGen definitions. PiperOrigin-RevId: 231285143
* Define mAttr in terms of AttrConstraint.Jacques Pienaar2019-03-292-21/+29
| | | | | | | * Matching an attribute and specifying a attribute constraint is the same thing executionally, so represent it such. * Extract AttrConstraint helper to match TypeConstraint and use that where mAttr was previously used in RewriterGen. PiperOrigin-RevId: 231213580
* Pull TableGen op argument definitions into their own filesLei Zhang2019-03-292-17/+39
| | | | PiperOrigin-RevId: 230923050
* Add default attr value & define tf.AvgPool op and use pattern for rewrite.Jacques Pienaar2019-03-291-0/+13
| | | | | | | | | | | Add default values to attributes, to allow attribute being left unspecified. The attr getter will always return an attribute so callers need not check for it, if the attribute is not set then the default will be returned (at present the default will be constructed upon query but this will be changed). Add op definition for tf.AvgPool in ops.td, rewrite matcher using pattern using attribute matching & transforms. Adding some helper functions to make it simpler. Handle attributes with dialect prefix and map them to getter without dialect prefix. Note: VerifyAvgPoolOp could probably be autogenerated by know given the predicate specification on attributes, but deferring that to a follow up. PiperOrigin-RevId: 230364857
* Start doc generation pass.Jacques Pienaar2019-03-291-0/+16
| | | | | | | | | | Start doc generation pass that generates simple markdown output. The output is formatted simply[1] in markdown, but this allows seeing what info we have, where we can refine the op description (e.g., the inputs is probably redundant), what info is missing (e.g., the attributes could probably have a description). The formatting of the description is still left up to whatever was in the op definition (which luckily, due to the uniformity in the .td file, turned out well but relying on the indentation there is fragile). The mechanism to autogenerate these post changes has not been added yet either. The output file could be run through a markdown formatter too to remove extra spaces. [1]. This is not proposal for final style :) There could also be a discussion around single doc vs multiple (per dialect, per op), whether we want a TOC, whether operands/attributes should be headings or just formatted differently ... PiperOrigin-RevId: 230354538
* Add AttrConstraint to enable generating verification for attribute values.Jacques Pienaar2019-03-291-0/+15
| | | | | | | Change MinMaxAttr to match hasValidMinMaxAttribute behavior. Post rewriting the other users of that function it could be removed too. The currently generated error message is: error: 'tfl.fake_quant' op attribute 'minmax' failed to satisfy constraint of MinMaxAttr PiperOrigin-RevId: 229775631
* TableGen: implement predicate tree and basic simplificationAlex Zinenko2019-03-292-5/+305
| | | | | | | | | | | | | | | | | | | | | | A recent change in TableGen definitions allowed arbitrary AND/OR predicate compositions at the cost of removing known-true predicate simplification. Introduce a more advanced simplification mechanism instead. In particular, instead of folding predicate C++ expressions directly in TableGen, keep them as is and build a predicate tree in TableGen C++ library. The predicate expression-substitution mechanism, necessary to implement complex predicates for nested classes such as `ContainerType`, is replaced by a dedicated predicate. This predicate appears in the predicate tree and can be used for tree matching and separation. More specifically, subtrees defined below such predicate may be subject to different transformations than those that appear above. For example, a subtree known to be true above the substitution predicate is not necessarily true below it. Use the predicate tree structure to eliminate known-true and known-false predicates before code emission, as well as to collapse AND and OR predicates if their value can be deduced based on the value of one child. PiperOrigin-RevId: 229605997
* Add attribute matching and transform to pattern rewrites.Jacques Pienaar2019-03-291-11/+13
| | | | | | | | Start simple with single predicate match & transform rules for attributes. * Its unclear whether modelling Attr predicates will be needed so start with allowing matching attributes with a single predicate. * The input and output attr type often differs and so add ability to specify a transform between the input and output format. PiperOrigin-RevId: 229580879
* TableGen: untie Attr from TypeAlex Zinenko2019-03-292-14/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | In TableGen definitions, the "Type" class has been used for types of things that can be stored in Attributes, but not necessarily present in the MLIR type system. As a consequence, records like "String" or "DerviedAttrBody" were of class "Type", which can be confusing. Furthermore, the "builderCall" field of the "Type" class serves only for attribute construction. Some TableGen "Type" subclasses that correspond to MLIR kinds of types do not have a canonical way of construction only from the data available in TableGen, e.g. MemRefType would require the list of affine maps. This leads to a conclusion that the entities that describe types of objects appearing in Attributes should be independent of "Type": they have some properties "Type"s don't and vice versa. Do not parameterize Tablegen "Attr" class by an instance of "Type". Instead, provide a "constBuilderCall" field that can be used to build an attribute from a constant value stored in TableGen instead of indirectly going through Attribute.Type.builderCall. Some attributes still don't have a "constBuilderCall" because they used to depend on types without a "builderCall". Drop definitions of class "Type" that don't correspond to MLIR Types. Provide infrastructure to define type-dependent attributes and string-backed attributes for convenience. PiperOrigin-RevId: 229570087
* TableGen: extract TypeConstraints from TypeAlex Zinenko2019-03-293-62/+46
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | MLIR has support for type-polymorphic instructions, i.e. instructions that may take arguments of different types. For example, standard arithmetic operands take scalars, vectors or tensors. In order to express such instructions in TableGen, we need to be able to verify that a type object satisfies certain constraints, but we don't need to construct an instance of this type. The existing TableGen definition of Type requires both. Extract out a TypeConstraint TableGen class to define restrictions on types. Define the Type TableGen class as a subclass of TypeConstraint for consistency. Accept records of the TypeConstraint class instead of the Type class as values in the Arguments class when defining operators. Replace the predicate logic TableGen class based on conjunctive normal form with the predicate logic classes allowing for abitrary combinations of predicates using Boolean operators (AND/OR/NOT). The combination is implemented using simple string rewriting of C++ expressions and, therefore, respects the short-circuit evaluation order. No logic simplification is performed at the TableGen level so all expressions must be valid C++. Maintaining CNF using TableGen only would have been complicated when one needed to introduce top-level disjunction. It is also unclear if it could lead to a significantly simpler emitted C++ code. In the future, we may replace inplace predicate string combination with a tree structure that can be simplified in TableGen's C++ driver. Combined, these changes allow one to express traits like ArgumentsAreFloatLike directly in TableGen instead of relying on C++ trait classes. PiperOrigin-RevId: 229398247
* Avoid redundant predicate checking in type matching.Jacques Pienaar2019-03-292-2/+20
| | | | | | | | Expand type matcher template generator to consider a set of predicates that are known to hold. This avoids inserting redundant checking for trivially true predicates (for example predicate that hold according to the op definition). This only targets predicates that trivially holds and does not attempt any logic equivalence proof. PiperOrigin-RevId: 228880468
* Add tblgen::Attribute to wrap around TableGen Attr defsLei Zhang2019-03-292-12/+83
| | | | | | | | This CL added a tblgen::Attribute class to wrap around raw TableGen Record getValue*() calls on Attr defs, which will provide a nicer API for handling TableGen Record. PiperOrigin-RevId: 228581107
* Put Operator and PredCNF into the tblgen namespaceLei Zhang2019-03-293-23/+31
| | | | PiperOrigin-RevId: 228429130
* Add tblgen::Type to wrap around TableGen Type defsLei Zhang2019-03-293-8/+74
| | | | | | | | | | This CL added a tblgen::Type class to wrap around raw TableGen Record getValue*() calls on Type defs, which will provide a nicer API for handling TableGen Record. The PredCNF class is also updated to work together with tblgen::Type. PiperOrigin-RevId: 228429090
* Various tiny refinements over TableGen Operator classLei Zhang2019-03-291-10/+10
| | | | | | | | Use "native" vs "derived" to differentiate attributes on ops: native ones are specified when creating the op as a part of defining the op, while derived ones are computed from properties of the op. PiperOrigin-RevId: 228186962
* Match attributes in input pattern.Jacques Pienaar2019-03-291-0/+17
| | | | | | | | | | Bind attributes similar to operands. Use to rewrite leakyreulo and const rewrite pattern. The attribute type/attributes are not currently checked so should only be used where the attributes match due to the construction of the op. To support current attribute namespacing, convert __ in attribute name to "$" for matching purposes ('$' is not valid character in variable in TableGen). Some simplification to make it simpler to specify indented ostream and avoid so many spaces. The goal is not to have perfectly formatted code generated but good enough so that its still easy to read for a user. PiperOrigin-RevId: 228183639
* Verify type of operands match those specifed in op registry.Jacques Pienaar2019-03-292-0/+63
| | | | | | | | | | | | | | Expand type to include matcher predicates. Use CNF form to allow specifying combinations of constraints for type. The matching call for the type is used to verify the construction of the operation as well as in rewrite pattern generation. The matching initially includes redundant checks (e.g., even if the operand of the op is guaranteed to satisfy some requirement, it is still checked during matcher generation for now). As well as some of the traits specified now check what the generated code already checks. Some of the traits can be removed in future as the verify method will include the relevant checks based on the op definition already. More work is needed for variadic operands. CNF form is used so that in the follow up redundant checks in the rewrite patterns could be omitted (e.g., when matching a F32Tensor, one does not need to verify that op X's operand 0 is a Tensor if that is guaranteed by op X's definition). The alternative was to have single matcher function specified, but this would not allow for reasoning about what attributes already hold (at the level of PredAtoms). Use this new operand type restrictions to rewrite BiasAdd with floating point operands as declarative pattern. PiperOrigin-RevId: 227991412
* Use Operator class in OpDefinitionsGen. Cleanup NFC.Jacques Pienaar2019-03-291-9/+21
| | | | PiperOrigin-RevId: 227764826
* Match the op via isa instead of string compare.Jacques Pienaar2019-03-291-0/+3
| | | | | | | * Match using isa - This limits the rewrite pattern to ops defined in op registry but that is probably better end state (esp. for additional verification). PiperOrigin-RevId: 227598946
* Add convenience wrapper for operator in tblgenJacques Pienaar2019-03-291-0/+126
Add convenience wrapper to make it easier to iterate over attributes and operands of operator defined in TableGen file. Use this class in RewriterGen (not used in the op generator yet, will do shortly). Change the RewriterGen to pass the bound arguments explicitly, this is in preparation for multi-op matching. PiperOrigin-RevId: 227156748
OpenPOWER on IntegriCloud