platform/upstream/llvm.git
4 years agoRemove the need for passing a location to parseAttribute/parseType.
River Riddle [Fri, 1 Nov 2019 22:39:30 +0000 (15:39 -0700)]
Remove the need for passing a location to parseAttribute/parseType.

Now that a proper parser is passed to these methods, there isn't a need to explicitly pass a source location. The source location can be recovered from the parser as necessary. This removes the need to explicitly decode an SMLoc in the case where we don't need to, which can be expensive.

This requires adding some basic nesting support to the parser for supporting nested parsers to allow for remapping source locations of the nested parsers to the top level parser for accurate diagnostics. This is due to the fact that the attribute and type parsers use different source buffers than the top level parser, as they may be represented in string form.

PiperOrigin-RevId: 278014858

4 years agoAdd DialectAsmParser/Printer classes to simplify dialect attribute and type parsing.
River Riddle [Fri, 1 Nov 2019 21:47:42 +0000 (14:47 -0700)]
Add DialectAsmParser/Printer classes to simplify dialect attribute and type parsing.

These classes are functionally similar to the OpAsmParser/Printer classes and provide hooks for parsing attributes/tokens/types/etc. This change merely sets up the base infrastructure and updates the parser hooks, followups will add hooks as needed to simplify existing handrolled dialect parsers.

This has various different benefits:
*) Attribute/Type parsing is much simpler to define.
*) Dialect attributes/types that contain other attributes/types can now use aliases.
*) It provides a 'spec' with which we may use in the future to auto-generate parsers/printers.
*) Error messages emitted by attribute/type parsers can provide character exact locations rather than "beginning of the string"

PiperOrigin-RevId: 278005322

4 years agoAdd ReferToOp attribute constraint for SymbolRefAttr
Lei Zhang [Fri, 1 Nov 2019 21:26:10 +0000 (14:26 -0700)]
Add ReferToOp attribute constraint for SymbolRefAttr

This constraint can be used to limit a SymbolRefAttr to point
to a specific kind of op in the closest parent with a symbol table.

PiperOrigin-RevId: 278001364

4 years agoDelete spurious file
Nicolas Vasilache [Fri, 1 Nov 2019 18:27:41 +0000 (11:27 -0700)]
Delete spurious file

PiperOrigin-RevId: 277967079

4 years agoMove BitEnumAttr from SPIRVBase.td to OpBase.td
Lei Zhang [Fri, 1 Nov 2019 18:17:23 +0000 (11:17 -0700)]
Move BitEnumAttr from SPIRVBase.td to OpBase.td

BitEnumAttr is a mechanism for modelling attributes whose value is
a bitfield. It should not be scoped to the SPIR-V dialect and can
be used by other dialects too.

This CL is mostly shuffling code around and adding tests and docs.
Functionality changes are:

* Fixed to use `getZExtValue()` instead of `getSExtValue()` when
  getting the value from the underlying IntegerAttr for a case.
* Changed to auto-detect whether there is a case whose value is
  all bits unset (i.e., zero). If so handle it specially in all
  helper methods.

PiperOrigin-RevId: 277964926

4 years agoSupport lowering of imperfectly nested loops into GPU dialect.
Mahesh Ravishankar [Fri, 1 Nov 2019 17:51:33 +0000 (10:51 -0700)]
Support lowering of imperfectly nested loops into GPU dialect.

The current lowering of loops to GPU only supports lowering of loop
nests where the loops mapped to workgroups and workitems are perfectly
nested. Here a new lowering is added to handle lowering of imperfectly
nested loop body with the following properties
1) The loops partitioned to workgroups are perfectly nested.
2) The loop body of the inner most loop partitioned to workgroups can
contain one or more loop nests that are to be partitioned across
workitems. Each individual loops nests partitioned to workitems should
also be perfectly nested.
3) The number of workgroups and workitems are not deduced from the
loop bounds but are passed in by the caller of the lowering as values.
4) For statements within the perfectly nested loop nest partitioned
across workgroups that are not loops, it is valid to have all threads
execute that statement. This is NOT verified.

PiperOrigin-RevId: 277958868

4 years agoAdd Linalg pattern for producer-consumer fusion
Nicolas Vasilache [Fri, 1 Nov 2019 15:29:42 +0000 (08:29 -0700)]
Add Linalg pattern for producer-consumer fusion

This CL adds a simple pattern for specifying producer-consumer fusion on Linalg operations.

Implementing such an extension reveals some interesting properties.
Since Linalg operates on a buffer abstraction, the output buffers are specified as in/out parameters to the ops. As a consequence, there are no SSA use-def chains and one cannot specify complex dag input patterns with the current infrastructure.

Instead this CL uses constraints based on the existing linalg dependence analysis to focus the pattern and refine patterns based on the type of op that last wrote in a buffer.

This is a very local property and is less powerful than the generic dag specification based on SSA use-def chains.

This will be generalized in the future.

PiperOrigin-RevId: 277931503

4 years ago[mlir][llvm] Add missing cast ops
James Molloy [Fri, 1 Nov 2019 14:31:33 +0000 (07:31 -0700)]
[mlir][llvm] Add missing cast ops

Also adds a builder method for fcmp, identical to that for icmp.

PiperOrigin-RevId: 277923158

4 years agoNFC: Use #ifndef in various .td files instead of #ifdef and #else
Lei Zhang [Thu, 31 Oct 2019 20:29:14 +0000 (13:29 -0700)]
NFC: Use #ifndef in various .td files instead of #ifdef and #else

Upstream LLVM gained support for #ifndef with https://reviews.llvm.org/D61888

This is changed mechanically via the following command:

find . -name "*.td" -exec sed -i -e ':a' -e 'N' -e '$!ba' -e 's/#ifdef \([A-Z_]*\)\n#else/#ifndef \1/g' {} \;

PiperOrigin-RevId: 277789427

4 years agoAdd a test for lowering GPU ops that cover cases where the symbol table isn't held...
Mehdi Amini [Thu, 31 Oct 2019 17:34:39 +0000 (10:34 -0700)]
Add a test for lowering GPU ops that cover cases where the symbol table isn't held by a ModuleOp (NFC)

PiperOrigin-RevId: 277752004

4 years agoAdd a test.symbol_scope operation that has the SymbolTable Traits to the Test dialect
Mehdi Amini [Thu, 31 Oct 2019 16:49:16 +0000 (09:49 -0700)]
Add a test.symbol_scope operation that has the SymbolTable Traits to the Test dialect

PiperOrigin-RevId: 277741687

4 years agoLinalgDependenceGraph: add const modifiers to accessors
Alex Zinenko [Thu, 31 Oct 2019 15:58:34 +0000 (08:58 -0700)]
LinalgDependenceGraph: add const modifiers to accessors

MLIR const-correctness policy is to avoid having `const` on IR objects.
LinalgDependenceGraph is not an IR object but an auxiliary data structure.
Furthermore, it is not updated once constructed unlike IR objects. Add const
qualifiers to get* and find* methods of LinalgDependenceGraph since they are
not modifying the graph. This allows transformation functions that require the
dependence graph to take it by const-reference, clearly indicating that they
are not modifying it (and that the graph may have to be recomputed after the
transformation).

PiperOrigin-RevId: 277731608

4 years agoNFC: Simplify UseRange::iterator to just be a std::vector::const_iterator.
River Riddle [Wed, 30 Oct 2019 22:25:35 +0000 (15:25 -0700)]
NFC: Simplify UseRange::iterator to just be a std::vector::const_iterator.

At some point the implementation of UseRange was more complex, but now it is just a simple wrapper around a std::vector<SymbolUse>.

PiperOrigin-RevId: 277597294

4 years ago[spirv] Add cast operations
Denis Khalikov [Wed, 30 Oct 2019 21:41:26 +0000 (14:41 -0700)]
[spirv] Add cast operations

This CL added op definitions for a few cast operations:

* OpConvertFToU
* OpConvertFToS
* OpConvertSToF
* OpConvertUToF
* OpUConvert
* OpSConvert
* OpFConvert

Also moved the definition of spv.Bitcast to the new file.

Closes tensorflow/mlir#208 and tensorflow/mlir#174

COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/208 from denis0x0D:sandbox/cast_ops 79bc9b37398aafddee6cf6beb301807988fe67f9
PiperOrigin-RevId: 277587891

4 years agoUse `not` to invert return code in expected to fail tests
Lei Zhang [Wed, 30 Oct 2019 21:37:45 +0000 (14:37 -0700)]
Use `not` to invert return code in expected to fail tests

Windows does not like the RUN command of `(... || true) | ...`.

PiperOrigin-RevId: 277587031

4 years agoDump op location in createPrintOpGraphPass for easier debugging.
Jing Pu [Wed, 30 Oct 2019 18:21:54 +0000 (11:21 -0700)]
Dump op location in createPrintOpGraphPass for easier debugging.

PiperOrigin-RevId: 277546527

4 years agoAdd support to GreedyPatternRewriter for erasing unreachable blocks.
River Riddle [Wed, 30 Oct 2019 18:18:51 +0000 (11:18 -0700)]
Add support to GreedyPatternRewriter for erasing unreachable blocks.

Rewrite patterns may make modifications to the CFG, including dropping edges between blocks. This change adds a simple unreachable block elimination run at the end of each iteration to ensure that the CFG remains valid.

PiperOrigin-RevId: 277545805

4 years agoAdd a utility accessor 'has_single_element' for ranges.
River Riddle [Wed, 30 Oct 2019 18:13:52 +0000 (11:13 -0700)]
Add a utility accessor 'has_single_element' for ranges.

This provides an easy way to check if a range has a single element.

PiperOrigin-RevId: 277544647

4 years agoFix segfault when no symbol is given to an constraint operand
Lei Zhang [Wed, 30 Oct 2019 18:12:21 +0000 (11:12 -0700)]
Fix segfault when no symbol is given to an constraint operand

This fixed the segfault when we see the following pattern:
  Pat<(...), (...), [(... 1, 2, 3), ...]>

PiperOrigin-RevId: 277544300

4 years agoAdd basic support for declarative Linalg transformations
Nicolas Vasilache [Wed, 30 Oct 2019 14:12:07 +0000 (07:12 -0700)]
Add basic support for declarative Linalg transformations

Linalg ops provide a good anchor for pattern matching/rewriting transformations.
This CL adds a simple example of how multi-level tiling may be specified by attaching a simple StringAttr to ops as they are transformed so we can easily specify partial lowering to control transformation application.

This is a first stab at taking advantage of higher-level information contained in Linalg ops and will evolve in the future.

PiperOrigin-RevId: 277497958

4 years ago[spirv] Fix gen_spirv_dialect.py and add spv.Unreachable
Lei Zhang [Wed, 30 Oct 2019 12:40:47 +0000 (05:40 -0700)]
[spirv] Fix gen_spirv_dialect.py and add spv.Unreachable

This CL fixed gen_spirv_dialect.py to support nested delimiters when
chunking existing ODS entries in .td files and to allow ops without
correspondence in the spec. This is needed to pull in the definition
of OpUnreachable.

PiperOrigin-RevId: 277486465

4 years ago[spirv] Mark control flow ops as InFunctionScope
Lei Zhang [Tue, 29 Oct 2019 22:06:10 +0000 (15:06 -0700)]
[spirv] Mark control flow ops as InFunctionScope

PiperOrigin-RevId: 277373473

4 years agoAdd "[TOC]" to generated documentation
MLIR Team [Tue, 29 Oct 2019 20:38:32 +0000 (13:38 -0700)]
Add "[TOC]" to generated documentation

PiperOrigin-RevId: 277354482

4 years agoBugfix: Keep worklistMap in sync with worklist in GreedyPatternRewriter
Diego Caballero [Tue, 29 Oct 2019 17:57:56 +0000 (10:57 -0700)]
Bugfix: Keep worklistMap in sync with worklist in GreedyPatternRewriter

When we removed a pattern, we removed it from worklist but not from
worklistMap. Then, when we tried to add a new pattern on the same Operation
again, the pattern wasn't added since it already existed in the
worklistMap (but not in the worklist).

Closes tensorflow/mlir#211

PiperOrigin-RevId: 277319669

4 years ago[spirv] Use LLVM graph traversal utility for PrettyBlockOrderVisitor
Lei Zhang [Tue, 29 Oct 2019 14:03:26 +0000 (07:03 -0700)]
[spirv] Use LLVM graph traversal utility for PrettyBlockOrderVisitor

This removes a bunch of special tailored DFS code in favor of the common
LLVM utility. Besides, we avoid recursion with system stack given that
llvm::depth_first_ext is iterator based and maintains its own stack.
PiperOrigin-RevId: 277272961

4 years agoAdd a convenient operation build method for spirv::SelectOp
Mahesh Ravishankar [Tue, 29 Oct 2019 06:03:54 +0000 (23:03 -0700)]
Add a convenient operation build method for spirv::SelectOp

The SelectOp always has the same result type as its true/false
value. Add a builder method that uses the operand type to get the
result type.

PiperOrigin-RevId: 277217978

4 years ago[spirv] Support OpPhi using block arguments
Lei Zhang [Mon, 28 Oct 2019 22:58:11 +0000 (15:58 -0700)]
[spirv] Support OpPhi using block arguments

This CL adds another control flow instruction in SPIR-V: OpPhi.
It is modelled as block arguments to be idiomatic with MLIR.
See the rationale.md doc for "Block Arguments vs PHI nodes".
Serialization and deserialization is updated to convert between
block arguments and SPIR-V OpPhi instructions.

PiperOrigin-RevId: 277161545

4 years agoParse locations in parseGenericOperation
Sean Silva [Mon, 28 Oct 2019 22:11:00 +0000 (15:11 -0700)]
Parse locations in parseGenericOperation

For ops that recursively re-enter the parser to parse an operation (such as
ops with a "wraps" pretty form), this ensures that the wrapped op will parse
its location, which can then be used for the locations of the wrapping op
and any other implicit ops.

PiperOrigin-RevId: 277152636

4 years agoStandardize Linalg transformations to take an OpBuilder and an OperationFolder - NFC
Nicolas Vasilache [Mon, 28 Oct 2019 21:55:43 +0000 (14:55 -0700)]
Standardize Linalg transformations to take an OpBuilder and an OperationFolder - NFC

This will be used to specify declarative Linalg transformations in a followup CL. In particular, the PatternRewrite mechanism does not allow folding and has its own way of tracking erasure.

PiperOrigin-RevId: 277149158

4 years agoAdd support for marking an operation as recursively legal.
River Riddle [Mon, 28 Oct 2019 17:03:57 +0000 (10:03 -0700)]
Add support for marking an operation as recursively legal.

In some cases, it may be desirable to mark entire regions of operations as legal. This provides an additional granularity of context to the concept of "legal". The `ConversionTarget` supports marking operations, that were previously added as `Legal` or `Dynamic`, as `recursively` legal. Recursive legality means that if an operation instance is legal, either statically or dynamically, all of the operations nested within are also considered legal. An operation can be marked via `markOpRecursivelyLegal<>`:

```c++
ConversionTarget &target = ...;

/// The operation must first be marked as `Legal` or `Dynamic`.
target.addLegalOp<MyOp>(...);
target.addDynamicallyLegalOp<MySecondOp>(...);

/// Mark the operation as always recursively legal.
target.markOpRecursivelyLegal<MyOp>();
/// Mark optionally with a callback to allow selective marking.
target.markOpRecursivelyLegal<MyOp, MySecondOp>([](Operation *op) { ... });
/// Mark optionally with a callback to allow selective marking.
target.markOpRecursivelyLegal<MyOp>([](MyOp op) { ... });
```

PiperOrigin-RevId: 277086382

4 years agoPrint reason why dynamic library could not be loaded during execution.
Christian Sigg [Mon, 28 Oct 2019 11:24:43 +0000 (04:24 -0700)]
Print reason why dynamic library could not be loaded during execution.

PiperOrigin-RevId: 277037138

4 years agoLookup function declaration in SymbolTable not ModuleOp.
Alexander Belyaev [Mon, 28 Oct 2019 10:45:00 +0000 (03:45 -0700)]
Lookup function declaration in SymbolTable not ModuleOp.

PiperOrigin-RevId: 277033167

4 years agoFix include guards and add tests for OpToFuncCallLowering.
Alexander Belyaev [Sat, 26 Oct 2019 15:20:59 +0000 (08:20 -0700)]
Fix include guards and add tests for OpToFuncCallLowering.

PiperOrigin-RevId: 276859463

4 years agoDefine AnyRankedTensor Type in TableGen
Smit Hinsu [Fri, 25 Oct 2019 17:31:26 +0000 (10:31 -0700)]
Define AnyRankedTensor Type in TableGen

PiperOrigin-RevId: 276714649

4 years agoAdd support for parsing multiple result name groups.
River Riddle [Fri, 25 Oct 2019 16:33:32 +0000 (09:33 -0700)]
Add support for parsing multiple result name groups.

This allows for parsing things like:

%name_1, %name_2:5, %name_3:2 = "my.op" ...

This is useful for operations that have groups of variadic result values. The
total number of results is expected to match the number of results defined by
the operation.

PiperOrigin-RevId: 276703280

4 years ago[spirv] AccessChainOp canonicalization.
Denis Khalikov [Fri, 25 Oct 2019 01:40:38 +0000 (18:40 -0700)]
[spirv] AccessChainOp canonicalization.

Combine chained `spirv::AccessChainOp` operations into one
`spirv::AccessChainOp` operation.

Closes tensorflow/mlir#198

COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/198 from denis0x0D:sandbox/canon_access_chain 0cb87955a85511071143d62637ff939d0dabc2bd
PiperOrigin-RevId: 276609345

4 years agoConvert the Canonicalize and CSE passes to generic Operation Passes.
River Riddle [Thu, 24 Oct 2019 22:00:36 +0000 (15:00 -0700)]
Convert the Canonicalize and CSE passes to generic Operation Passes.

This allows for them to be used on other non-function, or even other function-like, operations. The algorithms are already generic, so this is simply changing the derived pass type. The majority of this change is just ensuring that the nesting of these passes remains the same, as the pass manager won't auto-nest them anymore.

PiperOrigin-RevId: 276573038

4 years agoAdd support for replacing all uses of a symbol.
River Riddle [Thu, 24 Oct 2019 17:46:47 +0000 (10:46 -0700)]
Add support for replacing all uses of a symbol.

This requires reconstructing the attribute dictionary of each operation containing a use.

PiperOrigin-RevId: 276520544

4 years agoAdd missing dependency on MLIRIR on MLIREDSCInterface
Mehdi Amini [Thu, 24 Oct 2019 17:37:18 +0000 (10:37 -0700)]
Add missing dependency on MLIRIR on MLIREDSCInterface

MLIRIR includes generated header for interfaces, including these headers require
an extra dependency to ensure these headers are generated before we attempt to
build MLIREDSCInterface.

PiperOrigin-RevId: 276518255

4 years agoAdd custom lowering of ExpOp for NVVM and ROCM.
Alexander Belyaev [Thu, 24 Oct 2019 08:41:25 +0000 (01:41 -0700)]
Add custom lowering of ExpOp for NVVM and ROCM.

PiperOrigin-RevId: 276440911

4 years agoWrap ODS to 80 lines and remove const qualifier for local `int` variable (NFC)
Alexander Belyaev [Thu, 24 Oct 2019 05:18:58 +0000 (22:18 -0700)]
Wrap ODS to 80 lines and remove const qualifier for local `int` variable (NFC)

This addresses post-submit comments on 00d2a37e32

PiperOrigin-RevId: 276419770

4 years agoAdd @below and @above directives to verify-diagnostics.
River Riddle [Wed, 23 Oct 2019 22:56:02 +0000 (15:56 -0700)]
Add @below and @above directives to verify-diagnostics.

This simplifies defining expected-* directives when there are multiple that apply to the next or previous line. @below applies the directive to the next non-designator line, i.e. the next line that does not contain an expected-* designator. @above applies to the previous non designator line.

Examples:

// Expect an error on the next line that does not contain a designator.
// expected-remark@below {{remark on function below}}
// expected-remark@below {{another remark on function below}}
func @bar(%a : f32)

// Expect an error on the previous line that does not contain a designator.
func @baz(%a : f32)
// expected-remark@above {{remark on function above}}
// expected-remark@above {{another remark on function above}}

PiperOrigin-RevId: 276369085

4 years agoFix "set-but-unused" warning in DialectConversion
Alex Zinenko [Wed, 23 Oct 2019 21:31:44 +0000 (14:31 -0700)]
Fix "set-but-unused" warning in DialectConversion

The variable in question is only used in an assertion,
leading to a warning in opt builds.

PiperOrigin-RevId: 276352259

4 years agoNFC: Remove references to the toy.generic attribute.
River Riddle [Wed, 23 Oct 2019 21:30:01 +0000 (14:30 -0700)]
NFC: Remove references to the toy.generic attribute.

This was used for shape inference in the previous tutorial flow.

PiperOrigin-RevId: 276351916

4 years agoDrop MemRefUtils from the ExecutionEngine
Alex Zinenko [Wed, 23 Oct 2019 14:42:37 +0000 (07:42 -0700)]
Drop MemRefUtils from the ExecutionEngine

The ExecutionEngine was updated recently to only take the LLVM dialect as
input. Memrefs are no longer expected in the signature of the entry point
function by the executor so there is no need to allocate and free them. The
code in MemRefUtils is therefore dead and furthermore out of sync with the
recent evolution of memref type to support strides. Drop it.

PiperOrigin-RevId: 276272302

4 years agoUpdate chapter 3 code snippet to match the actual output of the code
MLIR Team [Tue, 22 Oct 2019 19:17:59 +0000 (12:17 -0700)]
Update chapter 3 code snippet to match the actual output of the code

PiperOrigin-RevId: 276117540

4 years agoUpdate loop.for verifier message
Uday Bondhugula [Tue, 22 Oct 2019 14:34:24 +0000 (07:34 -0700)]
Update loop.for verifier message

fix: nonnegative -> positive

Closes tensorflow/mlir#206

COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/206 from bondhugula:bondhugula-patch-1 9a47ca7dfd230180a9df33e9a64b33d02252d30a
PiperOrigin-RevId: 276060885

4 years agoExpose optimizations flags in Python bindings
Alex Zinenko [Tue, 22 Oct 2019 14:31:18 +0000 (07:31 -0700)]
Expose optimizations flags in Python bindings

ExecutionEngine currently supports additional parameters that can be used to
run LLVM transformations during JIT compilation. Expose this to Python
bindings. When the ExecutionEngine functionality is moved to LLVM, the
bindings-specific code can be updated to interact with LLVM.

PiperOrigin-RevId: 276060475

4 years agoNFC: Remove a right parenthesis from comment.
Hanhan Wang [Tue, 22 Oct 2019 05:44:16 +0000 (22:44 -0700)]
NFC: Remove a right parenthesis from comment.
PiperOrigin-RevId: 275998781

4 years agoNFC: Add support for parsing attributes programmatically via mlir::parseAttribute.
River Riddle [Tue, 22 Oct 2019 04:34:21 +0000 (21:34 -0700)]
NFC: Add support for parsing attributes programmatically via mlir::parseAttribute.

This matches the behavior of the public mlir::parseType, and even uses the internal implementation.

PiperOrigin-RevId: 275989777

4 years ago[DRR] Allow interleaved operands and attributes
Lei Zhang [Tue, 22 Oct 2019 03:47:49 +0000 (20:47 -0700)]
[DRR] Allow interleaved operands and attributes

Previously DRR assumes attributes to appear after operands. This was the
previous requirements on ODS, but that has changed some time ago. Fix
DRR to also support interleaved operands and attributes.

PiperOrigin-RevId: 275983485

4 years ago[spirv] Allow block arguments on spv.Branch(Conditional)
Lei Zhang [Tue, 22 Oct 2019 00:31:32 +0000 (17:31 -0700)]
[spirv] Allow block arguments on spv.Branch(Conditional)

We will use block arguments as the way to model SPIR-V OpPhi in
the SPIR-V dialect.

This CL also adds a few useful helper methods to both ops to
get the block arguments.

Also added tests for branch weight (de)serialization.

PiperOrigin-RevId: 275960797

4 years agoUse LLVM_Type instead of AnyType in the definition of LLVM_CallOp
Alex Zinenko [Mon, 21 Oct 2019 21:11:50 +0000 (14:11 -0700)]
Use LLVM_Type instead of AnyType in the definition of LLVM_CallOp

The type constraint had to be relaxed due to the order of lowering passes in
the examples, that since has been fixed. The relaxed version was still used by
the CUDA lowering for launch sizes of `index` type. This is not necessary since
the GPU dialect does not restrict the type of the launch size operands. Use an
LLVM type instead and restore the check in the LLVM_CallOp definition.

PiperOrigin-RevId: 275920109

4 years agoCleanup and rewrite Ch-4.md.
River Riddle [Mon, 21 Oct 2019 18:31:59 +0000 (11:31 -0700)]
Cleanup and rewrite Ch-4.md.

This change rewrites Ch-4.md to introduced interfaces in a detailed step-by-step manner, adds examples, and fixes some errors.

PiperOrigin-RevId: 275887017

4 years agoNFC: Fix remaining usages of MulOp as matrix multiplication.
River Riddle [Mon, 21 Oct 2019 18:30:58 +0000 (11:30 -0700)]
NFC: Fix remaining usages of MulOp as matrix multiplication.

MulOp now represents an element-wise multiplication instead of a matrix multiplication.

PiperOrigin-RevId: 275886774

4 years agoUnify GPU op definition names with other dialects.
Christian Sigg [Mon, 21 Oct 2019 18:10:13 +0000 (11:10 -0700)]
Unify GPU op definition names with other dialects.

Rename GPU op names from gpu_Foo to GPU_FooOp.

PiperOrigin-RevId: 275882232

4 years agoNFC: Elide the value of a UnitAttr within nested attribute dictionaries.
River Riddle [Mon, 21 Oct 2019 18:01:38 +0000 (11:01 -0700)]
NFC: Elide the value of a UnitAttr within nested attribute dictionaries.

This matches the behavior of the top level attribute dictionary.

PiperOrigin-RevId: 275879828

4 years agoAdd a Symbol trait to simplify defining operations that represent symbols.
River Riddle [Mon, 21 Oct 2019 16:58:22 +0000 (09:58 -0700)]
Add a Symbol trait to simplify defining operations that represent symbols.

This trait provides accessors for the name, symbol use list methods, verification, with more to be added.

PiperOrigin-RevId: 275864554

4 years agoNFC: Fix typo : Retur -> Return
River Riddle [Sun, 20 Oct 2019 22:12:45 +0000 (15:12 -0700)]
NFC: Fix typo : Retur -> Return
PiperOrigin-RevId: 275745931

4 years agoUpdate Ch1 to reflect new changes in the tutorial.
River Riddle [Sun, 20 Oct 2019 21:59:59 +0000 (14:59 -0700)]
Update Ch1 to reflect new changes in the tutorial.

The chapter list is out of date, as well as mentions of matrix multiplication(now element-wise multiplication).

PiperOrigin-RevId: 275744911

4 years ago[DRR] Address GCC warning by wrapping for statement body with {}
Lei Zhang [Sun, 20 Oct 2019 19:23:38 +0000 (12:23 -0700)]
[DRR] Address GCC warning by wrapping for statement body with {}

Otherwise, we'll see the following warning when compiling with GCC 8:

warning: this ?for? clause does not guard... [-Wmisleading-indentation]
PiperOrigin-RevId: 275735925

4 years agoFix minor spelling tweaks (NFC)
Kazuaki Ishizaki [Sun, 20 Oct 2019 16:44:06 +0000 (09:44 -0700)]
Fix minor spelling tweaks (NFC)

Closes tensorflow/mlir#175

PiperOrigin-RevId: 275726876

4 years agoFix minor spelling tweaks (NFC)
Kazuaki Ishizaki [Sun, 20 Oct 2019 07:11:03 +0000 (00:11 -0700)]
Fix minor spelling tweaks (NFC)

Closes tensorflow/mlir#177

PiperOrigin-RevId: 275692653

4 years agoAdd SourceMgrDiagnosticHandler to toy
Jacques Pienaar [Sat, 19 Oct 2019 21:36:07 +0000 (14:36 -0700)]
Add SourceMgrDiagnosticHandler to toy

PiperOrigin-RevId: 275659433

4 years agoAdd missing include to StringMap in Verifier and DialectConversion.
Jacques Pienaar [Sat, 19 Oct 2019 20:38:31 +0000 (13:38 -0700)]
Add missing include to StringMap in Verifier and DialectConversion.

PiperOrigin-RevId: 275656416

4 years agoAdd missing include to llvm Allocator.h
Mehdi Amini [Sat, 19 Oct 2019 19:10:34 +0000 (12:10 -0700)]
Add missing include to llvm Allocator.h

This header is not self-contained otherwise.

PiperOrigin-RevId: 275651582

4 years agoSlight rewording in toy ch2 to make persistence of name clearer
Jacques Pienaar [Sat, 19 Oct 2019 18:59:31 +0000 (11:59 -0700)]
Slight rewording in toy ch2 to make persistence of name clearer

PiperOrigin-RevId: 275650756

4 years agoUse new eraseOp instead of replaceOp with empty values
Geoffrey Martin-Noble [Sat, 19 Oct 2019 13:03:50 +0000 (06:03 -0700)]
Use new eraseOp instead of replaceOp with empty values

PiperOrigin-RevId: 275631166

4 years agoGet active source lane predicate from shuffle instruction.
Christian Sigg [Sat, 19 Oct 2019 08:52:51 +0000 (01:52 -0700)]
Get active source lane predicate from shuffle instruction.

nvvm.shfl.sync.bfly optionally returns a predicate whether source lane was active. Support for this was added to clang in https://reviews.llvm.org/D68892.

Add an optional 'pred' unit attribute to the instruction to return this predicate. Specify this attribute in the partial warp reduction so we don't need to manually compute the predicate.

PiperOrigin-RevId: 275616564

4 years agoNFC: Cleanup the implementation of walkSymbolUses.
River Riddle [Sat, 19 Oct 2019 04:28:47 +0000 (21:28 -0700)]
NFC: Cleanup the implementation of walkSymbolUses.

Refactor the implementation to be much cleaner by adding a `make_second_range` utility to walk the `second` value of a range of pairs.

PiperOrigin-RevId: 275598985

4 years agoNFC: Add missing include for StringMap.
River Riddle [Sat, 19 Oct 2019 02:20:29 +0000 (19:20 -0700)]
NFC: Add missing include for StringMap.
PiperOrigin-RevId: 275588019

4 years agoNFC: Rename SPIR-V serializer find*ID() to get*ID() to be consistent
Lei Zhang [Sat, 19 Oct 2019 01:15:28 +0000 (18:15 -0700)]
NFC: Rename SPIR-V serializer find*ID() to get*ID() to be consistent

We use get*() in deserizer and other places across the codebase.

PiperOrigin-RevId: 275582390

4 years agoAdd support for function result attributes.
Sean Silva [Fri, 18 Oct 2019 23:02:56 +0000 (16:02 -0700)]
Add support for function result attributes.

This allows dialect-specific attributes to be attached to func results. (or more specifically, FunctionLike ops).

For example:

```
func @f() -> (i32 {my_dialect.some_attr = 3})
```

This attaches my_dialect.some_attr with value 3 to the first result of func @f.

Another more complex example:

```
func @g() -> (i32, f32 {my_dialect.some_attr = "foo", other_dialect.some_other_attr = [1,2,3]}, i1)
```

Here, the second result has two attributes attached.

PiperOrigin-RevId: 275564165

4 years agoLower vector transfer ops to loop.for operations.
Nicolas Vasilache [Fri, 18 Oct 2019 21:09:42 +0000 (14:09 -0700)]
Lower vector transfer ops to loop.for operations.

This allows mixing linalg operations with vector transfer operations (with additional modifications to affine ops) and is a step towards solving tensorflow/mlir#189.

PiperOrigin-RevId: 275543361

4 years agoImplement lowering of VectorTypeCastOp to LLVM
Nicolas Vasilache [Fri, 18 Oct 2019 20:48:26 +0000 (13:48 -0700)]
Implement lowering of VectorTypeCastOp to LLVM

A VectorTypeCastOp can only be used to lower between statically sized contiguous memrefs of scalar and matching vector type. The sizes and strides are thus fully static and easy to determine.

A relevant test is added.

This is a step towards solving tensorflow/mlir#189.

PiperOrigin-RevId: 275538981

4 years agoSlightly rephrase a difficult-to-parse sentence.
reinerp [Fri, 18 Oct 2019 17:28:02 +0000 (10:28 -0700)]
Slightly rephrase a difficult-to-parse sentence.

PiperOrigin-RevId: 275499524

4 years ago[DRR] Use eraseOp() to replace no-result ops
Lei Zhang [Fri, 18 Oct 2019 15:19:54 +0000 (08:19 -0700)]
[DRR] Use eraseOp() to replace no-result ops

PiperOrigin-RevId: 275475229

4 years agoAutomated rollback of commit 575405f4d6762830c1c4520569de4e4ed3c8eed5
Nicolas Vasilache [Fri, 18 Oct 2019 13:44:41 +0000 (06:44 -0700)]
Automated rollback of commit 575405f4d6762830c1c4520569de4e4ed3c8eed5

PiperOrigin-RevId: 275461067

4 years agoFix OSS target name GPUtoNVVMTransforms -> MLIRGPUtoNVVMTransforms
Nicolas Vasilache [Fri, 18 Oct 2019 12:22:12 +0000 (05:22 -0700)]
Fix OSS target name GPUtoNVVMTransforms -> MLIRGPUtoNVVMTransforms

This unbreaks the `cmake -G Ninja ../llvm -DLLVM_BUILD_EXAMPLES=ON -DLLVM_TARGETS_TO_BUILD="host"`
 in my local OSS build

PiperOrigin-RevId: 275452330

4 years agoUse StrEnumAttr for gpu.allreduce op instead of StringAttr to better encode constraints.
Stephan Herhut [Fri, 18 Oct 2019 11:44:15 +0000 (04:44 -0700)]
Use StrEnumAttr for gpu.allreduce op instead of StringAttr to better encode constraints.

PiperOrigin-RevId: 275448372

4 years agoAdd documentation on restrictions to dialect conversion rewrites
Geoffrey Martin-Noble [Fri, 18 Oct 2019 09:40:06 +0000 (02:40 -0700)]
Add documentation on restrictions to dialect conversion rewrites

PiperOrigin-RevId: 275435593

4 years agoAdd gpu.barrier op to synchronize invocations of a local workgroup.
Christian Sigg [Fri, 18 Oct 2019 07:30:14 +0000 (00:30 -0700)]
Add gpu.barrier op to synchronize invocations of a local workgroup.

Adding gen table for rewrite patterns from GPU to NVVM dialect.

Copy missing op documentation from GPUOps.td to GPU.md.

PiperOrigin-RevId: 275419588

4 years agoNFC: Remove trivial builder get methods.
River Riddle [Fri, 18 Oct 2019 03:08:01 +0000 (20:08 -0700)]
NFC: Remove trivial builder get methods.

These don't add any value, and some are even more restrictive than the respective static 'get' method.

PiperOrigin-RevId: 275391240

4 years agoAutomated rollback of commit b65c8bb5d6ab418bb3fcd0302aee19d3615d90f1
River Riddle [Fri, 18 Oct 2019 00:11:06 +0000 (17:11 -0700)]
Automated rollback of commit b65c8bb5d6ab418bb3fcd0302aee19d3615d90f1

PiperOrigin-RevId: 275370861

4 years agoIntroduce a wrapper around ConversionPattern that operates on the derived class
Geoffrey Martin-Noble [Thu, 17 Oct 2019 22:18:31 +0000 (15:18 -0700)]
Introduce a wrapper around ConversionPattern that operates on the derived class

Analogous to OpRewritePattern, this makes writing conversion patterns more convenient.

PiperOrigin-RevId: 275349854

4 years agoAdd EDSC support for loop.for operations
Nicolas Vasilache [Thu, 17 Oct 2019 22:18:07 +0000 (15:18 -0700)]
Add EDSC support for loop.for operations

This CL adds support for loop.for operations in EDSC and adds a test.
This will be used in a followup commit to implement lowering of vector_transfer ops so that it works more generally and is not subject to affine constraints.

PiperOrigin-RevId: 275349796

4 years agoNFC: Delete the Linalg tutorial.
River Riddle [Thu, 17 Oct 2019 21:27:08 +0000 (14:27 -0700)]
NFC: Delete the Linalg tutorial.

This part of the tutorial is now covered by a new flow in Toy. This also removes a point of confusion as there is also a proper Linalg dialect.

PiperOrigin-RevId: 275338933

4 years agoAdd Ch.6 of the Toy tutorial.
River Riddle [Thu, 17 Oct 2019 21:21:44 +0000 (14:21 -0700)]
Add Ch.6 of the Toy tutorial.

This chapters introduces the notion of a full conversion, and adds support for lowering down to the LLVM dialect, LLVM IR, and thus code generation.

PiperOrigin-RevId: 275337786

4 years agoDecouple Linalg promotion from Linalg tiling - NFC
Nicolas Vasilache [Thu, 17 Oct 2019 20:40:48 +0000 (13:40 -0700)]
Decouple Linalg promotion from Linalg tiling - NFC

This CL creates a new Linalg promotion pass that operates on SubViewOp and decouples it from Linalg tiling. This is mostly moving code around.

PiperOrigin-RevId: 275329213

4 years ago[spirv] Add a canonicalization pattern for spv.selection.
Denis Khalikov [Thu, 17 Oct 2019 19:25:14 +0000 (12:25 -0700)]
[spirv] Add a canonicalization pattern for spv.selection.

Add a canonicalization pattern for spv.selection operation.
Convert spv.selection operation to spv.Select based on
simple pattern.

Closes tensorflow/mlir#183

COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/183 from denis0x0D:sandbox/canon_select 43d04d923272dd60b9da39f70bdbc51a5168db62
PiperOrigin-RevId: 275312748

4 years agoAllow '_' when pretty printing dialect symbols
Lei Zhang [Thu, 17 Oct 2019 19:23:47 +0000 (12:23 -0700)]
Allow '_' when pretty printing dialect symbols

'_' is used frequently enough as the separator of words in symbols.
We should allow it in dialect symbols when considering pretty printing.

Also updated LangRef.md regarding pretty form.

PiperOrigin-RevId: 275312494

4 years agoRename LoopNestBuilder to AffineLoopNestBuilder - NFC
Nicolas Vasilache [Thu, 17 Oct 2019 19:13:25 +0000 (12:13 -0700)]
Rename LoopNestBuilder to AffineLoopNestBuilder - NFC

PiperOrigin-RevId: 275310747

4 years agoUse a SmallVector instead of an ArrayRef to materialize a temporary local array
Mehdi Amini [Thu, 17 Oct 2019 16:58:58 +0000 (09:58 -0700)]
Use a SmallVector instead of an ArrayRef to materialize a temporary local array

This pattern is error prone and unfortunately none of the sanitizer is catching
it at the moment.

Fixes tensorflow/mlir#192

Closes tensorflow/mlir#193

COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/193 from joker-eph:fix_array_ref 8092252e64c426c6a8a790b7638f847bea4818b1
PiperOrigin-RevId: 275280201

4 years ago[DRR] Allow capturing and referencing no-result ops
Lei Zhang [Thu, 17 Oct 2019 16:01:56 +0000 (09:01 -0700)]
[DRR] Allow capturing and referencing no-result ops

Previously when we bind a symbol to an op in DRR, it means to capture
the op's result(s) and later references will be expanded to result(s).
This means for ops without result, we are replacing the symbol with
nothing. This CL treats non-result op capturing and referencing as a
special case to mean the op itself.

PiperOrigin-RevId: 275269702

4 years agoFix RewriterGen to support using NativeCodeCall as auxiliary pattern
Lei Zhang [Thu, 17 Oct 2019 15:39:13 +0000 (08:39 -0700)]
Fix RewriterGen to support using NativeCodeCall as auxiliary pattern

NativeCodeCall is handled differently than normal op creation in RewriterGen
(because its flexibility). It will only be materialized to output stream if
it is used. But when using it for auxiliary patterns, we still want the side
effect even if it is not replacing matched root op's results.

PiperOrigin-RevId: 275265467

4 years agoAdd LLVM_DEBUG in RewritersGen.cpp and Pattern.cpp
Lei Zhang [Thu, 17 Oct 2019 14:25:50 +0000 (07:25 -0700)]
Add LLVM_DEBUG in RewritersGen.cpp and Pattern.cpp

It's usually hard to understand what went wrong if mlir-tblgen
crashes on some input. This CL adds a few useful LLVM_DEBUG
statements so that we can use mlir-tblegn -debug to figure
out the culprit for a crash.

PiperOrigin-RevId: 275253532

4 years agoFix invalid transpose in example and add proper verification.
River Riddle [Thu, 17 Oct 2019 05:25:23 +0000 (22:25 -0700)]
Fix invalid transpose in example and add proper verification.

The transpose in the example had the same result type as its input, which is incorrect.

PiperOrigin-RevId: 275186568

4 years ago[spirv] Implement inliner interface
Lei Zhang [Thu, 17 Oct 2019 00:36:58 +0000 (17:36 -0700)]
[spirv] Implement inliner interface

We just need to implement a few interface hooks to DialectInlinerInterface
and CallOpInterface to gain the benefits of an inliner. :)

Right now only supports some trivial cases:
* Inlining single block with spv.Return/spv.ReturnValue
* Inlining multi block with spv.Return
* Inlining spv.selection/spv.loop without return ops

More advanced cases will require block argument and Phi support.

PiperOrigin-RevId: 275151132

4 years agoAdd Ch.5 of the toy tutorial.
River Riddle [Thu, 17 Oct 2019 00:33:34 +0000 (17:33 -0700)]
Add Ch.5 of the toy tutorial.

This chapter adds a partial lowering of toy operations, all but PrintOp, to a combination of the Affine and Std dialects. This chapter focuses on introducing the conversion framework, the benefits of partial lowering, and how easily dialects may co-exist in the IR.

PiperOrigin-RevId: 275150649

4 years agoAdd support for inlining toy call operations.
River Riddle [Thu, 17 Oct 2019 00:32:30 +0000 (17:32 -0700)]
Add support for inlining toy call operations.

The GenericCallOp needed to have the CallOpInterface to be picked up by the inliner. This also adds a CastOp to perform shape casts that are generated during inlining. The casts generated by the inliner will be folded away after shape inference.

PiperOrigin-RevId: 275150438