Christian Sigg [Fri, 20 Dec 2019 10:52:21 +0000 (02:52 -0800)]
Add gpu.shuffle op.
This will allow us to lower most of gpu.all_reduce (when all_reduce
doesn't exist in the target dialect) within the GPU dialect, and only do
target-specific lowering for the shuffle op.
PiperOrigin-RevId:
286548256
Frank Laub [Fri, 20 Dec 2019 06:15:31 +0000 (22:15 -0800)]
Allow dialect to create friendly names for region arguments
This is the block argument equivalent of the existing `getAsmResultNames` hook.
Closes tensorflow/mlir#329
COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/329 from plaidml:flaub-region-arg-names
fc7876f2d1335024e441083cd25263fd6247eb7d
PiperOrigin-RevId:
286523299
Jacques Pienaar [Fri, 20 Dec 2019 00:43:35 +0000 (16:43 -0800)]
Unique trait list during ODS Operator trait construction
Concatting lists in TableGen is easy, creating unique lists less so. There is no reason for duplicated op traits so we could throw an error instead but duplicates could occur due to concatting different list of traits in ODS (e.g., for convenience reasons), so just dedup them during Operator trait construction instead.
PiperOrigin-RevId:
286488423
Andy Davis [Fri, 20 Dec 2019 00:04:59 +0000 (16:04 -0800)]
[VectorOps] Update vector transfer_read/write ops to operatate on memrefs with vector element type.
Update vector transfer_read/write ops to operatate on memrefs with vector element type.
This handle cases where the memref vector element type represents the minimal memory transfer unit (or multiple of the minimal memory transfer unit).
PiperOrigin-RevId:
286482115
Nicolas Vasilache [Thu, 19 Dec 2019 21:16:59 +0000 (13:16 -0800)]
Restructure and update Linalg ODS and documentation - NFC
This CL allows specifying an additional name for specifying the .td file that is used to generate the doc for a dialect. This is necessary for a dialect like Linalg which has different "types" of ops that are used in different contexts.
This CL also restructures the Linalg documentation and renames LinalgLibraryOps -> LinalgStructuredOps but is otherwise NFC.
PiperOrigin-RevId:
286450414
Andy Davis [Thu, 19 Dec 2019 20:22:35 +0000 (12:22 -0800)]
[VectorOps] Add vector ReshapeOp to the VectorOps dialect.
Adds vector ReshapeOp to the VectorOps dialect. An aggregate vector reshape operation, which aggregates multiple hardware vectors, can enable optimizations during decomposition (e.g. loading one input hardware vector and performing multiple rotate and scatter store operations to the vector output).
PiperOrigin-RevId:
286440658
Alex Zinenko [Thu, 19 Dec 2019 20:16:19 +0000 (12:16 -0800)]
LLVMFuncOp: implement addEntryBlock
This function has been declared as a part of the LLVMFuncOp interface but never
implemented.
Closes tensorflow/mlir#325.
PiperOrigin-RevId:
286439619
Aart Bik [Thu, 19 Dec 2019 19:47:45 +0000 (11:47 -0800)]
[VectorOps] minor cleanup: vector dialect "subscripts" are i32
Introduces some centralized methods to move towards
consistent use of i32 as vector subscripts.
Note: sizes/strides/offsets attributes are still i64
PiperOrigin-RevId:
286434133
Alex Zinenko [Thu, 19 Dec 2019 19:34:43 +0000 (11:34 -0800)]
Detemplatize ModuleTranslation::lookupValues
This function template has been introduced in the early days of MLIR to work
around the absence of common type for ranges of values (operands, block
argumeents, vectors, etc). Core IR now provides ValueRange for exactly this
purpose. Use it instead of the template parameter.
PiperOrigin-RevId:
286431338
Nicolas Vasilache [Thu, 19 Dec 2019 01:32:00 +0000 (17:32 -0800)]
Add runtime utils support for print_memref_i8
This CL adds print_memref_i8 along with a unit test.
PiperOrigin-RevId:
286299237
Aart Bik [Wed, 18 Dec 2019 21:23:56 +0000 (13:23 -0800)]
[VectorOps] Replace iostream with stdio in support lib for vector.print
PiperOrigin-RevId:
286252829
Sean Silva [Wed, 18 Dec 2019 20:33:02 +0000 (12:33 -0800)]
Add a couple useful LLVM_DEBUG's to the inliner.
This makes it easier to narrow down on ops that are preventing inlining.
PiperOrigin-RevId:
286243868
River Riddle [Wed, 18 Dec 2019 19:43:58 +0000 (11:43 -0800)]
Move the specializations of VectorTransferRewriter::matchAndRewrite back into the anonymous namespace.
This appeases the GCC bug related to specializations in a different namespace.
PiperOrigin-RevId:
286234667
Marcel Koester [Wed, 18 Dec 2019 19:27:09 +0000 (11:27 -0800)]
Added LLVM ops and lowering phases from standard dialect for FAbs, FCeil, Cos, FNeg, CopySign.
Added test cases for the newly added LLVM operations and lowering features.
Closes tensorflow/mlir#300
COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/300 from dfki-jugr:std_to_llvm
da6168bbc1a369ae2e99ad3881fdddd82f075dd4
PiperOrigin-RevId:
286231169
Aart Bik [Wed, 18 Dec 2019 19:23:16 +0000 (11:23 -0800)]
[VectorOps] Add vector.print definition, with lowering support
Examples:
vector.print %f : f32
vector.print %x : vector<4xf32>
vector.print %y : vector<3x4xf32>
vector.print %z : vector<2x3x4xf32>
LLVM lowering replaces these with fully unrolled calls
into a small runtime support library that provides some
basic printing operations (single value, opening closing
bracket, comma, newline).
PiperOrigin-RevId:
286230325
River Riddle [Wed, 18 Dec 2019 19:04:19 +0000 (11:04 -0800)]
NFC: Remove forbidden include of <iostream>
See: https://llvm.org/docs/CodingStandards.html#include-iostream-is-forbidden
PiperOrigin-RevId:
286226467
River Riddle [Wed, 18 Dec 2019 19:02:35 +0000 (11:02 -0800)]
Add support for providing a default implementation for an interface method.
This enables providing a default implementation of an interface method. This method is defined on the Trait that is attached to the operation, and thus has all of the same constraints and properties as any other interface method. This allows for interface authors to provide a conservative default implementation for certain methods, without requiring that all users explicitly define it. The default implementation can be specified via the argument directly after the interface method body:
StaticInterfaceMethod<
/*desc=*/"Returns whether two array of types are compatible result types for an op.",
/*retTy=*/"bool",
/*methodName=*/"isCompatibleReturnTypes",
/*args=*/(ins "ArrayRef<Type>":$lhs, "ArrayRef<Type>":$rhs),
/*methodBody=*/[{
return ConcreteOp::isCompatibleReturnTypes(lhs, rhs);
}],
/*defaultImplementation=*/[{
/// Returns whether two arrays are equal as strongest check for
/// compatibility by default.
return lhs == rhs;
}]
PiperOrigin-RevId:
286226054
Jacques Pienaar [Wed, 18 Dec 2019 18:48:02 +0000 (10:48 -0800)]
Update code block designations
'```mlir' is used to indicate the code block is MLIR code/should use MLIR syntax
highlighting, while '{.mlir}' was a markdown extension that used a style file
to color the background differently of the code block. The background color
extension was a custom one that we can retire given we have syntax
highlighting.
Also change '```td' to '```tablegen' to match chroma syntax highlighting
designation.
PiperOrigin-RevId:
286222976
River Riddle [Wed, 18 Dec 2019 18:46:16 +0000 (10:46 -0800)]
NFC: Cleanup non-conforming usages of namespaces.
* Fixes use of anonymous namespace for static methods.
* Uses explicit qualifiers(mlir::) instead of wrapping the definition with the namespace.
PiperOrigin-RevId:
286222654
Uday Bondhugula [Wed, 18 Dec 2019 17:59:37 +0000 (09:59 -0800)]
Introduce prefetch op: affine -> std -> llvm intrinsic
Introduce affine.prefetch: op to prefetch using a multi-dimensional
subscript on a memref; similar to affine.load but has no effect on
semantics, but only on performance.
Provide lowering through std.prefetch, llvm.prefetch and map to llvm's
prefetch instrinsic. All attributes reflected through the lowering -
locality hint, rw, and instr/data cache.
affine.prefetch %0[%i, %j + 5], false, 3, true : memref<400x400xi32>
Signed-off-by: Uday Bondhugula <uday@polymagelabs.com>
Closes tensorflow/mlir#225
COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/225 from bondhugula:prefetch
4c3b4e93bc64d9a5719504e6d6e1657818a2ead0
PiperOrigin-RevId:
286212997
River Riddle [Wed, 18 Dec 2019 17:28:48 +0000 (09:28 -0800)]
NFC: Remove unnecessary 'llvm::' prefix from uses of llvm symbols declared in `mlir` namespace.
Aside from being cleaner, this also makes the codebase more consistent.
PiperOrigin-RevId:
286206974
Alex Zinenko [Wed, 18 Dec 2019 17:04:42 +0000 (09:04 -0800)]
Move function template definition to the header file. NFC
The definition of the function template LLVM::ModuleTranslation::lookupValues
has been located in a source file. As long as it has been the only file that
actually called into the function, this did not cause any problem. However, it
creates linking issues if the function is used from other translation units.
PiperOrigin-RevId:
286203078
Jacques Pienaar [Wed, 18 Dec 2019 16:58:37 +0000 (08:58 -0800)]
Fix line break in LangRef
This was munging up the example with the text.
PiperOrigin-RevId:
286201762
Alex Zinenko [Wed, 18 Dec 2019 11:38:18 +0000 (03:38 -0800)]
Harden the requirements to memory attribution types in gpu.func
When memory attributions are present in `gpu.func`, require that they are of
memref type and live in memoryspaces 3 and 5 for workgroup and private memory
attributions, respectively. Adapt the conversion from the GPU dialect to the
NVVM dialect to drop the private memory space from attributions as NVVM is able
to model them as local `llvm.alloca`s in the default memory space.
PiperOrigin-RevId:
286161763
MLIR Team [Wed, 18 Dec 2019 04:18:45 +0000 (20:18 -0800)]
Add support for float and string attributes to the C API and python bindings
PiperOrigin-RevId:
286115042
River Riddle [Wed, 18 Dec 2019 00:19:17 +0000 (16:19 -0800)]
NFC: Use this-> to appease GCC bug related to template lambda.
GCC is unable to properly implicitly capture 'this' in generic lambdas. This bug is not fixed until 7.1.0:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67274
PiperOrigin-RevId:
286083427
River Riddle [Tue, 17 Dec 2019 22:57:07 +0000 (14:57 -0800)]
NFC: Use TypeSwitch to simplify existing code.
PiperOrigin-RevId:
286066371
Andy Davis [Tue, 17 Dec 2019 21:10:07 +0000 (13:10 -0800)]
Add pattern rewrite which splits a vector TransferWriteOp into slices according to the unrolling/slicing scheme of its InsertSlicesOp operand.
PiperOrigin-RevId:
286042578
Mahesh Ravishankar [Tue, 17 Dec 2019 21:05:36 +0000 (13:05 -0800)]
Add missing virtual inliner interface method in SPIR-V dialect.
The inline interface uses two methods to check legality of inling:
1) Can a region be inlined into another.
2) Can an operation be inlined into another.
Setting the former to true, allows the inliner to use the second for
legality checks. Add this method to the SPIR-V dialect inlining
interface.
PiperOrigin-RevId:
286041734
Alex Zinenko [Tue, 17 Dec 2019 20:09:33 +0000 (12:09 -0800)]
Make it possible to override the lowering of MemRef to the LLVM dialect. NFC.
The lowering of MemRef types to the LLVM dialect is connected to the underlying
runtime representation of structured memory buffers. It has changed several
times in the past and reached the current state of a LLVM structured-typed
descriptor containing two pointers and all sizes. In several reported use
cases, a different, often simpler, lowering scheme is required. For example,
lowering statically-shaped memrefs to bare LLVM pointers to simplify aliasing
annotation. Split the pattern population functions into those include
memref-related operations and the remaining ones. Users are expected to extend
TypeConverter::convertType to handle the memref types differently.
PiperOrigin-RevId:
286030610
Alex Zinenko [Tue, 17 Dec 2019 19:48:15 +0000 (11:48 -0800)]
ConversionToLLVMDialect doc: update the syntax for LLVM types
The syntax for LLVM dialect types changed twice since this document was
introduced. First, the quoted types are only prefixed with the dialect name
`!llvm` rather than with `!llvm.type`. Second, for types that are simple enough
(e.g., MLIR identifiers), the pretty form can be used instead of the quoted
form. The relevant commits updated the dialect documentation, but not the
conversion documentation. Use the valid type names in the conversion
documentation.
PiperOrigin-RevId:
286026153
Alex Zinenko [Tue, 17 Dec 2019 19:38:53 +0000 (11:38 -0800)]
StdToLLVM conversion: drop getMemRefElementType utility function
This function has become redundant with MemRefDescriptor::getElementType and is
no longer necessary. Use the MemRefDescriptor pervasively to concentrate
descriptor-related logic in one place and drop the utility function.
PiperOrigin-RevId:
286024168
Alex Zinenko [Tue, 17 Dec 2019 19:32:19 +0000 (11:32 -0800)]
Homogenize the description of the MemRef conversion to the LLVM dialect
The conversion procedure has been updated to reflect the most recent MemRef
descriptor proposal, but the documentation was only updated for the type
conversion, omitting the address computation section. Make sure the two
sections agree.
PiperOrigin-RevId:
286022684
Andy Davis [Tue, 17 Dec 2019 19:21:12 +0000 (11:21 -0800)]
Add pattern rewrite to forward vector tuple elements to their users.
User(TupleGetOp(ExtractSlicesOp(InsertSlicesOp(TupleOp(Producer))) -> User(Producer)
PiperOrigin-RevId:
286020249
Jin Mingjian [Tue, 17 Dec 2019 18:25:19 +0000 (10:25 -0800)]
fix a typo in OpDefinitions doc
[{ matched with }], rather than ]}
Closes tensorflow/mlir#320
COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/320 from jinmingjian:patch-1
6b0870d02284f023bda2b28380960eb31d34f3b6
PiperOrigin-RevId:
286007638
River Riddle [Tue, 17 Dec 2019 18:07:26 +0000 (10:07 -0800)]
Add a new utility class TypeSwitch to ADT.
This class provides a simplified mechanism for defining a switch over a set of types using llvm casting functionality. More specifically, this allows for defining a switch over a value of type T where each case corresponds to a type(CaseT) that can be used with dyn_cast<CaseT>(...). An example is shown below:
// Traditional piece of code:
Operation *op = ...;
if (auto constant = dyn_cast<ConstantOp>(op))
...;
else if (auto return = dyn_cast<ReturnOp>(op))
...;
else
...;
// New piece of code:
Operation *op = ...;
TypeSwitch<Operation *>(op)
.Case<ConstantOp>([](ConstantOp constant) { ... })
.Case<ReturnOp>([](ReturnOp return) { ... })
.Default([](Operation *op) { ... });
Aside from the above, TypeSwitch supports return values, void return, multiple types per case, etc. The usability is intended to be very similar to StringSwitch.
(Using c++14 template lambdas makes everything even nicer)
More complex example of how this makes certain things easier:
LogicalResult process(Constant op);
LogicalResult process(ReturnOp op);
LogicalResult process(FuncOp op);
TypeSwitch<Operation *, LogicalResult>(op)
.Case<ConstantOp, ReturnOp, FuncOp>([](auto op) { return process(op); })
.Default([](Operation *op) { return op->emitError() << "could not be processed"; });
PiperOrigin-RevId:
286003613
MLIR Team [Tue, 17 Dec 2019 16:12:38 +0000 (08:12 -0800)]
Integrate from upstream at revision
e4fce659a759.
PiperOrigin-RevId:
285982330
Andy Davis [Tue, 17 Dec 2019 15:28:37 +0000 (07:28 -0800)]
Add pattern rewrite which splits a vector TransferReadOp into slices according to the unrolling/slicing scheme of its ExtractSlicesOp user.
PiperOrigin-RevId:
285975613
Tres Popp [Tue, 17 Dec 2019 15:05:06 +0000 (07:05 -0800)]
Replace code with equivalent satisfiesLLVMModule() function call.
This is a general code cleanup and should be a NFC.
PiperOrigin-RevId:
285972718
Andy Davis [Tue, 17 Dec 2019 14:26:31 +0000 (06:26 -0800)]
Update vector op unrolling transformation to generate ExtractSlicesOp and InsertSlicesOp (instead of less structured chain of StridedSliceOps and InsertStridedSliceOps).
PiperOrigin-RevId:
285968051
Mahesh Ravishankar [Mon, 16 Dec 2019 23:05:21 +0000 (15:05 -0800)]
Add atomic operations to SPIR-V dialect.
Some changes to the dialect generation script to allow specification
of different base class to derive from in ODS.
PiperOrigin-RevId:
285859230
Mahesh Ravishankar [Mon, 16 Dec 2019 22:21:44 +0000 (14:21 -0800)]
Fix (de)serialization generation for SPV_ScopeAttr, SPV_MemorySemanticsAttr.
Scope and Memory Semantics attributes need to be serialized as a
constant integer value and the <id> needs to be used to specify the
value. Fix the auto-generated SPIR-V (de)serialization to handle this.
PiperOrigin-RevId:
285849431
Lei Zhang [Mon, 16 Dec 2019 22:21:13 +0000 (14:21 -0800)]
[spirv] Re-enable nested loop (de)serialization test
PiperOrigin-RevId:
285849308
Nicolas Vasilache [Mon, 16 Dec 2019 21:32:02 +0000 (13:32 -0800)]
Add edsc::ops for pointwise, conv and dilated_conv
This CL adds more Linalg EDSC ops and tests to support building pointwise operations along with conv and dilated_conv.
This also fixes a bug in the existing linalg_matmul EDSC and beefs up the test.
The current set of ops is already enough to build an interesting, albeit simple, model used internally.
PiperOrigin-RevId:
285838012
Andy Davis [Mon, 16 Dec 2019 20:56:06 +0000 (12:56 -0800)]
Add InsertSlicesOp to the VectorOps dialect.
PiperOrigin-RevId:
285830394
Alex Zinenko [Mon, 16 Dec 2019 20:12:20 +0000 (12:12 -0800)]
Plug gpu.func into the GPU lowering pipelines
This updates the lowering pipelines from the GPU dialect to lower-level
dialects (NVVM, SPIRV) to use the recently introduced gpu.func operation
instead of a standard function annotated with an attribute. In particular, the
kernel outlining is updated to produce gpu.func instead of std.func and the
individual conversions are updated to consume gpu.funcs and disallow standard
funcs after legalization, if necessary. The attribute "gpu.kernel" is preserved
in the generic syntax, but can also be used with the custom syntax on
gpu.funcs. The special kind of function for GPU allows one to use additional
features such as memory attribution.
PiperOrigin-RevId:
285822272
River Riddle [Mon, 16 Dec 2019 20:09:14 +0000 (12:09 -0800)]
Insert signature-converted blocks into a region with a parent operation.
This keeps the IR valid and consistent as it is expected that each block should have a valid parent region/operation. Previously, converted blocks were kept floating without a valid parent region.
PiperOrigin-RevId:
285821687
Alex Zinenko [Mon, 16 Dec 2019 19:35:29 +0000 (11:35 -0800)]
Make "LowerToCFG" an operation pass
The conversion from the Loops dialect to the Standard dialect, also known as
loop-to-cfg lowering, has been historically a function pass. It can be required
on non-Standard function Ops, in particular the recently introduced GPU
functions. Make the conversion an operation pass instead of a function pass.
PiperOrigin-RevId:
285814560
Jose Ignacio Gomez [Mon, 16 Dec 2019 18:36:06 +0000 (10:36 -0800)]
[Linalg] Expose subview promotion as a declarative pattern
This PR targest issue tensorflow/mlir#295. It exposes the already existing
subiew promotion pass as a declarative pattern
Change-Id: If901ebef9fb53fcd0b12ecc536f6b174ce320b92
Closes tensorflow/mlir#315
COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/315 from tetuante:issue295
8e5f268b6d85f31015c33505329dbd7a4db97ac5
PiperOrigin-RevId:
285801463
Mehdi Amini [Mon, 16 Dec 2019 18:27:55 +0000 (10:27 -0800)]
Remove unused variable (fix warning) NFC
PiperOrigin-RevId:
285799680
Aart Bik [Mon, 16 Dec 2019 17:52:13 +0000 (09:52 -0800)]
[VectorOps] Add [insert/extract]element definition together with lowering to LLVM
Similar to insert/extract vector instructions but
(1) work on 1-D vectors only
(2) allow for a dynamic index
%c3 = constant 3 : index
%0 = vector.insertelement %arg0, %arg1[%c : index] : vector<4xf32>
%1 = vector.extractelement %arg0[%c3 : index] : vector<4xf32>
PiperOrigin-RevId:
285792205
Andy Davis [Mon, 16 Dec 2019 14:38:33 +0000 (06:38 -0800)]
Adds ExtractSlicesOp to the VectorOps dialect.
ExtractSlicesOp extracts slices of its vector operand and with a specified tiling scheme.
This operation centralizes the tiling scheme around a single op, which simplifies vector op unrolling and subsequent pattern rewrite transformations.
PiperOrigin-RevId:
285761129
Alex Zinenko [Mon, 16 Dec 2019 13:16:35 +0000 (05:16 -0800)]
Make memref promotion during std->LLVM lowering the default calling convention
During the conversion from the standard dialect to the LLVM dialect,
memref-typed arguments are promoted from registers to memory and passed into
functions by pointer. This had been introduced into the lowering to work around
the abesnce of calling convention modeling in MLIR to enable better
interoperability with LLVM IR generated from C, and has been exerciced for
several months. Make this promotion the default calling covention when
converting to the LLVM dialect. This adds the documentation, simplifies the
code and makes the conversion consistent across function operations and
function types used in other places, e.g. in high-order functions or
attributes, which would not follow the same rule previously.
PiperOrigin-RevId:
285751280
Tres Popp [Mon, 16 Dec 2019 09:35:03 +0000 (01:35 -0800)]
Remove LLVM dependency on mlir::Module and instead check Traits.
PiperOrigin-RevId:
285724678
Uday Bondhugula [Sat, 14 Dec 2019 19:21:52 +0000 (11:21 -0800)]
Splat op doc - fix misformat / update tablegen op desc. comment
- bring op description comment in sync with the doc
- fix misformat in doc
Signed-off-by: Uday Bondhugula <uday@polymagelabs.com>
Closes tensorflow/mlir#317
COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/317 from bondhugula:quickfix
7fcd945b318c973b2488b702874c87526855c8ef
PiperOrigin-RevId:
285574527
Smit Hinsu [Sat, 14 Dec 2019 19:18:01 +0000 (11:18 -0800)]
Add verifyCompatibleShape function overload with shapes
PiperOrigin-RevId:
285574334
Nicolas Vasilache [Sat, 14 Dec 2019 01:16:19 +0000 (17:16 -0800)]
Reconcile struct and class for NestedPatternMatchers - NFC
This removes a warning and fixes a potential ABI issue on Windows.
PiperOrigin-RevId:
285502010
Nicolas Vasilache [Sat, 14 Dec 2019 00:35:49 +0000 (16:35 -0800)]
Apply a level of sugaring to the linalg.generic EDSC - NFC
Make the declarative C++ builder API simpler to use so we can start chaining these ops together.
PiperOrigin-RevId:
285496266
River Riddle [Fri, 13 Dec 2019 22:52:39 +0000 (14:52 -0800)]
Refactor various canonicalization patterns as in-place folds.
This is more efficient, and allows for these to fire in more situations: e.g. createOrFold, DialectConversion, etc.
PiperOrigin-RevId:
285476837
Jing Pu [Fri, 13 Dec 2019 21:57:49 +0000 (13:57 -0800)]
Skip generating C++ for "DeclareOpInterfaceMethods" in op interface gen.
This is needed for calling the generator on a .td file that contains both OpInterface definitions and op definitions with DeclareOpInterfaceMethods<...> Traits.
PiperOrigin-RevId:
285465784
Nicolas Vasilache [Fri, 13 Dec 2019 21:26:00 +0000 (13:26 -0800)]
Add a layer of EDSC for linalg.GenericOp
This will be evolved into a simple programming model for custom ops and custom layers in followup CLs.
This CL also deletes the obsolete tablegen's reference-impl.td that was using EDSCs.
PiperOrigin-RevId:
285459545
River Riddle [Fri, 13 Dec 2019 20:21:42 +0000 (12:21 -0800)]
Try to fold operations in DialectConversion when trying to legalize.
This change allows for DialectConversion to attempt folding as a mechanism to legalize illegal operations. This also expands folding support in OpBuilder::createOrFold to generate new constants when folding, and also enables it to work in the context of a PatternRewriter.
PiperOrigin-RevId:
285448440
Prakalp Srivastava [Fri, 13 Dec 2019 19:28:13 +0000 (11:28 -0800)]
Add a type range for the XLA HLO dialect.
PiperOrigin-RevId:
285437835
Christian Sigg [Fri, 13 Dec 2019 07:06:06 +0000 (23:06 -0800)]
Fix maskAndClamp in gpu.all_reduce.
The clamp value determines the returned predicate. Previously, the clamp value was fixed to 31 and the predicate was therefore always true. This is incorrect for partial warp reductions, but went unnoticed because the returned values happened to be zero (but it could be anything).
PiperOrigin-RevId:
285343160
River Riddle [Thu, 12 Dec 2019 23:31:39 +0000 (15:31 -0800)]
NFC: Cleanup the various Op::print methods.
This cleans up the implementation of the various operation print methods. This is done via a combination of code cleanup, adding new streaming methods to the printer(e.g. operand ranges), etc.
PiperOrigin-RevId:
285285181
Jacques Pienaar [Thu, 12 Dec 2019 22:22:40 +0000 (14:22 -0800)]
Fix logic on when to emit collective type but separate arg builder
Got the comment right but the code wrong :/
PiperOrigin-RevId:
285270561
Aart Bik [Thu, 12 Dec 2019 22:11:27 +0000 (14:11 -0800)]
[VectorOps] Add lowering of vector.shuffle to LLVM IR
For example, a shuffle
%1 = vector.shuffle %arg0, %arg1 [0 : i32, 1 : i32] : vector<2xf32>, vector<2xf32>
becomes a direct LLVM shuffle
0 = llvm.shufflevector %arg0, %arg1 [0 : i32, 1 : i32] : !llvm<"<2 x float>">, !llvm<"<2 x float>">
but
%1 = vector.shuffle %a, %b[1 : i32, 0 : i32, 2: i32] : vector<1x4xf32>, vector<2x4xf32>
becomes the more elaborate (note the index permutation that drives
argument selection for the extract operations)
%0 = llvm.mlir.undef : !llvm<"[3 x <4 x float>]">
%1 = llvm.extractvalue %arg1[0] : !llvm<"[2 x <4 x float>]">
%2 = llvm.insertvalue %1, %0[0] : !llvm<"[3 x <4 x float>]">
%3 = llvm.extractvalue %arg0[0] : !llvm<"[1 x <4 x float>]">
%4 = llvm.insertvalue %3, %2[1] : !llvm<"[3 x <4 x float>]">
%5 = llvm.extractvalue %arg1[1] : !llvm<"[2 x <4 x float>]">
%6 = llvm.insertvalue %5, %4[2] : !llvm<"[3 x <4 x float>]">
PiperOrigin-RevId:
285268164
Jacques Pienaar [Thu, 12 Dec 2019 18:35:40 +0000 (10:35 -0800)]
Add type inference variant for separate params builder generated
Add variant that does invoke infer type op interface where defined. Also add entry function that invokes that different separate argument builders for wrapped, unwrapped and inference variant.
PiperOrigin-RevId:
285220709
Nicolas Vasilache [Thu, 12 Dec 2019 18:03:19 +0000 (10:03 -0800)]
Retire !linalg.buffer type - NFC
This type is not used anymore now that Linalg view and subview have graduated to std and that alignment is supported on alloc.
PiperOrigin-RevId:
285213424
Alexander Belyaev [Thu, 12 Dec 2019 17:56:12 +0000 (09:56 -0800)]
[Linalg] Add test for fusion of GenericOp with IndexedGenericOp.
PiperOrigin-RevId:
285211797
Ehsan Toosi [Thu, 12 Dec 2019 17:24:43 +0000 (09:24 -0800)]
Added lowering of `std.tanh` to llvm function call to `tanh` and `tanhf`.
Closes tensorflow/mlir#312
COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/312 from dfki-ehna:tanh
9e89b072ff91ff390ad739501745114feb3ac856
PiperOrigin-RevId:
285205674
Nicolas Vasilache [Thu, 12 Dec 2019 15:32:36 +0000 (07:32 -0800)]
Move cpu runner utils templates to .h
This allows reusing the implementation in various places by just including and permits more easily writing test functions without explicit template instantiations.
This also modifies UnrankedMemRefType to take a template type parameter since it cannot be type agnostic atm.
PiperOrigin-RevId:
285187711
Christian Sigg [Thu, 12 Dec 2019 11:48:00 +0000 (03:48 -0800)]
Automated rollback of commit
f68ac464d818629e0fe10c23b44ac782d64a12d2
PiperOrigin-RevId:
285162061
Christian Sigg [Thu, 12 Dec 2019 09:27:27 +0000 (01:27 -0800)]
Switch from shfl.bfly to shfl.down.
Both work for the current use case, but the latter allows implementing
prefix sums and is a little easier to understand for partial warps.
PiperOrigin-RevId:
285145287
River Riddle [Thu, 12 Dec 2019 00:26:08 +0000 (16:26 -0800)]
Make OpBuilder::insert virtual instead of OpBuilder::createOperation.
It is sometimes useful to create operations separately from the builder before insertion as it may be easier to erase them in isolation if necessary. One example use case for this is folding, as we will only want to insert newly generated constant operations on success. This has the added benefit of fixing some silent PatternRewriter failures related to cloning, as the OpBuilder 'clone' methods don't call createOperation.
PiperOrigin-RevId:
285086242
Nicolas Vasilache [Wed, 11 Dec 2019 23:25:00 +0000 (15:25 -0800)]
Add std.log* and llvm.intr.log* that correspond to the LLVMIR intrinsics
PiperOrigin-RevId:
285073483
Mahesh Ravishankar [Wed, 11 Dec 2019 20:35:43 +0000 (12:35 -0800)]
Add missing CMake dependency for MLIRTestIR.
PiperOrigin-RevId:
285039153
Nicolas Vasilache [Wed, 11 Dec 2019 20:22:04 +0000 (12:22 -0800)]
Fix OSS build
PiperOrigin-RevId:
285036782
Mahesh Ravishankar [Wed, 11 Dec 2019 20:21:13 +0000 (12:21 -0800)]
Expose a convenience function to add interface attributes to a function.
PiperOrigin-RevId:
285036647
Denis Khalikov [Wed, 11 Dec 2019 19:17:03 +0000 (11:17 -0800)]
[spirv] Add lowering for std.fdiv, std.frem, std.fsub
Closes tensorflow/mlir#313
COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/313 from denis0x0D:sandbox/lowering_std_farith
41715070a74d13bfa9401957478978c1bb8006c0
PiperOrigin-RevId:
285023586
Nicolas Vasilache [Wed, 11 Dec 2019 17:26:51 +0000 (09:26 -0800)]
Continue refactoring StructuredOps utilities
This CL adds more common information to StructuredOpsUtils.h
The n_view attribute is retired in favor of args_in + args_out but the CL is otherwise NFC.
PiperOrigin-RevId:
285000621
Christian Sigg [Wed, 11 Dec 2019 16:08:22 +0000 (08:08 -0800)]
NFC: Fix naming inconsistency: FuncOpLowering -> GPUFuncOpLowering.
Remove nested anonymous namespace.
PiperOrigin-RevId:
284987357
Alexander Belyaev [Wed, 11 Dec 2019 16:01:56 +0000 (08:01 -0800)]
Roll-forward initial liveness analysis including test cases.
Fix the usage of the map size when appending to the map with [].
PiperOrigin-RevId:
284985916
Alexander Belyaev [Wed, 11 Dec 2019 15:16:47 +0000 (07:16 -0800)]
Automated rollback of commit
98fbf41044d3364dbaf18db81b9e8d9520d14761
PiperOrigin-RevId:
284979684
Stephan Herhut [Wed, 11 Dec 2019 15:13:54 +0000 (07:13 -0800)]
Add a function to get lowering patterns from GPU to NVVM.
This enables combining the patterns with other patterns into larger lowerings.
PiperOrigin-RevId:
284979271
Alexander Belyaev [Wed, 11 Dec 2019 10:56:06 +0000 (02:56 -0800)]
[Linalg] Add tiling for IndexedGenericOp with a region.
PiperOrigin-RevId:
284949355
Marcel Koester [Wed, 11 Dec 2019 09:02:39 +0000 (01:02 -0800)]
Add initial liveness analysis including test cases.
Closes tensorflow/mlir#255
PiperOrigin-RevId:
284935454
Aart Bik [Wed, 11 Dec 2019 01:12:11 +0000 (17:12 -0800)]
[VectorOps] Add lowering of vector.insert to LLVM IR
For example, an insert
%0 = vector.insert %arg0, %arg1[3 : i32] : f32 into vector<4xf32>
becomes
%0 = llvm.mlir.constant(3 : i32) : !llvm.i32
%1 = llvm.insertelement %arg0, %arg1[%0 : !llvm.i32] : !llvm<"<4 x float>">
A more elaborate example, inserting an element in a higher dimension
vector
%0 = vector.insert %arg0, %arg1[3 : i32, 7 : i32, 15 : i32] : f32 into vector<4x8x16xf32>
becomes
%0 = llvm.extractvalue %arg1[3 : i32, 7 : i32] : !llvm<"[4 x [8 x <16 x float>]]">
%1 = llvm.mlir.constant(15 : i32) : !llvm.i32
%2 = llvm.insertelement %arg0, %0[%1 : !llvm.i32] : !llvm<"<16 x float>">
%3 = llvm.insertvalue %2, %arg1[3 : i32, 7 : i32] : !llvm<"[4 x [8 x <16 x float>]]">
PiperOrigin-RevId:
284882443
Andy Davis [Wed, 11 Dec 2019 01:02:17 +0000 (17:02 -0800)]
Add VectorOp transform pattern which splits vector TransferReadOps to target vector unroll size.
PiperOrigin-RevId:
284880592
Uday Bondhugula [Tue, 10 Dec 2019 23:49:07 +0000 (15:49 -0800)]
More affine expr simplifications for floordiv and mod
Add one more simplification for floordiv and mod affine expressions.
Examples:
(2*d0 + 1) floordiv 2 is simplified to d0
(8*d0 + 4*d1 + d2) floordiv 4 simplified to 4*d0 + d1 + d2 floordiv 4.
etc.
Similarly, (4*d1 + 1) mod 2 is simplified to 1,
(2*d0 + 8*d1) mod 8 simplified to 2*d0 mod 8.
Change getLargestKnownDivisor to return int64_t to be consistent and
to avoid casting at call sites (since the return value is used in expressions
of int64_t/index type).
Signed-off-by: Uday Bondhugula <uday@polymagelabs.com>
Closes tensorflow/mlir#202
COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/202 from bondhugula:affine
b13fcb2f1c00a39ca5434613a02408e085a80e77
PiperOrigin-RevId:
284866710
Alex Zinenko [Tue, 10 Dec 2019 21:54:50 +0000 (13:54 -0800)]
Move gpu.launch_func to ODS. NFC
Move the definition of gpu.launch_func operation from hand-rolled C++
implementation to the ODS framework. Also move the documentation. This only
performs the move and remains a non-functional change, a follow-up will clean
up the custom functions that can be auto-generated using ODS.
PiperOrigin-RevId:
284842252
Nicolas Vasilache [Tue, 10 Dec 2019 21:25:41 +0000 (13:25 -0800)]
Fold TestLinalgTilePermutePatterns into TestLinalgTransformPatterns - NFC
Centralize all patterns that test Linalg transforms in a single pass.
PiperOrigin-RevId:
284835938
River Riddle [Tue, 10 Dec 2019 21:20:50 +0000 (13:20 -0800)]
Refactor the various operand/result/type iterators to use indexed_accessor_range.
This has several benefits:
* The implementation is much cleaner and more efficient.
* The ranges now have support for many useful operations: operator[], slice, drop_front, size, etc.
* Value ranges can now directly query a range for their types via 'getTypes()': e.g:
void foo(Operation::operand_range operands) {
auto operandTypes = operands.getTypes();
}
PiperOrigin-RevId:
284834912
Jose Ignacio Gomez [Tue, 10 Dec 2019 20:25:10 +0000 (12:25 -0800)]
[Linalg] Add a Linalg iterator permutation transformation
This patch closes issue tensorflow/mlir#272
We add a standalone iterator permutation transformation to Linalg.
This transformation composes a permutation map with the maps in the
"indexing_maps" attribute. It also permutes "iterator_types"
accordingly.
Change-Id: I7c1e693b8203aeecc595a7c012e738ca1100c857
Closes tensorflow/mlir#307
COPYBARA_INTEGRATE_REVIEW=https://github.com/tensorflow/mlir/pull/307 from tetuante:issue272
f7908d58792f4111119721885e247045104f1131
PiperOrigin-RevId:
284824102
Nicolas Vasilache [Tue, 10 Dec 2019 19:54:00 +0000 (11:54 -0800)]
Uniformize Vector transforms as patterns on the model of Linalg - NFC
This reorganizes the vector transformations to be more easily testable as patterns and more easily composable into fused passes in the future.
PiperOrigin-RevId:
284817474
MLIR Team [Tue, 10 Dec 2019 19:18:57 +0000 (11:18 -0800)]
Add Py API for composing an affine expression with a map. Also allows extracting constant values for const expressions.
PiperOrigin-RevId:
284809623
Mahesh Ravishankar [Tue, 10 Dec 2019 18:11:19 +0000 (10:11 -0800)]
More convenience build methods for SPIR-V ops.
Add some convenience build methods to SPIR-V ops and update the
lowering to use these methods where possible.
For SPIRV::CompositeExtractOp move the method to deduce type of
element based on base and indices into a convenience function. Some
additional functionality needed to handle differences between parsing
and verification methods.
PiperOrigin-RevId:
284794404
Mehdi Amini [Tue, 10 Dec 2019 15:01:17 +0000 (07:01 -0800)]
Add a doc on guidelines for contributing a new dialect to the MLIR core repo
Closes tensorflow/mlir#263
PiperOrigin-RevId:
284760931
Alex Zinenko [Tue, 10 Dec 2019 11:00:29 +0000 (03:00 -0800)]
Drop Markdown style annotations
These come from a non-standard extenion that is not available on Github, so it
only clutters the documentation source with {.mlir} or {.ebnf} tags.
PiperOrigin-RevId:
284733003
Jacques Pienaar [Tue, 10 Dec 2019 02:18:38 +0000 (18:18 -0800)]
Fix build breakage on gcc-5
Avoid `error: could not convert ?(const char*)"reduction"? from ?const char*? to ?llvm::StringLiteral?`. Tested with gcc-5.5.
PiperOrigin-RevId:
284677810