platform/upstream/llvm.git
5 years agoRefactor Quantization.md to separate TFLite native quantization scheme from the more...
Stella Laurenzo [Wed, 3 Apr 2019 19:40:30 +0000 (12:40 -0700)]
Refactor Quantization.md to separate TFLite native quantization scheme from the more experimental, generalized scheme.

PiperOrigin-RevId: 241785572

5 years ago Linalg portion of the tutorial - part 3-2
Nicolas Vasilache [Wed, 3 Apr 2019 19:33:01 +0000 (12:33 -0700)]
Linalg portion of the tutorial - part 3-2

    This CL adds support for lowering tensor contractions to loops declaratively.
    This is done thanks to two properties of the such operations:
    1. the definition of an AffineMap getLoopsToOperandRangesMap for each op which maps iteration space dimensions to ranges of the view operands, in their order of occurrence;
    2. the definition of a scalar implementation for each op which creates the computation inside the loops given enclosing parallel and reduction loops,

    All the other properties are derived in a generic fashion from these 2 properties and a few analyses.

    A lowerToLoops transformation is added as well as a test that exercises it.

--

PiperOrigin-RevId: 241783992

5 years ago [TableGen] Allow additional result patterns not directly used for replacement
Lei Zhang [Wed, 3 Apr 2019 19:29:14 +0000 (12:29 -0700)]
[TableGen] Allow additional result patterns not directly used for replacement

    This CL looses the requirement that all result patterns in a rewrite rule must
    replace a result of the root op in the source pattern. Now only the last N
    result pattern-generated ops are used to replace a N-result source op.

    This allows to generate additional ops to aid building up final ops used to
    replace the source op.

--

PiperOrigin-RevId: 241783192

5 years agoInitial release of the Quantization dialect
Stella Laurenzo [Wed, 3 Apr 2019 18:16:32 +0000 (11:16 -0700)]
Initial release of the Quantization dialect

Includes a draft of documentation for the quantization setup.

Given how many comments such docs have garnered in the past, I've biased towards a lightly edited first-draft so that people can argue about terminology, approach and structure without having spent too much time on it.

Note that the sections under "Uniform quantization" were cribbed nearly verbatim from internal documentation that Daniel wrote.

PiperOrigin-RevId: 241768668

5 years ago [TableGen] Fix convertFromStorage for OptionalAttr
Lei Zhang [Wed, 3 Apr 2019 17:48:07 +0000 (10:48 -0700)]
[TableGen] Fix convertFromStorage for OptionalAttr

    OptionalAttr is just wrapping around the actual attribute; so it should just use
    the actual attribute's `convertFromStorage` to read the value and wrap it around
    with `Optional<>` to return. Previously it was mandating how the actual attribute
    reads the value with `{0}.getValue()`.

--

PiperOrigin-RevId: 241762355

5 years ago Tutorial Linalg1: implement conversion to the LLVM Dialect
Alex Zinenko [Wed, 3 Apr 2019 17:38:47 +0000 (10:38 -0700)]
Tutorial Linalg1: implement conversion to the LLVM Dialect

    Implement conversion from the Linalg dialect to the LLVM dialect using a simple
    set of DialectOpConverters and by plugging them into the dialect conversion
    infrastructure.  View and Range Linalg types are converted into descriptors
    that store the dynamic values in an LLVM aggregate type, similarly to memrefs.
    Slice operations create new descriptors based on the original descriptors and
    thus remove the constraint on ViewTypes not being acceptable as function
    arguments.

--

PiperOrigin-RevId: 241760189

5 years agoAdd mention of the TensorFlow Code of Conduct in the Readme
Mehdi Amini [Wed, 3 Apr 2019 16:40:08 +0000 (09:40 -0700)]
Add mention of the TensorFlow Code of Conduct in the Readme

PiperOrigin-RevId: 241748009

5 years ago Add missing source file in CMakeLists.txt
Mehdi Amini [Wed, 3 Apr 2019 16:29:52 +0000 (09:29 -0700)]
Add missing source file in CMakeLists.txt

--

PiperOrigin-RevId: 241746122

5 years ago [TableGen] Remove asserts for attributes in aggregate builders
Lei Zhang [Wed, 3 Apr 2019 16:29:25 +0000 (09:29 -0700)]
[TableGen] Remove asserts for attributes in aggregate builders

    Attributes can have default values or be optional. Checking the validity of
    attributes in aggregate builder should consider that. And to be accurate,
    we should check all required attributes are indeed provided in the list.
    This is actually duplicating the work done by verifier. Checking the validity
    of attributes should be the responsiblity of verifiers. This CL removes
    the assertion for attributes in aggregate builders for the above reason.
    (Assertions for operands/results are still kept since they are trivial.)

    Also added more tests for aggregate builders.

--

PiperOrigin-RevId: 241746059

5 years ago Fix CMake build
Mehdi Amini [Wed, 3 Apr 2019 16:20:26 +0000 (09:20 -0700)]
Fix CMake build

    Some files were not built anymore internally but still referenced
    from CMake. Delete them and unreference them in the CMake files.

--

PiperOrigin-RevId: 241744718

5 years ago Update Readme to mention that the TensorFlow specific will be upstreamed later
Mehdi Amini [Wed, 3 Apr 2019 15:28:29 +0000 (08:28 -0700)]
Update Readme to mention that the TensorFlow specific will be upstreamed later

--

PiperOrigin-RevId: 241735845

5 years ago Drop MLIREmitter-based version of the EDSC
Alex Zinenko [Wed, 3 Apr 2019 13:11:03 +0000 (06:11 -0700)]
Drop MLIREmitter-based version of the EDSC

    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

5 years ago Python bindings: drop MLIREmitter and related functionality
Alex Zinenko [Wed, 3 Apr 2019 12:43:44 +0000 (05:43 -0700)]
Python bindings: drop MLIREmitter and related functionality

    This completes the transition of Python bindings to use the declarative
    builders infrastructure instead of the now-deprecated EDSC emitter
    infrastructure.  The relevant unit tests have been replicated using the new
    functionality and the remaining end-to-end compilation tests have been updated
    accordingly.  The latter show an improvement in brevity and readability.

--

PiperOrigin-RevId: 241713489

5 years ago Python bindings: support __floordiv__ for index types
Alex Zinenko [Wed, 3 Apr 2019 12:39:02 +0000 (05:39 -0700)]
Python bindings: support __floordiv__ for index types

    The original reimplementation of EDSC as declarative builders and the
    subsequent rework of Python bindings forbade to use the (true) division
    operator for values of the index types without providing an alternative.  Index
    types only support floor and ceil division through affine maps.  Expose this to
    Python bindings through a `__floordiv__` function on `ValueHandle`s.

--

PiperOrigin-RevId: 241713093

5 years ago Remove section of the README copied from the Rationale document, it does not...
Mehdi Amini [Wed, 3 Apr 2019 08:47:13 +0000 (01:47 -0700)]
Remove section of the README copied from the Rationale document, it does not fit here.

--

PiperOrigin-RevId: 241687723

5 years ago Fix test that fails on non-determinism in LowerVectorTransfers
Nicolas Vasilache [Wed, 3 Apr 2019 07:46:40 +0000 (00:46 -0700)]
Fix test that fails on non-determinism in LowerVectorTransfers

    This CL fixes the non-determinism across compilers in an edsc::select expression used in LowerVectorTransfers. This is achieved by factoring the expression out of the function call to ensure a deterministic order of evaluation.
    Since the expression is now factored out, fewer IR is generated and the test is updated accordingly.

--

PiperOrigin-RevId: 241679962

5 years agoFix path for the examples in Toy tutorial Ch1
Mehdi Amini [Wed, 3 Apr 2019 01:14:56 +0000 (18:14 -0700)]
Fix path for the examples in Toy tutorial Ch1

PiperOrigin-RevId: 241643625

5 years ago Add link to the Toy tutorial in the Readme
Mehdi Amini [Wed, 3 Apr 2019 01:07:26 +0000 (18:07 -0700)]
Add link to the Toy tutorial in the Readme

--

PiperOrigin-RevId: 241642739

5 years ago Add fake-use for variable in LLVMDialect.cpp to fix opt build.
River Riddle [Tue, 2 Apr 2019 22:50:51 +0000 (15:50 -0700)]
Add fake-use for variable in LLVMDialect.cpp to fix opt build.

--

PiperOrigin-RevId: 241620442

5 years ago Fix minor typo (triggered a GCC warning, NFC)
Mehdi Amini [Tue, 2 Apr 2019 22:41:22 +0000 (15:41 -0700)]
Fix minor typo (triggered a GCC warning, NFC)

--

PiperOrigin-RevId: 241618796

5 years ago Introduce custom format for the LLVM IR Dialect
Alex Zinenko [Tue, 2 Apr 2019 22:33:54 +0000 (15:33 -0700)]
Introduce custom format for the LLVM IR Dialect

    Historically, the LLVM IR dialect has been using the generic form of MLIR
    operation syntax.  It is verbose and often redundant.  Introduce the custom
    printing and parsing for all existing operations in the LLVM IR dialect.
    Update the relevant documentation and tests.

--

PiperOrigin-RevId: 241617393

5 years ago Add -DLLVM_BUILD_EXAMPLES to the mlir build instruction: this enables the tutoria...
Mehdi Amini [Tue, 2 Apr 2019 22:15:20 +0000 (15:15 -0700)]
Add -DLLVM_BUILD_EXAMPLES to the mlir build instruction: this enables the tutorial examples

    Seems like a better default for getting started.

--

PiperOrigin-RevId: 241614043

5 years ago Fix Toy tutorial gcc 7 build (NFC)
Mehdi Amini [Tue, 2 Apr 2019 22:13:26 +0000 (15:13 -0700)]
Fix Toy tutorial gcc 7 build (NFC)

--

PiperOrigin-RevId: 241613710

5 years ago Linalg portion of the tutorial - part 3
Nicolas Vasilache [Tue, 2 Apr 2019 21:35:09 +0000 (14:35 -0700)]
Linalg portion of the tutorial - part 3

    This CL starts the third part of the Linalg tutorial by adding support for ops to declare how they lower themselves to other ops.
    Tests are added that demonstrate matmul lowering to a loop over matvec and matvec lowering to a loop over dot.

    This is part of a list of CLs that add new Transforms and Analyses to Linalg3: it iseasier to integrate in small chunks.

    As part of working with the TensorContractionBase template class and in an effort to add pieces incrementally without copying code, it is easiest to define operations ahead of time in Linalg2/TensorOps.h and gradually implement them as needed. This CL performs the necessary refactoring for this to happen.

--

PiperOrigin-RevId: 241605869

5 years ago Update the dialect attribute verification hooks to return LogicalResult instead...
River Riddle [Tue, 2 Apr 2019 21:02:32 +0000 (14:02 -0700)]
Update the dialect attribute verification hooks to return LogicalResult instead of bool. This updates Function::emitError to return LogicalResult as well.

--

PiperOrigin-RevId: 241598892

5 years ago Provide default `affineMapComposition` and memory space on `MemRefType::get(...
Mehdi Amini [Tue, 2 Apr 2019 20:32:53 +0000 (13:32 -0700)]
Provide default `affineMapComposition` and memory space on `MemRefType::get()` (NFC)

    This matches the builder API.

--

PiperOrigin-RevId: 241592869

5 years ago Chapter 2 of the Toy tutorial
Mehdi Amini [Tue, 2 Apr 2019 20:11:20 +0000 (13:11 -0700)]
Chapter 2 of the Toy tutorial

    This introduces a basic MLIRGen through straight AST traversal,
    without dialect registration at this point.

--

PiperOrigin-RevId: 241588354

5 years ago Rewrite the verify hooks on operations to use LogicalResult instead of bool....
River Riddle [Tue, 2 Apr 2019 20:09:34 +0000 (13:09 -0700)]
Rewrite the verify hooks on operations to use LogicalResult instead of bool. This also changes the return of Operation::emitError/emitOpError to LogicalResult as well.

--

PiperOrigin-RevId: 241588075

5 years ago Linalg portion of the tutorial - part 2
Nicolas Vasilache [Tue, 2 Apr 2019 17:32:18 +0000 (10:32 -0700)]
Linalg portion of the tutorial - part 2

    The second part of the Linalg tutorial introduces:
    1. the TensorContractionBase type from which all tensor contractions derive;
    2. a basic set of operations DotOp, MatvecOp and MatmulOp;
    3. a helper function `createFullyComposedView` that walks the producers of a SliceOp up until the root ViewOp and returns a single ViewOp;
    4. programmatic examples to test MLIR construction involving these types.

    This CL also refactors file organization so that:
    1. clients only need to include Ops.h and Types.h while keeping independent small files separate for the purpose of the tutorial;
    2. each step of the tutorial has its own linalgxxx include directory and each include explicitly states in which part of the tutorial a particular concept was introduced.

    Lastly the following cleanups are applied:
    1. ValueOrSliceOp is removed in favor of simpler helper function.
    2. methods that walk back the chain of ops are removed from the core ops and added to a separate Analysis.
    3. various additional cleanups.

--

PiperOrigin-RevId: 241555769

5 years ago Update the Function and Module verifiers to return LogicalResult instead of bool.
River Riddle [Tue, 2 Apr 2019 17:24:11 +0000 (10:24 -0700)]
Update the Function and Module verifiers to return LogicalResult instead of bool.

--

PiperOrigin-RevId: 241553930

5 years ago Initial version for chapter 1 of the Toy tutorial
Mehdi Amini [Tue, 2 Apr 2019 17:02:07 +0000 (10:02 -0700)]
Initial version for chapter 1 of the Toy tutorial

--

PiperOrigin-RevId: 241549247

5 years ago Enable producer-consumer fusion for liveout memrefs if consumer read region match...
Andy Davis [Tue, 2 Apr 2019 13:37:40 +0000 (06:37 -0700)]
Enable producer-consumer fusion for liveout memrefs if consumer read region matches producer write region.

--

PiperOrigin-RevId: 241517207

5 years ago Update the pass ir-printing test to not rely on rtti type pretty printing.
River Riddle [Tue, 2 Apr 2019 10:48:45 +0000 (03:48 -0700)]
Update the pass ir-printing test to not rely on rtti type pretty printing.

--

PiperOrigin-RevId: 241498090

5 years ago Remove MLPatternLoweringPass and rewrite LowerVectorTransfers to use RewritePatte...
River Riddle [Tue, 2 Apr 2019 03:43:13 +0000 (20:43 -0700)]
Remove MLPatternLoweringPass and rewrite LowerVectorTransfers to use RewritePattern instead.

--

PiperOrigin-RevId: 241455472

5 years ago [TableGen] Add Confined, IntMinValue, and ArrayMinCount for attribute constraints
Lei Zhang [Tue, 2 Apr 2019 00:40:58 +0000 (17:40 -0700)]
[TableGen] Add Confined, IntMinValue, and ArrayMinCount for attribute constraints

    This CL introduces Confined as a general mechanism to compose complex attribute
    constraints out of more primitive ones. It's particularly useful for automatically
    generating op definitions from some external source, where we can have random
    combinations of primitive constraints and it would be impractical to define a case
    for each of such combination.

    Two primitive attribute constraints, IntMinValue and ArrayMinCount, are added to be
    used together with Confined.

--

PiperOrigin-RevId: 241435955

5 years ago Linalg portion of the tutorial - part 1
Nicolas Vasilache [Mon, 1 Apr 2019 22:15:09 +0000 (15:15 -0700)]
Linalg portion of the tutorial - part 1

    The first part of the Linalg tutorial introduces:
    1. the RangeType and ViewType;
    2. operations on those, namely RangeOp, ViewOp and SliceOp;
    3. programmatic examples to test MLIR construction involving these types, ops and affine.for loops (with a mock custom op called "some_consumer").

--

PiperOrigin-RevId: 241409949

5 years ago Use `this->` to access inherited member from dependent type (Fix GCC7 build,...
Mehdi Amini [Mon, 1 Apr 2019 18:28:27 +0000 (11:28 -0700)]
Use `this->` to access inherited member from dependent type (Fix GCC7 build, NFC)

--

PiperOrigin-RevId: 241364505

5 years ago Minor fixes to README.md (NFC)
Mehdi Amini [Mon, 1 Apr 2019 18:19:02 +0000 (11:19 -0700)]
Minor fixes to README.md (NFC)

    In particular fix the links to work on GitHub, and do not include RTTI to build.

--

PiperOrigin-RevId: 241362244

5 years ago Add a getLoc() method on mlir::Value that returns the loc of the defining Operati...
Mehdi Amini [Mon, 1 Apr 2019 17:42:34 +0000 (10:42 -0700)]
Add a getLoc() method on mlir::Value that returns the loc of the defining Operations if any, otherwise an unknown location

--

PiperOrigin-RevId: 241354085

5 years ago Add a getContext() convenient accessor on mlir::Value (NFC)
Mehdi Amini [Mon, 1 Apr 2019 17:36:50 +0000 (10:36 -0700)]
Add a getContext() convenient accessor on mlir::Value (NFC)

--

PiperOrigin-RevId: 241352789

5 years ago Fix MacOS build
Mehdi Amini [Mon, 1 Apr 2019 17:17:45 +0000 (10:17 -0700)]
Fix MacOS build

    This is making up for some differences in standard library and linker flags.
    It also get rid of the requirement to build with RTTI.

--

PiperOrigin-RevId: 241348845

5 years ago Rewrite ResultTypeIterator to be a mapped_iterator instead of an IndexedAccessorI...
River Riddle [Mon, 1 Apr 2019 17:03:18 +0000 (10:03 -0700)]
Rewrite ResultTypeIterator to be a mapped_iterator instead of an IndexedAccessorIterator. IndexedAccessorIterator makes some assumptions about the element type that do not hold for the result type, i.e. pointer elements. A mapped_iterator also better models the behavior of a ResultTypeIterator.

--

PiperOrigin-RevId: 241345949

5 years ago Support 0-d tensor type attributes
Feng Liu [Mon, 1 Apr 2019 17:01:47 +0000 (10:01 -0700)]
Support 0-d tensor type attributes

    This CL fixes the parser and printer to support the 0-d tensor type attributes.

--

PiperOrigin-RevId: 241345329

5 years ago Minor fixes on the typo/naming/style in the Pattern.cpp file
Feng Liu [Mon, 1 Apr 2019 16:39:59 +0000 (09:39 -0700)]
Minor fixes on the typo/naming/style in the Pattern.cpp file

--

PiperOrigin-RevId: 241341334

5 years ago [TableGen] Add EnumAttrCase and EnumAttr
Lei Zhang [Mon, 1 Apr 2019 15:58:53 +0000 (08:58 -0700)]
[TableGen] Add EnumAttrCase and EnumAttr

    This CL adds EnumAttr as a general mechanism for modelling enum attributes. Right now
    it is using StringAttr under the hood since MLIR does not have native support for enum
    attributes.

--

PiperOrigin-RevId: 241334043

5 years ago Add a flag to Dialect that allows for dialects to enable support for unregistered...
River Riddle [Mon, 1 Apr 2019 06:30:22 +0000 (23:30 -0700)]
Add a flag to Dialect that allows for dialects to enable support for unregistered operations. This flag is off by default and can be toggled via the 'allowUnknownOperations(...)' method. This means that moving forward an error will be emitted for unknown operations if the dialect does not explicitly allow it.

    Example:

    func @unknown_std_op() {
      %0 = "std.foo_bar_op"() : () -> index
      return
    }

    Will result in:

    error: unregistered operation 'std.foo_bar_op' found in dialect ('std') that does not allow unknown operations

--

PiperOrigin-RevId: 241266009

5 years ago Update variable in PassTiming to refer to system_clock instead of high_resolution...
River Riddle [Mon, 1 Apr 2019 05:08:12 +0000 (22:08 -0700)]
Update variable in PassTiming to refer to system_clock instead of high_resolution_clock.

--

PiperOrigin-RevId: 241260071

5 years ago Rename the 'namePrefix' field in the Dialect class to 'name' and tidy some commen...
River Riddle [Sat, 30 Mar 2019 05:30:54 +0000 (22:30 -0700)]
Rename the 'namePrefix' field in the Dialect class to 'name' and tidy some comments to make it clear that 'name' refers to the dialect namespace.

--

PiperOrigin-RevId: 241103116

5 years ago Implement basic IR support for a builtin complex<> type. As with tuples, we
Chris Lattner [Sat, 30 Mar 2019 05:23:34 +0000 (22:23 -0700)]
Implement basic IR support for a builtin complex<> type.  As with tuples, we
    have no standard ops for working with these yet, this is simply enough to
    represent and round trip them in the printer and parser.

--

PiperOrigin-RevId: 241102728

5 years ago Add build files and update README.
Jacques Pienaar [Sat, 30 Mar 2019 05:10:12 +0000 (22:10 -0700)]
Add build files and update README.

    * Add initial version of build files;
    * Update README with instructions to download and build MLIR from github;

--

PiperOrigin-RevId: 241102092

5 years ago Assert that registered dialects have unique names. This creates a guarantee that...
River Riddle [Fri, 29 Mar 2019 21:18:08 +0000 (14:18 -0700)]
Assert that registered dialects have unique names. This creates a guarantee that the namespace of a dialect can be used a unique key.

--

PiperOrigin-RevId: 241049578

5 years ago Remove the MLIRContext parameter from Dialect::parseType. Dialects already have...
River Riddle [Fri, 29 Mar 2019 21:06:51 +0000 (14:06 -0700)]
Remove the MLIRContext parameter from Dialect::parseType. Dialects already have access to the context via Dialect::getContext.

--

PiperOrigin-RevId: 241047077

5 years ago Update TypeBase::verifyConstructionInvariants to use a LogicalResult return inste...
River Riddle [Fri, 29 Mar 2019 20:59:28 +0000 (13:59 -0700)]
Update TypeBase::verifyConstructionInvariants to use a LogicalResult return instead of bool.

--

PiperOrigin-RevId: 241045568

5 years agoReplace usages of instruction with operation in the g3 documents.
River Riddle [Fri, 29 Mar 2019 20:15:06 +0000 (13:15 -0700)]
Replace usages of instruction with operation in the g3 documents.

PiperOrigin-RevId: 241037784

5 years agoCleanup SuperVectorization dialect printing and parsing.
Nicolas Vasilache [Fri, 29 Mar 2019 18:48:20 +0000 (11:48 -0700)]
Cleanup SuperVectorization dialect printing and parsing.

On the read side,
```
%3 = vector_transfer_read %arg0, %i2, %i1, %i0 {permutation_map: (d0, d1, d2)->(d2, d0)} : (memref<?x?x?xf32>, index, index, index) -> vector<32x256xf32>
```

becomes:

```
%3 = vector_transfer_read %arg0[%i2, %i1, %i0] {permutation_map: (d0, d1, d2)->(d2, d0)} : memref<?x?x?xf32>, vector<32x256xf32>
```

On the write side,

```
vector_transfer_write %0, %arg0, %c3, %c3 {permutation_map: (d0, d1)->(d0)} : vector<128xf32>, memref<?x?xf32>, index, index
```

becomes

```
vector_transfer_write %0, %arg0[%c3, %c3] {permutation_map: (d0, d1)->(d0)} : vector<128xf32>, memref<?x?xf32>
```

Documentation will be cleaned up in a followup commit that also extracts a proper .md from the top of the file comments.

PiperOrigin-RevId: 241021879

5 years agoremove the const quantifier before temp variable
Feng Liu [Fri, 29 Mar 2019 16:54:11 +0000 (09:54 -0700)]
remove the const quantifier before temp variable

PiperOrigin-RevId: 240997262

5 years agoMake createMaterializeVectorsPass take a vectorSize parameter - NFC
Nicolas Vasilache [Fri, 29 Mar 2019 16:47:30 +0000 (09:47 -0700)]
Make createMaterializeVectorsPass take a vectorSize parameter - NFC

This CL allows the programmatic control of the target hardware vector size when creating a MaterializeVectorsPass.
This is useful for registering passes for the tutorial.

PiperOrigin-RevId: 240996136

5 years ago[TableGen] Support benefit score in pattern definition.
Feng Liu [Fri, 29 Mar 2019 16:36:09 +0000 (09:36 -0700)]
[TableGen] Support benefit score in pattern definition.

A integer number can be specified in the pattern definition and used as the
adjustment to the default benefit score in the generated rewrite pattern C++
definition.

PiperOrigin-RevId: 240994192

5 years agoRefactor vectorization patterns
Nicolas Vasilache [Fri, 29 Mar 2019 16:34:06 +0000 (09:34 -0700)]
Refactor vectorization patterns

This CL removes the reliance of the vectorize pass on the specification of a `fastestVaryingDim` parameter. This parameter is a restriction meant to more easily target a particular loop/memref combination for vectorization and is mainly used for testing.

This also had the side-effect of restricting vectorization patterns to only the ones in which all memrefs were contiguous along the same loop dimension. This simple restriction prevented matmul to vectorize in 2-D.

this CL removes the restriction and adds the matmul test which vectorizes in 2-D along the parallel loops. Support for reduction loops is left for future work.

PiperOrigin-RevId: 240993827

5 years agoSlight rewording of TupleType rationale.
River Riddle [Fri, 29 Mar 2019 16:18:45 +0000 (09:18 -0700)]
Slight rewording of TupleType rationale.

PiperOrigin-RevId: 240991400

5 years agoUpdate the QuickstartRewrites document to include information about the new 'matchAnd...
River Riddle [Fri, 29 Mar 2019 15:59:20 +0000 (08:59 -0700)]
Update the QuickstartRewrites document to include information about the new 'matchAndRewrite' functionality in RewritePatterns.

PiperOrigin-RevId: 240987764

5 years ago[PassManager] Add a utility class, PrettyStackTraceParallelDiagnosticEntry, to emit...
River Riddle [Fri, 29 Mar 2019 15:52:06 +0000 (08:52 -0700)]
[PassManager] Add a utility class, PrettyStackTraceParallelDiagnosticEntry, to emit any queued up diagnostics in the event of a crash when multi-threading.

PiperOrigin-RevId: 240986566

5 years agoEnable input-reuse fusion to search function arguments for fusion candidates (takes...
MLIR Team [Fri, 29 Mar 2019 15:06:25 +0000 (08:06 -0700)]
Enable input-reuse fusion to search function arguments for fusion candidates (takes care of a TODO, enables another tutorial test case).

PiperOrigin-RevId: 240979894

5 years agoChange the vectorizer test pass to output via diagnostics instead of llvm::outs....
River Riddle [Fri, 29 Mar 2019 02:53:02 +0000 (19:53 -0700)]
Change the vectorizer test pass to output via diagnostics instead of llvm::outs. This allows for the output to be deterministic when multi-threading is enabled.

PiperOrigin-RevId: 240905858

5 years ago Support for type constraints across operand and results
MLIR Team [Fri, 29 Mar 2019 02:49:31 +0000 (19:49 -0700)]
Support for type constraints across operand and results

--

PiperOrigin-RevId: 240905555

5 years agoFixed a few instances of inconsistent grammar.
Tatiana Shpeisman [Fri, 29 Mar 2019 01:28:14 +0000 (18:28 -0700)]
Fixed a few instances of inconsistent grammar.

PiperOrigin-RevId: 240896336

5 years agoAddress some errors from g++
Jacques Pienaar [Fri, 29 Mar 2019 01:00:57 +0000 (18:00 -0700)]
Address some errors from g++

These fail with:

could not convert ‘module’ from ‘llvm::orc::ThreadSafeModule’ to
 ‘llvm::Expected<llvm::orc::ThreadSafeModule>’

PiperOrigin-RevId: 240892583

5 years agoAdd README file for MLIR.
Jacques Pienaar [Fri, 29 Mar 2019 00:37:29 +0000 (17:37 -0700)]
Add README file for MLIR.

PiperOrigin-RevId: 240889350

5 years agoRemove the LowerEDSCTestPass.
River Riddle [Fri, 29 Mar 2019 00:36:06 +0000 (17:36 -0700)]
Remove the LowerEDSCTestPass.

Most of the tests have been ported to be unit-tests and this pass is problematic in the way it depends on TableGen-generated files. This pass is also non-deterministic during multi-threading and a blocker to turning it on by default.

PiperOrigin-RevId: 240889154

5 years agoTidy up a few comments and error messages related to parsing multi-result operations.
River Riddle [Thu, 28 Mar 2019 23:18:52 +0000 (16:18 -0700)]
Tidy up a few comments and error messages related to parsing multi-result operations.

PiperOrigin-RevId: 240876306

5 years agoRemove extra qualification
Jacques Pienaar [Thu, 28 Mar 2019 23:13:32 +0000 (16:13 -0700)]
Remove extra qualification

PiperOrigin-RevId: 240875432

5 years agoLLVM IR Dialect: separate the conversion tool from the conversion pass
Alex Zinenko [Thu, 28 Mar 2019 23:10:07 +0000 (16:10 -0700)]
LLVM IR Dialect: separate the conversion tool from the conversion pass

Originally, the conversion to the LLVM IR dialect had been implemented as pass.
The common conversion infrastructure was factored into DialectConversion from
which the conversion pass inherited.  The conversion being a pass is
undesirable for callers that only need the conversion done, for example as a
part of sequence of conversions or outside the pass manager infrastructure.
Split the LLVM IR Dialect conversion into the conversion proper and the
conversion pass, where the latter contains the former instead of inheriting.
NFC.

PiperOrigin-RevId: 240874740

5 years agoDialect Conversion: convert regions of operations when cloning them
Alex Zinenko [Thu, 28 Mar 2019 22:58:53 +0000 (15:58 -0700)]
Dialect Conversion: convert regions of operations when cloning them

Dialect conversion currently clones the operations that did not match any
pattern.  This includes cloning any regions that belong to these operations.
Instead, apply conversion recursively to the nested regions.

Note that if an operation matched one of the conversion patterns, it is up to
the pattern rewriter to fill in the regions of the converted operation.  This
may require calling back to the converter and is left for future work.

PiperOrigin-RevId: 240872410

5 years agoNFC - Handle IndexedValue corner case
Nicolas Vasilache [Thu, 28 Mar 2019 22:12:18 +0000 (15:12 -0700)]
NFC - Handle IndexedValue corner case

Implicit conversion don't play nicely in expressions such as:
`C() = A(i) * B(i)`.

Make `C()` return an IndexedValue instead of casting to ValueHandle.
This prevents double capture errors and is useful for the tutorial.

PiperOrigin-RevId: 240863223

5 years agoChange the muli-return syntax for operations. The name of the operation result now...
River Riddle [Thu, 28 Mar 2019 21:58:52 +0000 (14:58 -0700)]
Change the muli-return syntax for operations. The name of the operation result now contains the number of results that it refers to if the number of results is greater than 1.

Example:
    %call:2 = call @multi_return() : () -> (f32, i32)
    use(%calltensorflow/mlir#0, %calltensorflow/mlir#1)

This cl also adds parser support for uniquely named result values. This means that a test writer can now write something like:
    %foo, %bar = call @multi_return() : () -> (f32, i32)
    use(%foo, %bar)

Note: The printer will still print the collapsed form.
PiperOrigin-RevId: 240860058

5 years agoRemove overly conservative check in LoopFusion pass (enables fusion in tutorial example).
MLIR Team [Thu, 28 Mar 2019 21:54:49 +0000 (14:54 -0700)]
Remove overly conservative check in LoopFusion pass (enables fusion in tutorial example).

PiperOrigin-RevId: 240859227

5 years ago[PassManager] Define a ParallelDiagnosticHandler to ensure that diagnostics are still...
River Riddle [Thu, 28 Mar 2019 18:40:17 +0000 (11:40 -0700)]
[PassManager] Define a ParallelDiagnosticHandler to ensure that diagnostics are still produced in a deterministic order when multi-threading.

PiperOrigin-RevId: 240817922

5 years agoRename InstOperand to OpOperand.
River Riddle [Thu, 28 Mar 2019 18:25:19 +0000 (11:25 -0700)]
Rename InstOperand to OpOperand.

PiperOrigin-RevId: 240814651

5 years agoRemove global LLVM CLI variables from library code
Dimitrios Vytiniotis [Thu, 28 Mar 2019 16:20:13 +0000 (09:20 -0700)]
Remove global LLVM CLI variables from library code

Plus move parsing code into the MLIR CPU runner binary.

PiperOrigin-RevId: 240786709

5 years agoReplace remaining usages of the Instruction class with Operation.
River Riddle [Thu, 28 Mar 2019 15:24:38 +0000 (08:24 -0700)]
Replace remaining usages of the Instruction class with Operation.

PiperOrigin-RevId: 240777521

5 years agoCleanup vectorize_1d.mlir test - NFC
Nicolas Vasilache [Thu, 28 Mar 2019 01:04:19 +0000 (18:04 -0700)]
Cleanup vectorize_1d.mlir test - NFC

This CL splits a large monolithic test function into smaller ones that are each CHECK-LABEL'd

PiperOrigin-RevId: 240684979

5 years agoMake vectorization aware of loop semantics
Nicolas Vasilache [Thu, 28 Mar 2019 00:50:34 +0000 (17:50 -0700)]
Make vectorization aware of loop semantics

Now that we have a dependence analysis, we can check that loops are indeed parallel and make vectorization correct.

PiperOrigin-RevId: 240682727

5 years agoUpdate the multi-threaded pass timing to not assume that total time will be different...
River Riddle [Thu, 28 Mar 2019 00:43:08 +0000 (17:43 -0700)]
Update the multi-threaded pass timing to not assume that total time will be different from user time.

PiperOrigin-RevId: 240681618

5 years agoMove test of trait using dialect ops, to dialects of ops.
Jacques Pienaar [Thu, 28 Mar 2019 00:33:40 +0000 (17:33 -0700)]
Move test of trait using dialect ops, to dialects of ops.

PiperOrigin-RevId: 240680010

5 years agoSmall edit for clarity. ("Zero dimensions" reads to me as "rank of zero.")
MLIR Team [Wed, 27 Mar 2019 23:16:15 +0000 (16:16 -0700)]
Small edit for clarity. ("Zero dimensions" reads to me as "rank of zero.")

PiperOrigin-RevId: 240664300

5 years agoMove TF dialect test to dialect.
Jacques Pienaar [Wed, 27 Mar 2019 21:52:34 +0000 (14:52 -0700)]
Move TF dialect test to dialect.

PiperOrigin-RevId: 240646586

5 years agoGive the Vectorize pass a virtualVectorSize argument.
Nicolas Vasilache [Wed, 27 Mar 2019 21:12:01 +0000 (14:12 -0700)]
Give the Vectorize pass a virtualVectorSize argument.

This CL allows vectorization to be called and configured in other ways than just via command line arguments.
This allows triggering vectorization programmatically.

PiperOrigin-RevId: 240638208

5 years ago[TableGen] Change names for Builder* and OperationState* parameters to avoid collision
Lei Zhang [Wed, 27 Mar 2019 21:09:19 +0000 (14:09 -0700)]
[TableGen] Change names for Builder* and OperationState* parameters to avoid collision

The `Builder*` parameter is unused in both generated build() methods so that we can
leave it unnamed. Changed stand-alone parameter build() to take `_tblgen_state` instead
of `result` to allow `result` to avoid having name collisions with op operand,
attribute, or result.

PiperOrigin-RevId: 240637700

5 years agoAdd support for multi-threaded pass timing.
River Riddle [Wed, 27 Mar 2019 21:02:26 +0000 (14:02 -0700)]
Add support for multi-threaded pass timing.

When multi-threading is enabled in the pass manager the meaning of the display
slightly changes. First, a new timing column is added, `User Time`, that
displays the total time spent across all threads. Secondly, the `Wall Time`
column displays the longest individual time spent amongst all of the threads.
This means that the `Wall Time` column will continue to give an indicator on the
perceived time, or clock time, whereas the `User Time` will display the total
cpu time.

Example:

$ mlir-opt foo.mlir -experimental-mt-pm -cse -canonicalize -convert-to-llvmir -pass-timing

===-------------------------------------------------------------------------===
                      ... Pass execution timing report ...
===-------------------------------------------------------------------------===
  Total Execution Time: 0.0078 seconds

   ---User Time---   ---Wall Time---  --- Name ---
   0.0175 ( 88.3%)     0.0055 ( 70.4%)  Function Pipeline
   0.0018 (  9.3%)     0.0006 (  8.1%)    CSE
   0.0013 (  6.3%)     0.0004 (  5.8%)      (A) DominanceInfo
   0.0017 (  8.7%)     0.0006 (  7.1%)    FunctionVerifier
   0.0128 ( 64.6%)     0.0039 ( 50.5%)    Canonicalizer
   0.0011 (  5.7%)     0.0004 (  4.7%)    FunctionVerifier
   0.0004 (  2.1%)     0.0004 (  5.2%)  ModuleVerifier
   0.0010 (  5.3%)     0.0010 ( 13.4%)  LLVMLowering
   0.0009 (  4.3%)     0.0009 ( 11.0%)  ModuleVerifier
   0.0198 (100.0%)     0.0078 (100.0%)  Total

PiperOrigin-RevId: 240636269

5 years agoReplace usages of Instruction with Operation in the Transforms/ directory.
River Riddle [Wed, 27 Mar 2019 21:02:02 +0000 (14:02 -0700)]
Replace usages of Instruction with Operation in the Transforms/ directory.

PiperOrigin-RevId: 240636130

5 years agoSimplify API uses of `getContext()` (NFC)
Mehdi Amini [Wed, 27 Mar 2019 20:57:02 +0000 (13:57 -0700)]
Simplify API uses of `getContext()` (NFC)

The Pass base class is providing a convenience getContext() accessor.

PiperOrigin-RevId: 240634961

5 years agoAllow to mutate the type of MLIR Value in-place
Mehdi Amini [Wed, 27 Mar 2019 20:38:48 +0000 (13:38 -0700)]
Allow to mutate the type of MLIR Value in-place

This avoid trashing memory by cloning and replaceAllUseswith when
performing type inference.

PiperOrigin-RevId: 240631137

5 years agoFix include path in test pass.
Jacques Pienaar [Wed, 27 Mar 2019 20:24:05 +0000 (13:24 -0700)]
Fix include path in test pass.

PiperOrigin-RevId: 240628260

5 years agoInitialize std::atomic directly.
Jacques Pienaar [Wed, 27 Mar 2019 19:36:57 +0000 (12:36 -0700)]
Initialize std::atomic directly.

Avoids error in OSS build:
error: copying variable of type 'std::atomic<unsigned int>' invokes deleted constructor
PiperOrigin-RevId: 240618765

5 years agoAdd a method to swap the type of a function in-place
Mehdi Amini [Wed, 27 Mar 2019 19:20:51 +0000 (12:20 -0700)]
Add a method to swap the type of a function in-place

This is motivated by the need to translate function across dialect which
requires morphing their type, as well as the Toy tutorial part on interprocedural
shape inference.

The alternative is cloning the function, but it is heavy and it seems like an
arbitrary restriction to forbid morphing the function type.

PiperOrigin-RevId: 240615755

5 years agoUse dereference instead of implicit conversion for IndexedValue to Value*.
Jacques Pienaar [Wed, 27 Mar 2019 18:36:36 +0000 (11:36 -0700)]
Use dereference instead of implicit conversion for IndexedValue to Value*.

Avoids ambiguous constructor error on some compilers.

PiperOrigin-RevId: 240606838

5 years agoAdd missing numeric header for std::accumulate.
Jacques Pienaar [Wed, 27 Mar 2019 17:38:23 +0000 (10:38 -0700)]
Add missing numeric header for std::accumulate.

PiperOrigin-RevId: 240593135

5 years agoLLVM IR Conversion: support zero-dimensional memrefs
Alex Zinenko [Wed, 27 Mar 2019 16:39:31 +0000 (09:39 -0700)]
LLVM IR Conversion: support zero-dimensional memrefs

The spec allows zero-dimensional memrefs to exist and treats them essentially
as single-element buffers.  Unlike single-dimensional memrefs of static shape
<1xTy>, zero-dimensional memrefs do not require indices to access the only
element they store.  Add support of zero-dimensional memrefs to the LLVM IR
conversion.  In particular, such memrefs are converted into bare pointers, and
accesses to them are converted to bare loads and stores, without the overhead
of `getelementptr %buffer, 0`.

PiperOrigin-RevId: 240579456

5 years agoLLVM IR Conversion: keep LLVM dialect types as is during conversion
Alex Zinenko [Wed, 27 Mar 2019 16:16:27 +0000 (09:16 -0700)]
LLVM IR Conversion: keep LLVM dialect types as is during conversion

When converting to the LLVM IR Dialect, it is possible for the input IR to
contain LLVM IR Dialect operation and/or types, for example, some functions may
have been coverted to the LLVM IR Dialect already, or may have been created
using this dialect directly.  Make sure that type conversion keeps LLVM IR
Dialect types unmodified and does not error out.  Operations are already kept
as is.

PiperOrigin-RevId: 240574972

5 years agoReplace usages of Instruction with Operation in the /Analysis directory.
River Riddle [Wed, 27 Mar 2019 15:55:17 +0000 (08:55 -0700)]
Replace usages of Instruction with Operation in the /Analysis directory.

PiperOrigin-RevId: 240569775