platform/upstream/llvm.git
5 years agoPython bindings: expose various Ops through declarative builders
Alex Zinenko [Thu, 14 Mar 2019 12:04:38 +0000 (05:04 -0700)]
Python bindings: expose various Ops through declarative builders

In particular, expose `cond_br`, `select` and `call` operations with syntax
similar to that of the previous emitter-based EDSC interface.  These are
provided for backwards-compatibility.  Ideally, we want them to be
Table-generated from the Op definitions when those definitions are declarative.

Additionally, expose the ability to construct any op given its canonical name,
which also exercises the construction of unregistered ops.

PiperOrigin-RevId: 238421583

5 years agoPython bindings: expose IndexedValue
Alex Zinenko [Thu, 14 Mar 2019 12:04:20 +0000 (05:04 -0700)]
Python bindings: expose IndexedValue

Expose edsc::IndexedValue using a syntax smilar to that of edsc::Indexed to
ensure backwards-compatibility.  It remains possible to write array-indexed
loads and stores as

    C.store([i, j], A.load([i, k]) * B.load([k, j]))

after taking a "view" of some value handle using IndexedValue as

    A = IndexedValue(originalValueHandle)

provided that all indices are also value handles.

PiperOrigin-RevId: 238421544

5 years agoPython bindings: use MLIR operations to define constant values
Alex Zinenko [Thu, 14 Mar 2019 12:04:03 +0000 (05:04 -0700)]
Python bindings: use MLIR operations to define constant values

In the original implementation, constants could be bound to EDSC expressions in
the binder, independently from other MLIR Values.  A rework of EDSC including
early typing provided the functionality to use MLIR's `constant` operation to
define typed constants instead of binding them separately, but only used it for
index types.  The new declarative builder implementation followed by providing
a call for building `constant` operations of index types but nothing more.
Expose similar builders for integers, floats and functions to match the what
binders allow one to use.

PiperOrigin-RevId: 238421508

5 years agoPython bindings: make FunctionContext behave more like BlockContext
Alex Zinenko [Thu, 14 Mar 2019 12:02:21 +0000 (05:02 -0700)]
Python bindings: make FunctionContext behave more like BlockContext

Provide a function `arg` that returns the function argument as a value handle,
similar to block arguments.  This makes function context managers in Python
similar to block context managers, which is more consistent given that the
function context manager sets the insertion point to the first block of the
function and that arguments of that block are those of the function.  This
prepares the removal of PythonMLIREmitter class and its bind_function_arguments
helper.

Additionally, provide a helper method in PythonMLIRModule to define a function
and immediately create a context for it.  Update the tests that are already
using context managers to use the function context manager instead of creating
the function manually.

PiperOrigin-RevId: 238421087

5 years agoChange parallelism detection test pass to emit a note
Uday Bondhugula [Tue, 12 Mar 2019 23:31:22 +0000 (16:31 -0700)]
Change parallelism detection test pass to emit a note

- emit a note on the loop being parallel instead of setting a loop attribute
- rename the pass -test-detect-parallel (from -detect-parallel)

PiperOrigin-RevId: 238122847

5 years agoChange getMemoryFootprintBytes emitError to a warning
Uday Bondhugula [Tue, 12 Mar 2019 23:09:11 +0000 (16:09 -0700)]
Change getMemoryFootprintBytes emitError to a warning

- this is really not a hard error; emit a warning instead (for inability to compute
  footprint due to the union failing due to unimplemented cases)
- remove a misleading warning from LoopFusion.cpp

PiperOrigin-RevId: 238118711

5 years ago[TableGen] Support nested dag attributes arguments in the result pattern
Feng Liu [Tue, 12 Mar 2019 20:55:50 +0000 (13:55 -0700)]
[TableGen] Support nested dag attributes arguments in the result pattern

Add support to create a new attribute from multiple attributes. It extended the
DagNode class to represent attribute creation dag. It also changed the
RewriterGen::emitOpCreate method to support this nested dag emit.

An unit test is added.

PiperOrigin-RevId: 238090229

5 years agoRefactor pass timing so that it is toggled on the passmanager via 'enableTiming'...
River Riddle [Tue, 12 Mar 2019 20:08:48 +0000 (13:08 -0700)]
Refactor pass timing so that it is toggled on the passmanager via 'enableTiming'. This also makes the pipeline view the default display mode.

PiperOrigin-RevId: 238079916

5 years agoFix misc bugs / TODOs / other improvements to analysis utils
Uday Bondhugula [Tue, 12 Mar 2019 17:52:09 +0000 (10:52 -0700)]
Fix misc bugs / TODOs / other improvements to analysis utils

- fix for getConstantBoundOnDimSize: floordiv -> ceildiv for extent
- make getConstantBoundOnDimSize also return the identifier upper bound
- fix unionBoundingBox to correctly use the divisor and upper bound identified by
  getConstantBoundOnDimSize
- deal with loop step correctly in addAffineForOpDomain (covers most cases now)
- fully compose bound map / operands and simplify/canonicalize before adding
  dim/symbol to FlatAffineConstraints; fixes false positives in -memref-bound-check; add
  test case there
- expose mlir::isTopLevelSymbol from AffineOps

PiperOrigin-RevId: 238050395

5 years agoGive the TypeUniquer its own BumpPtrAllocator and a SmartRWMutex to make it thread...
River Riddle [Tue, 12 Mar 2019 17:00:21 +0000 (10:00 -0700)]
Give the TypeUniquer its own BumpPtrAllocator and a SmartRWMutex to make it thread-safe. This is step 1/N to making the MLIRContext thread-safe.

PiperOrigin-RevId: 238037814

5 years agoNFC: Remove a stray print in mlir::buildTripCountMapAndOperands.
River Riddle [Tue, 12 Mar 2019 16:40:04 +0000 (09:40 -0700)]
NFC: Remove a stray print in mlir::buildTripCountMapAndOperands.

PiperOrigin-RevId: 238033349

5 years ago[TableGen] Sort OpBase.td attribute kinds and refine some comments
Lei Zhang [Tue, 12 Mar 2019 16:29:12 +0000 (09:29 -0700)]
[TableGen] Sort OpBase.td attribute kinds and refine some comments

This CL sorts attribute kinds in OpBase.td according to a logical order: simple
cases ahead of complicated ones. The logic of attribute kinds involved are
completely untouched.

Comments on AttrConstraint and Attr are revised slightly.

PiperOrigin-RevId: 238031275

5 years ago[TableGen] Add common I<n>Tensor, F<n>Tensor, and I64Attr definitions
Lei Zhang [Tue, 12 Mar 2019 16:25:44 +0000 (09:25 -0700)]
[TableGen] Add common I<n>Tensor, F<n>Tensor, and I64Attr definitions

This CL also changes IntegerAttrBase to use APInt as return value to defer bitwidth
handling to API call sites and be consistent with FloatAttrBase. Call sites are
adjusted accordingly.

PiperOrigin-RevId: 238030614

5 years agoExtend loop unrolling and unroll-jamming to non-matching bound operands and
Uday Bondhugula [Tue, 12 Mar 2019 15:00:52 +0000 (08:00 -0700)]
Extend loop unrolling and unroll-jamming to non-matching bound operands and
multi-result upper bounds, complete TODOs, fix/improve test cases.

- complete TODOs for loop unroll/unroll-and-jam. Something as simple as
  "for %i = 0 to %N" wasn't being unrolled earlier (unless it had been written
  as "for %i = ()[s0] -> (0)()[%N] to %N"; addressed now.

- update/replace getTripCountExpr with buildTripCountMapAndOperands; makes it
  more powerful as it composes inputs into it

- getCleanupLowerBound and getUnrolledLoopUpperBound actually needed the same
  code; refactor and remove one.

- reorganize test cases, write previous ones better; most of these changes are
  "label replacements".

- fix wrongly labeled test cases in unroll-jam.mlir

PiperOrigin-RevId: 238014653

5 years agoPython bindings: provide context managers for the Blocks
Alex Zinenko [Tue, 12 Mar 2019 13:55:03 +0000 (06:55 -0700)]
Python bindings: provide context managers for the Blocks

Expose EDSC block builders as Python context managers, similarly to loop
builders.  Note that blocks, unlike loops, are addressable and may need to be
"declared" without necessarily filling their bodies with instructions.  This is
the case, for example, when branching to a new block from the existing block.
Therefore, creating the block context manager immediately creates the block
(unless the manager captures an existing block) by creating and destroying the
block builder.  With this approach, one can either fill in the block and refer
to it later leveraging Python's dynamic variable lookup

    with BlockContext([indexType]) as b:
      op(...)  # operation inside the block
      ret()
    op(...)  # operation outside the block (in the function entry block)
    br(b, [...])    # branching to the block created above

or declare the block contexts upfront and enter them on demand

    bb1 = BlockContext()  # empty block created in the surrounding function
    bb2 = BlockContext()  # context
    cond_br(bb1.handle, [], bb2.handle, [])  # branch to blocks from here
    with bb1:
      op(...)  # operation inside the first block
    with bb2:
      op(...)  # operation inside the second block
    with bb1:
      op(...)  # append operation to the first block

Additionally, one can create multiple throw-away contexts that append to the
same block

    with BlockContext() as b:
      op(...)  # operation inside the block
    with BlockContext(appendTo(b)):
      op(...)  # new context appends to the block

which has a potential of being extended to control the insertion point of the
block at a finer level of granularity.

PiperOrigin-RevId: 238005298

5 years agoPython bindings: drop third_party/ in includes
Alex Zinenko [Tue, 12 Mar 2019 13:03:26 +0000 (06:03 -0700)]
Python bindings: drop third_party/ in includes

Historically, Python bindings were using full path including third_party for
most headers but not all of them.  This is inconsistent with the rest of MLIR.
Drop the prefix path in #include directives.

PiperOrigin-RevId: 237999346

5 years agoClean up some stray mlfunc/cfgfunc leftovers.
MLIR Team [Tue, 12 Mar 2019 02:47:41 +0000 (19:47 -0700)]
Clean up some stray mlfunc/cfgfunc leftovers.

PiperOrigin-RevId: 237936610

5 years agoAdd documentation for the pass instrumentation framework to the WritingAPass document.
River Riddle [Tue, 12 Mar 2019 00:26:45 +0000 (17:26 -0700)]
Add documentation for the pass instrumentation framework to the WritingAPass document.

PiperOrigin-RevId: 237919897

5 years agoNFC: Remove old comment referencing CFG/EXT/ML functions.
River Riddle [Mon, 11 Mar 2019 22:56:34 +0000 (15:56 -0700)]
NFC: Remove old comment referencing CFG/EXT/ML functions.

PiperOrigin-RevId: 237902039

5 years agoMinor changes to the EDSC API NFC
Nicolas Vasilache [Mon, 11 Mar 2019 19:48:16 +0000 (12:48 -0700)]
Minor changes to the EDSC API NFC

This CL makes some minor changes to the declarative builder Helpers:
1. adds lb, ub, step methods to MemRefView to avoid always having to go through std::get + range;
2. drops MemRefView& from IndexedValue which was just creating ownership concerns. Instead, an IndexedValue only needs to keep track of the ValueHandle from which a MemRefView can be constructed on-demand if necessary.

PiperOrigin-RevId: 237861493

5 years agoAllow input and output to have different element types for broadcastable ops
Lei Zhang [Mon, 11 Mar 2019 18:36:20 +0000 (11:36 -0700)]
Allow input and output to have different element types for broadcastable ops

TensorFlow comparison ops like tf.Less supports broadcast behavior but the result
type have different element types as the input types. Extend broadcastable trait
to allow such cases. Added tf.Less to demonstrate it.

PiperOrigin-RevId: 237846127

5 years agoPull shape broadcast out as a stand-alone utility function
Lei Zhang [Mon, 11 Mar 2019 18:36:04 +0000 (11:36 -0700)]
Pull shape broadcast out as a stand-alone utility function

So that we can use this function to deduce broadcasted shapes elsewhere.

Also added support for unknown dimensions, by following TensorFlow behavior.

PiperOrigin-RevId: 237846065

5 years agoEnsure that pass timing is the last added pass instrumentation. This also updates...
River Riddle [Mon, 11 Mar 2019 18:13:54 +0000 (11:13 -0700)]
Ensure that pass timing is the last added pass instrumentation. This also updates the PassInstrumentor to iterate in reverse for the "after" hooks. This ensures that the instrumentations run in a stack like fashion.

PiperOrigin-RevId: 237840808

5 years agoTidy up some of the pass infrastructure g3doc.
River Riddle [Mon, 11 Mar 2019 18:11:43 +0000 (11:11 -0700)]
Tidy up some of the pass infrastructure g3doc.

* Separate MyAnalysis into MyFunctionAnalysis/MyModuleAnalysis to avoid potential confusion.
* Add an example of an inline lambda builder for PassPipelineRegistration.
* Clarify the wording on a few of the pass restrictions.

PiperOrigin-RevId: 237840325

5 years agoAdd a new instrumentation for timing pass and analysis execution. This is made availa...
River Riddle [Mon, 11 Mar 2019 17:09:07 +0000 (10:09 -0700)]
Add a new instrumentation for timing pass and analysis execution. This is made available in mlir-opt via the 'pass-timing' and 'pass-timing-display' flags. The 'pass-timing-display' flag toggles between the different available display modes for the timing results. The current display modes are 'list' and 'pipeline', with 'list' representing the default.

Below shows the output for an example mlir-opt command line.

mlir-opt foo.mlir -verify-each=false -cse -canonicalize -cse -cse -pass-timing

list view (-pass-timing-display=list):
* In this mode the results are displayed in a list sorted by total time; with each pass/analysis instance aggregated into one unique result. This mode is similar to the output of 'time-passes' in llvm-opt.

===-------------------------------------------------------------------------===
                      ... Pass execution timing report ...
===-------------------------------------------------------------------------===
  Total Execution Time: 0.0097 seconds (0.0096 wall clock)

   ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Name ---
   0.0051 ( 58.3%)   0.0001 ( 12.2%)   0.0052 ( 53.8%)   0.0052 ( 53.8%)  Canonicalizer
   0.0025 ( 29.1%)   0.0005 ( 58.2%)   0.0031 ( 31.9%)   0.0031 ( 32.0%)  CSE
   0.0011 ( 12.6%)   0.0003 ( 29.7%)   0.0014 ( 14.3%)   0.0014 ( 14.2%)  DominanceInfo
   0.0087 (100.0%)   0.0009 (100.0%)   0.0097 (100.0%)   0.0096 (100.0%)  Total

pipeline view (-pass-timing-display=pipeline):
* In this mode the results are displayed in a nested pipeline view that mirrors the internal pass pipeline that is being executed in the pass manager. This view is useful for understanding specifically which parts of the pipeline are taking the most time, and can also be used to identify when analyses are being invalidated and recomputed.

===-------------------------------------------------------------------------===
                      ... Pass execution timing report ...
===-------------------------------------------------------------------------===
  Total Execution Time: 0.0082 seconds (0.0081 wall clock)

   ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Name ---
   0.0042 (100.0%)   0.0039 (100.0%)   0.0082 (100.0%)   0.0081 (100.0%)  Function Pipeline
   0.0005 ( 11.6%)   0.0008 ( 21.1%)   0.0013 ( 16.1%)   0.0013 ( 16.2%)    CSE
   0.0002 (  5.0%)   0.0004 (  9.3%)   0.0006 (  7.0%)   0.0006 (  7.0%)      (A) DominanceInfo
   0.0026 ( 61.8%)   0.0018 ( 45.6%)   0.0044 ( 54.0%)   0.0044 ( 54.1%)    Canonicalizer
   0.0005 ( 11.7%)   0.0005 ( 13.0%)   0.0010 ( 12.3%)   0.0010 ( 12.4%)    CSE
   0.0003 (  6.1%)   0.0003 (  8.3%)   0.0006 (  7.2%)   0.0006 (  7.1%)      (A) DominanceInfo
   0.0002 (  3.8%)   0.0001 (  2.8%)   0.0003 (  3.3%)   0.0003 (  3.3%)    CSE
   0.0042 (100.0%)   0.0039 (100.0%)   0.0082 (100.0%)   0.0081 (100.0%)  Total

PiperOrigin-RevId: 237825367

5 years agoMove `createConvertToLLVMIRPass()` to its own header matching the target library...
Mehdi Amini [Mon, 11 Mar 2019 01:43:55 +0000 (18:43 -0700)]
Move `createConvertToLLVMIRPass()` to its own header matching the target library clients need to link

PiperOrigin-RevId: 237723197

5 years agoUpdate the constantFold/fold API to use LogicalResult instead of bool.
River Riddle [Mon, 11 Mar 2019 00:44:25 +0000 (17:44 -0700)]
Update the constantFold/fold API to use LogicalResult instead of bool.

PiperOrigin-RevId: 237719658

5 years agoNFC: Move the PassExecutor and PassAdaptor classes into PassDetail.h so that they...
River Riddle [Sun, 10 Mar 2019 22:44:47 +0000 (15:44 -0700)]
NFC: Move the PassExecutor and PassAdaptor classes into PassDetail.h so that they can be referenced throughout lib/Pass.

PiperOrigin-RevId: 237712736

5 years agoMove the success/failure functions out of LogicalResult and into the mlir namespace.
River Riddle [Sun, 10 Mar 2019 22:32:54 +0000 (15:32 -0700)]
Move the success/failure functions out of LogicalResult and into the mlir namespace.

PiperOrigin-RevId: 237712180

5 years agoAdd basic infrastructure for instrumenting pass execution and analysis computation...
River Riddle [Sun, 10 Mar 2019 21:45:47 +0000 (14:45 -0700)]
Add basic infrastructure for instrumenting pass execution and analysis computation. A virtual class, PassInstrumentation, is provided to allow for different parts of the pass manager infrastructure. The currently available hooks allow for instrumenting:
* before/after pass execution
* after a pass fails
* before/after an analysis is computed

After getting this infrastructure in place, we can start providing common developer utilities like pass timing, IR printing after pass execution, etc.

PiperOrigin-RevId: 237709692

5 years ago[EDSC] Cleanup declarative builder insertion point with blocks
Nicolas Vasilache [Sat, 9 Mar 2019 19:27:59 +0000 (11:27 -0800)]
[EDSC] Cleanup declarative builder insertion point with blocks

Declarative builders want to provide the same nesting interface for blocks and loops. MLIR on the other hand has different behaviors:
1. when an AffineForOp is created the insertion point does not enter the loop body;
2. when a Block is created, the insertion point does enter the block body.

Guard against the second behavior in EDSC to make the interface unsurprising.
This also surfaces two places in the eager branch API where I was guarding against this behavior indirectly by creating a new ScopedContext.

Instead, uniformize everything to properly reset the insertion point in the unique place that builds the mlir::Block*.

PiperOrigin-RevId: 237619513

5 years agoDelete dead function.
Jacques Pienaar [Sat, 9 Mar 2019 13:03:59 +0000 (05:03 -0800)]
Delete dead function.

Can reintroduce when needed.

PiperOrigin-RevId: 237599264

5 years agoFollow up on custom instruction support.
Nicolas Vasilache [Sat, 9 Mar 2019 01:27:49 +0000 (17:27 -0800)]
Follow up on custom instruction support.

This CL addresses a few post-submit comments:
1. better comments,
2. check number of results before dyn_cast (which is a less common case)
3. test usage for multi-result InstructionHandle

PiperOrigin-RevId: 237549333

5 years agoAdd support for custom ops in declarative builders.
Nicolas Vasilache [Sat, 9 Mar 2019 00:41:25 +0000 (16:41 -0800)]
Add support for custom ops in declarative builders.

This CL adds support for named custom instructions in declarative builders.
To allow this, it introduces a templated `CustomInstruction` class.
This CL also splits ValueHandle which can capture only the **value** in single-valued instructions from InstructionHandle which can capture any instruction but provide no typing and sugaring to extract the potential Value*.

PiperOrigin-RevId: 237543222

5 years agoRename Status to LogicalResult to avoid conflictions with the Status in xla/tensorflo...
River Riddle [Sat, 9 Mar 2019 00:04:42 +0000 (16:04 -0800)]
Rename Status to LogicalResult to avoid conflictions with the Status in xla/tensorflow/etc.

PiperOrigin-RevId: 237537341

5 years agoDon't run verifyOperation in verifyDominance, as it is already run as part of verifyB...
River Riddle [Fri, 8 Mar 2019 22:26:23 +0000 (14:26 -0800)]
Don't run verifyOperation in verifyDominance, as it is already run as part of verifyBlock. This caused the verifier to run in exponential time for nested regions.

PiperOrigin-RevId: 237519751

5 years ago[TF] Define tf.FusedBatchNormOp in TableGen
Lei Zhang [Fri, 8 Mar 2019 21:57:27 +0000 (13:57 -0800)]
[TF] Define tf.FusedBatchNormOp in TableGen

Also fixed wrong epsilon attribute types for tf.FusedBatchNormOp in test cases.

PiperOrigin-RevId: 237514017

5 years ago[TableGen] Change to attach the name to DAG operator in result patterns
Lei Zhang [Fri, 8 Mar 2019 21:57:09 +0000 (13:57 -0800)]
[TableGen] Change to attach the name to DAG operator in result patterns

There are two ways that we can attach a name to a DAG node:

1) (Op:$name ...)
2) (Op ...):$name

The problem with 2) is that we cannot do it on the outmost DAG node in a tree.
Switch from 2) to 1).

PiperOrigin-RevId: 237513962

5 years ago[TableGen] Support multiple result patterns
Lei Zhang [Fri, 8 Mar 2019 21:56:53 +0000 (13:56 -0800)]
[TableGen] Support multiple result patterns

This CL added the ability to generate multiple ops using multiple result
patterns, with each of them replacing one result of the matched source op.

Specifically, the syntax is

```
def : Pattern<(SourceOp ...),
              [(ResultOp1 ...), (ResultOp2 ...), (ResultOp3 ...)]>;
```

Assuming `SourceOp` has three results.

Currently we require that each result op must generate one result, which
can be lifted later when use cases arise.

To help with cases that certain output is unused and we don't care about it,
this CL also introduces a new directive: `verifyUnusedValue`. Checks will
be emitted in the `match()` method to make sure if the corresponding output
is not unused, `match()` returns with `matchFailure()`.

PiperOrigin-RevId: 237513904

5 years agoRefactor and share common code across addAffineForOpDomain / addSliceBounds
Uday Bondhugula [Fri, 8 Mar 2019 21:29:00 +0000 (13:29 -0800)]
Refactor and share common code across addAffineForOpDomain / addSliceBounds

PiperOrigin-RevId: 237508755

5 years ago[TF] Improve verification for integer and floating-point tensor types
Lei Zhang [Fri, 8 Mar 2019 19:12:32 +0000 (11:12 -0800)]
[TF] Improve verification for integer and floating-point tensor types

TensorFlow does not allow integers of random bitwidths. It only accepts 8-,
16-, 32-, and 64-bit integer types. Similarly for floating point types, only
half, single, double, and bfloat16 types.

PiperOrigin-RevId: 237483913

5 years agoIntroduce a TypeID class to provide unique identifiers for derived type classes....
River Riddle [Fri, 8 Mar 2019 19:07:51 +0000 (11:07 -0800)]
Introduce a TypeID class to provide unique identifiers for derived type classes. This removes the need for derived types to define a static typeID field.

PiperOrigin-RevId: 237482890

5 years agoAdd a basic model to set tile sizes + some cleanup
Uday Bondhugula [Fri, 8 Mar 2019 17:21:52 +0000 (09:21 -0800)]
Add a basic model to set tile sizes + some cleanup
- compute tile sizes based on a simple model that looks at memory footprints
  (instead of using the hardcoded default value)
- adjust tile sizes to make them factors of trip counts based on an option
- update loop fusion CL options to allow setting maximal fusion at pass creation
- change an emitError to emitWarning (since it's not a hard error unless the client
  treats it that way, in which case, it can emit one)

$ mlir-opt -debug-only=loop-tile -loop-tile test/Transforms/loop-tiling.mlir

test/Transforms/loop-tiling.mlir:81:3: note: using tile sizes [4 4 5 ]

  for %i = 0 to 256 {

for %i0 = 0 to 256 step 4 {
    for %i1 = 0 to 256 step 4 {
      for %i2 = 0 to 250 step 5 {
        for %i3 = #map4(%i0) to #map11(%i0) {
          for %i4 = #map4(%i1) to #map11(%i1) {
            for %i5 = #map4(%i2) to #map12(%i2) {
              %0 = load %arg0[%i3, %i5] : memref<8x8xvector<64xf32>>
              %1 = load %arg1[%i5, %i4] : memref<8x8xvector<64xf32>>
              %2 = load %arg2[%i3, %i4] : memref<8x8xvector<64xf32>>
              %3 = mulf %0, %1 : vector<64xf32>
              %4 = addf %2, %3 : vector<64xf32>
              store %4, %arg2[%i3, %i4] : memref<8x8xvector<64xf32>>
            }
          }
        }
      }
    }
  }

PiperOrigin-RevId: 237461836

5 years agoPython bindings: introduce loop and loop nest contexts
Alex Zinenko [Fri, 8 Mar 2019 15:45:26 +0000 (07:45 -0800)]
Python bindings: introduce loop and loop nest contexts

Recently, EDSC introduced an eager mode for building IR in different contexts.
Introduce Python bindings support for loop and loop nest contexts of EDSC
builders.  The eager mode is built around the notion of ValueHandle, which is
convenience class for delayed initialization and operator overloads.  Expose
this class and overloads directly.  The model of insertion contexts maps
naturally to Python context manager mechanism, therefore new bindings are
defined bypassing the C APIs.  The bindings now provide three new context
manager classes: FunctionContext, LoopContext and LoopNestContext.  The last
two can be used with the `with`-construct in Python to create loop (nests) and
obtain handles to the loop induction variables seamlessly:

    with LoopContext(lhs, rhs, 1) as i:
      lhs + rhs + i
      with LoopContext(rhs, rhs + rhs, 2) as j:
        x = i + j

Any statement within the Python context will trigger immediate emission of the
corresponding IR constructs into the context owned by the nearest context
manager.

PiperOrigin-RevId: 237447732

5 years agoConvert ambiguous bool returns in /Analysis to use Status instead.
River Riddle [Fri, 8 Mar 2019 06:14:47 +0000 (22:14 -0800)]
Convert ambiguous bool returns in /Analysis to use Status instead.

PiperOrigin-RevId: 237390240

5 years agoUse Status instead of bool in DialectConversion.
River Riddle [Thu, 7 Mar 2019 23:33:48 +0000 (15:33 -0800)]
Use Status instead of bool in DialectConversion.

PiperOrigin-RevId: 237339277

5 years agoUpdate the PassManager infrastructure to return Status instead of bool.
River Riddle [Thu, 7 Mar 2019 17:22:04 +0000 (09:22 -0800)]
Update the PassManager infrastructure to return Status instead of bool.

PiperOrigin-RevId: 237261205

5 years agoFix unionBoundingBox bug introduced by cl/237141668
Uday Bondhugula [Thu, 7 Mar 2019 15:11:59 +0000 (07:11 -0800)]
Fix unionBoundingBox bug introduced by cl/237141668

- add test case

PiperOrigin-RevId: 237241598

5 years agoLLVM IR Dialect conversion: use builder arguments instead of named attributes
Alex Zinenko [Thu, 7 Mar 2019 14:41:17 +0000 (06:41 -0800)]
LLVM IR Dialect conversion: use builder arguments instead of named attributes

The first version of TableGen-defined LLVM IR Dialect did not include the
mandatory or optional attributes of the operations due to the missing support
for some of the relevant attribute types.  This support has been recently
introduced, along with named attributes as arguments in the TableGen operation
definitions.  With these changes, LLVM IR Dialect operations now have factory
functions accepting (unnamed) attributes and attaching their canonical names.
Use these factories instead of manually constructing named attributes in the
dialect convreter to avoid hardcoded attribute names in unexpected places.

PiperOrigin-RevId: 237237769

5 years agoCleanups in the LLVM IR Dialect
Alex Zinenko [Thu, 7 Mar 2019 09:27:09 +0000 (01:27 -0800)]
Cleanups in the LLVM IR Dialect

These cleanups reflects some recent changes to the LLVM IR Dialect and the
infrastructure that affects it.  In particular, add documentation on direct and
indirect function calls as well as remove the `call` and `call0` separation.
Change the prefix of custom types from `!llvm.type` to `!llvm` so that it
matches the IR.  Remove the verifier check disallowing conditional branches to
the same block with arguments: identical arguments are now supported, and
different arguments will be caught later.

PiperOrigin-RevId: 237203452

5 years agoTableGen most of the LLVM IR Dialect to LLVM IR conversions
Alex Zinenko [Thu, 7 Mar 2019 09:23:43 +0000 (01:23 -0800)]
TableGen most of the LLVM IR Dialect to LLVM IR conversions

The LLVM IR Dialect strives to be close to the original LLVM IR instructions.
The conversion from the LLVM IR Dialect to LLVM IR proper is mostly mechanical
and can be automated.  Implement TableGen support for generating conversions
from a concise pattern form in the TableGen definition of the LLVM IR Dialect
operations.  It is used for all operations except calls and branches.  These
operations need access to function and block remapping tables and would require
significantly more code to generate the conversions from TableGen definitions
than the current manually written conversions.

This implementation is accompanied by various necessary changes to the TableGen
operation definition infrastructure.  In particular, operation definitions now
contain named accessors to results as well as named accessors to the variadic
operand (returning a vector of operands).  The base operation support TableGen
file now contains a FunctionAttr definition.  The TableGen now allows to query
the names of the operation results.

PiperOrigin-RevId: 237203077

5 years agoChange assert message to mention `nullptr` instead of `sentinel`: this is likely...
Mehdi Amini [Thu, 7 Mar 2019 04:00:28 +0000 (20:00 -0800)]
Change assert message to mention `nullptr` instead of `sentinel`: this is likely more helpful to the user when it fires

PiperOrigin-RevId: 237170067

5 years agoMove UtilResult into the Support directory and rename it to Status. Status provides...
River Riddle [Thu, 7 Mar 2019 01:37:14 +0000 (17:37 -0800)]
Move UtilResult into the Support directory and rename it to Status. Status provides an unambiguous way to specify success/failure results. These can be generated by 'Status::success()' and Status::failure()'. Status provides no implicit conversion to bool and should be consumed by one of the following utility functions:

* bool succeeded(Status)
  - Return if the status corresponds to a success value.

* bool failed(Status)
  - Return if the status corresponds to a failure value.

PiperOrigin-RevId: 237153884

5 years agoAdd documentation for the new pass infrastructure.
River Riddle [Thu, 7 Mar 2019 01:34:42 +0000 (17:34 -0800)]
Add documentation for the new pass infrastructure.

PiperOrigin-RevId: 237153501

5 years agoAdds offset argument to specified range of ids know to be aligned when calling mergeA...
MLIR Team [Thu, 7 Mar 2019 00:41:32 +0000 (16:41 -0800)]
Adds offset argument to specified range of ids know to be aligned when calling mergeAndAlignIds (used by FlatAffineConstraints).
Supports use case where FlatAffineConstraints::composeMap adds dim identifiers with no SSA values (because the identifiers are the result of an AffineValueMap which is not materialized in the IR and thus has no SSA Value results).

PiperOrigin-RevId: 237145506

5 years agoFix opt build.
MLIR Team [Thu, 7 Mar 2019 00:18:56 +0000 (16:18 -0800)]
Fix opt build.

PiperOrigin-RevId: 237141751

5 years agoAdd FlatAffineConstraints::containsId to avoid using findId when position isn't
Uday Bondhugula [Thu, 7 Mar 2019 00:18:27 +0000 (16:18 -0800)]
Add FlatAffineConstraints::containsId to avoid using findId when position isn't
needed + other cleanup
- clean up unionBoundingBox (hoist SmallVector allocations out of loop).

PiperOrigin-RevId: 237141668

5 years agoFix an incorrect comment in builder-api-test.
Nicolas Vasilache [Wed, 6 Mar 2019 22:34:26 +0000 (14:34 -0800)]
Fix an incorrect comment in builder-api-test.

Also address post commit cleanups that were missed.

PiperOrigin-RevId: 237122077

5 years agoAdd helper classes to declarative builders to help write end-to-end custom ops.
Nicolas Vasilache [Wed, 6 Mar 2019 21:54:41 +0000 (13:54 -0800)]
Add helper classes to declarative builders to help write end-to-end custom ops.

This CL adds the same helper classes that exist in the AST form of EDSCs to support a basic indexing notation and emit the proper load and store operations and capture MemRefViews as function arguments.

This CL also adds a wrapper class LoopNestBuilder to allow generic rank-agnostic loops over indices.

PiperOrigin-RevId: 237113755

5 years ago[TableGen] Emit verification code for op results
Lei Zhang [Wed, 6 Mar 2019 20:50:01 +0000 (12:50 -0800)]
[TableGen] Emit verification code for op results

They can be verified using the same logic as operands.

PiperOrigin-RevId: 237101461

5 years agoNFC: Remove 'Result' from the analysis manager api to better reflect the implementati...
River Riddle [Wed, 6 Mar 2019 20:03:14 +0000 (12:03 -0800)]
NFC: Remove 'Result' from the analysis manager api to better reflect the implementation. There is no distinction between analysis computation and result.

PiperOrigin-RevId: 237093101

5 years agoMore graceful failure when verifying llvm.noalias.
Dimitrios Vytiniotis [Wed, 6 Mar 2019 19:05:43 +0000 (11:05 -0800)]
More graceful failure when verifying llvm.noalias.

PiperOrigin-RevId: 237081778

5 years agoAdd support for preserving specific analyses in the analysis manager. Passes can...
River Riddle [Wed, 6 Mar 2019 19:04:22 +0000 (11:04 -0800)]
Add support for preserving specific analyses in the analysis manager. Passes can now preserve specific analyses via 'markAnalysesPreserved'.

Example:

markAnalysesPreserved<DominanceInfo>();
markAnalysesPreserved<DominanceInfo, PostDominanceInfo>();

PiperOrigin-RevId: 237081454

5 years agoHotfix for unused variable in opt mode
Nicolas Vasilache [Wed, 6 Mar 2019 18:28:31 +0000 (10:28 -0800)]
Hotfix for unused variable in opt mode

PiperOrigin-RevId: 237073601

5 years agoUsing llvm.noalias attribute when generating LLVMIR.
Dimitrios Vytiniotis [Wed, 6 Mar 2019 17:34:53 +0000 (09:34 -0800)]
Using llvm.noalias attribute when generating LLVMIR.

PiperOrigin-RevId: 237063104

5 years ago[EDSC] Hotfix: Avoid implicit OpPointer -> OpType* conversion
Nicolas Vasilache [Wed, 6 Mar 2019 16:39:27 +0000 (08:39 -0800)]
[EDSC] Hotfix: Avoid implicit OpPointer -> OpType* conversion

An implicit OpPointer -> OpType* conversion results in AddressSanitizer triggering a stack-use-after-scope error (which may be a false positive).
Avoid using such patterns to make life good again.

PiperOrigin-RevId: 237053863

5 years agoPython bindinds: support functions with attributes and argument attributes
Alex Zinenko [Wed, 6 Mar 2019 15:58:18 +0000 (07:58 -0800)]
Python bindinds: support functions with attributes and argument attributes

Currently, Python bindings provide support for declarting and defining MLIR
functions given a list of argument and result types.  Extend the support for
both function declaration and function definition to handle optional function
attributes and function argument attributes.  Function attributes are exposed
as keyword arguments on function declaration and definition calls.  Function
argument attributes are exposed through a special object that combines the
argument type and its list of attributes.  Such objects can be passed instead
of bare types into the type declaration and definition calls.  They can be
constructed from bare types and reused in different declarations.

Note that, from the beginning, Python bindings did not pass through C bindings
to declare and define functions.  This commit keeps the direct interaction
between Python and C++.

PiperOrigin-RevId: 237047561

5 years agoAdd an eager API version for BR and COND_BR
Nicolas Vasilache [Wed, 6 Mar 2019 15:46:36 +0000 (07:46 -0800)]
Add an eager API version for BR and COND_BR

When building unstructured control-flow there is a need to construct mlir::Block* before being able to fill them. This invites goto-style programming.

This CL introduces an alternative eager API for BR and COND_BR in which blocks are created eagerly and captured on the fly.

This allows reducing the number of calls to `BlockBuilder` from 4 to 2 in the `builder_blocks_eager` test and from 3 to 2 in the `builder_cond_branch_eager` test.

PiperOrigin-RevId: 237046114

5 years agoAdd support for Branches in edsc::Builder
Nicolas Vasilache [Wed, 6 Mar 2019 14:12:39 +0000 (06:12 -0800)]
Add support for Branches in edsc::Builder

This CL adds support for BranchHandle and BranchBuilder that require a slightly different
abstraction since an mlir::Block is not an mlir::Value.

This CL also adds support for the BR and COND_BR instructions and the relevant tests.

PiperOrigin-RevId: 237034312

5 years agoStart a new implementation for edsc::Builder
Nicolas Vasilache [Wed, 6 Mar 2019 13:46:09 +0000 (05:46 -0800)]
Start a new implementation for edsc::Builder

This CL reworks the design of EDSCs from first principles.
It introduces a ValueHandle which can hold either:
1. an eagerly typed, delayed Value*
2. a precomputed Value*

A ValueHandle can be manipulated with intrinsic operations a nested within a NestedBuilder. These NestedBuilder are a more idiomatic nested builder abstraction that should feel intuitive to program in C++.

Notably, this abstraction does not require an AST to stage the construction of MLIR snippets from C++. Instead, the abstraction makes use of orderings between definition and declaration of ValueHandles and provides a NestedBuilder and a LoopBuilder helper classes to handle those orderings.

All instruction creations are meant to use the templated ValueHandle::create<> which directly calls mlir::Builder.create<>.

For now the EDSC AST and the builders live side-by-side until the C API is ported.

PiperOrigin-RevId: 237030945

5 years agoTableGen: allow mixing attributes and operands in the Arguments DAG of Op definition
Alex Zinenko [Wed, 6 Mar 2019 09:23:41 +0000 (01:23 -0800)]
TableGen: allow mixing attributes and operands in the Arguments DAG of Op definition

The existing implementation of the Op definition generator assumes and relies
on the fact that native Op Attributes appear after its value-based operands in
the Arguments list.  Furthermore, the same order is used in the generated
`build` function for the operation.  This is not desirable for some operations
with mandatory attributes that would want the attribute to appear upfront for
better consistency with their textual representation, for example `cmpi` would
prefer the `predicate` attribute to be foremost in the argument list.

Introduce support for using attributes and operands in the Arguments DAG in no
particular order.  This is achieved by maintaining a list of Arguments that
point to either the value or the attribute and are used to generate the `build`
method.

PiperOrigin-RevId: 237002921

5 years agoUse FlatAffineConstraints::unionBoundingBox to perform slice bounds union for loop...
MLIR Team [Wed, 6 Mar 2019 04:33:30 +0000 (20:33 -0800)]
Use FlatAffineConstraints::unionBoundingBox to perform slice bounds union for loop fusion pass (WIP).
Adds utility to convert slice bounds to a FlatAffineConstraints representation.
Adds utility to FlatAffineConstraints to promote loop IV symbol identifiers to dim identifiers.

PiperOrigin-RevId: 236973261

5 years agoDMA generation CL flag update
Uday Bondhugula [Wed, 6 Mar 2019 01:19:47 +0000 (17:19 -0800)]
DMA generation CL flag update

- allow mem capacity to be overridden by command-line flag
- change default fast mem space to 2

PiperOrigin-RevId: 236951598

5 years agoAdd missing run command to fusion test cases - follow up to cl/236882988
Uday Bondhugula [Wed, 6 Mar 2019 00:54:34 +0000 (16:54 -0800)]
Add missing run command to fusion test cases - follow up to cl/236882988

PiperOrigin-RevId: 236947383

5 years agoChange Pass:getFunction() to return pointer instead of ref - NFC
Uday Bondhugula [Tue, 5 Mar 2019 23:05:34 +0000 (15:05 -0800)]
Change Pass:getFunction() to return pointer instead of ref - NFC

- change this for consistency - everything else similar takes/returns a
  Function pointer - the FuncBuilder ctor,
  Block/Value/Instruction::getFunction(), etc.
- saves a whole bunch of &s everywhere

PiperOrigin-RevId: 236928761

5 years agoChange the TensorFlow attribute prefix from "tf$" to "tf." to match the specification...
River Riddle [Tue, 5 Mar 2019 22:42:55 +0000 (14:42 -0800)]
Change the TensorFlow attribute prefix from "tf$" to "tf." to match the specification of dialect attributes. This also fixes tblgen generation of dialect attributes that used the sugared name "tf$attr" as c++ identifiers.

PiperOrigin-RevId: 236924392

5 years agoAdd a unittests directory for MLIR and start adding tests for OperandStorage from...
River Riddle [Tue, 5 Mar 2019 21:37:48 +0000 (13:37 -0800)]
Add a unittests directory for MLIR and start adding tests for OperandStorage from InstructionSupport.h.

PiperOrigin-RevId: 236911640

5 years agoNFC: Move OperandStorage into a new header file for instruction support utilities...
River Riddle [Tue, 5 Mar 2019 19:56:57 +0000 (11:56 -0800)]
NFC: Move OperandStorage into a new header file for instruction support utilities, InstructionSupport.h.

PiperOrigin-RevId: 236892857

5 years agoFix and improve detectAsMod
Uday Bondhugula [Tue, 5 Mar 2019 19:08:41 +0000 (11:08 -0800)]
Fix and improve detectAsMod
- fix for the mod detection
- simplify/avoid the mod at construction (if the dividend is already known to be less
  than the divisor), since the information is available at hand there

PiperOrigin-RevId: 236882988

5 years agoFix lower/upper bound mismatch in stripmineSink
Nicolas Vasilache [Tue, 5 Mar 2019 18:50:50 +0000 (10:50 -0800)]
Fix lower/upper bound mismatch in stripmineSink

Also beef up the corresponding test case.

PiperOrigin-RevId: 236878818

5 years agoFix dialect attribute hooks so that they accept a NamedAttribute instead of an Attribute.
River Riddle [Tue, 5 Mar 2019 18:05:53 +0000 (10:05 -0800)]
Fix dialect attribute hooks so that they accept a NamedAttribute instead of an Attribute.

PiperOrigin-RevId: 236869321

5 years agoTableGen: fix builder generation for optional attributes
Alex Zinenko [Tue, 5 Mar 2019 13:48:24 +0000 (05:48 -0800)]
TableGen: fix builder generation for optional attributes

The recently introduced support for generating MLIR Operations with optional
attributes did not handle the formatted string emission properly, in particular
it did not escape `{` and `}` in calls to `formatv` leading to assertions
during TableGen op definition generation.  Fix this by splitting out the
unncessary braces from the format string.  Additionally, fix the emission of
the builder argument comment to correctly indicate which attributes are indeed
optional and which are not.

PiperOrigin-RevId: 236832230

5 years agoMake sure that fusion test cases don't have out of bounds accesses
Uday Bondhugula [Tue, 5 Mar 2019 01:26:46 +0000 (17:26 -0800)]
Make sure that fusion test cases don't have out of bounds accesses

- fix out of bounds test case
- -memref-bound-check on the test/Transforms/loop-fusion.mlir no longer reports any
  errors, before or after -loop-fusion is run

PiperOrigin-RevId: 236757658

5 years agoAdds loop attribute as a temporary work around to prevent slice fusion of loop nests...
MLIR Team [Mon, 4 Mar 2019 23:14:12 +0000 (15:14 -0800)]
Adds loop attribute as a temporary work around to prevent slice fusion of loop nests containing instructions with side effects (the proper solution will be do use memref read/write regions in the future).

PiperOrigin-RevId: 236733739

5 years agoBug fix for getConstantBoundOnDimSize
Uday Bondhugula [Mon, 4 Mar 2019 22:58:59 +0000 (14:58 -0800)]
Bug fix for getConstantBoundOnDimSize

- this was detected when memref-bound-check was run on the output of the
  loop-fusion pass
- the addition (to represent ceildiv as a floordiv) had to be performed only
  for the constant term of the constraint
- update test cases
- memref-bound-check no longer returns an error on the output of this test case

PiperOrigin-RevId: 236731137

5 years agoSupporting conversion of argument attributes along their types.
Dimitrios Vytiniotis [Mon, 4 Mar 2019 21:04:59 +0000 (13:04 -0800)]
Supporting conversion of argument attributes along their types.

This fixes a bug: previously, during conversion function argument
attributes were neither beings passed through nor converted. This fix
extends DialectConversion to allow for simultaneous conversion of the
function type and the argument attributes.

This was important when lowering MLIR to LLVM where attribute
information (e.g. noalias) needs to be preserved in MLIR(LLVMDialect).

Longer run it seems reasonable that we want to convert both the
function attribute and its type and the argument attributes, but that
requires a small refactoring in Function.h to aggregate these three
fields in an inner struct, which will require some discussion.

PiperOrigin-RevId: 236709409

5 years agoAdd a 'verifyPasses' flag to the PassManager that specifies if the IR should be verif...
River Riddle [Mon, 4 Mar 2019 20:33:13 +0000 (12:33 -0800)]
Add a 'verifyPasses' flag to the PassManager that specifies if the IR should be verified after each pass. This also adds a "verify-each" flag to mlir-opt to optionally disable running the verifier after each pass.

PiperOrigin-RevId: 236703760

5 years agoHandle MemRefRegion::compute return value in loop fusion pass (NFC).
MLIR Team [Mon, 4 Mar 2019 19:01:25 +0000 (11:01 -0800)]
Handle MemRefRegion::compute return value in loop fusion pass (NFC).

PiperOrigin-RevId: 236685849

5 years agoIntroduce the notion of dialect attributes and dependent attributes. A dialect attrib...
River Riddle [Sun, 3 Mar 2019 06:34:18 +0000 (22:34 -0800)]
Introduce the notion of dialect attributes and dependent attributes. A dialect attribute derives its context from a specific dialect, whereas a dependent attribute derives context from what it is attached to. Following this, we now enforce that functions and function arguments may only contain dialect specific attributes. These are generic entities and cannot provide any specific context for a dependent attribute.

Dialect attributes are defined as:

        dialect-namespace `.` attr-name `:` attribute-value

Dialects can override any of the following hooks to verify the validity of a given attribute:
  * verifyFunctionAttribute
  * verifyFunctionArgAttribute
  * verifyInstructionAttribute

PiperOrigin-RevId: 236507970

5 years agoImplement the initial AnalysisManagement infrastructure, with the introduction of...
River Riddle [Sun, 3 Mar 2019 05:46:58 +0000 (21:46 -0800)]
Implement the initial AnalysisManagement infrastructure, with the introduction of the FunctionAnalysisManager and ModuleAnalysisManager classes. These classes provide analysis computation, caching, and invalidation for a specific IR unit. The invalidation is currently limited to either all or none, i.e. you cannot yet preserve specific analyses.

An analysis can be any class, but it must provide the following:
* A constructor for a given IR unit.

struct MyAnalysis {
  // Compute this analysis with the provided module.
  MyAnalysis(Module *module);
};

Analyses can be accessed from a Pass by calling either the 'getAnalysisResult<AnalysisT>' or 'getCachedAnalysisResult<AnalysisT>' methods. A FunctionPass may query for a cached analysis on the parent module with 'getCachedModuleAnalysisResult'. Similary, a ModulePass may query an analysis, it doesn't need to be cached, on a child function with 'getFunctionAnalysisResult'.

By default, when running a pass all cached analyses are set to be invalidated. If no transformation was performed, a pass can use the method 'markAllAnalysesPreserved' to preserve all analysis results. As noted above, preserving specific analyses is not yet supported.

PiperOrigin-RevId: 236505642

5 years agoAdd an assertion on the builder to ensure that a block is set before creating an...
Mehdi Amini [Sun, 3 Mar 2019 05:18:19 +0000 (21:18 -0800)]
Add an assertion on the builder to ensure that a block is set before creating an operation

This is more friendly for the user than a raw segfault

PiperOrigin-RevId: 236504102

5 years agoSet the namespace of the StandardOps dialect to "std", but add a special case to...
River Riddle [Sun, 3 Mar 2019 02:03:03 +0000 (18:03 -0800)]
Set the namespace of the StandardOps dialect to "std", but add a special case to the parser to allow parsing standard operations without the "std" prefix. This will now allow for the standard dialect to be looked up dynamically by name.

PiperOrigin-RevId: 236493865

5 years agoRemove hidden flag from fusion CL options
Uday Bondhugula [Sat, 2 Mar 2019 01:42:13 +0000 (17:42 -0800)]
Remove hidden flag from fusion CL options

PiperOrigin-RevId: 236409185

5 years agoUpdate addSliceBounds to deal with loops with floor's/mod's.
Uday Bondhugula [Sat, 2 Mar 2019 01:06:25 +0000 (17:06 -0800)]
Update addSliceBounds to deal with loops with floor's/mod's.

- This change only impacts the cost model for fusion, given the way
  addSliceBounds was being used. It so happens that the output in spite of this
  CL's fix is the same; however, the assertions added no longer fail. (an
  invalid/inconsistent memref region was being used earlier).

PiperOrigin-RevId: 236405030

5 years agoNFC. Move all of the remaining operations left in BuiltinOps to StandardOps. The...
River Riddle [Sat, 2 Mar 2019 00:58:00 +0000 (16:58 -0800)]
NFC. Move all of the remaining operations left in BuiltinOps to StandardOps. The only thing left in BuiltinOps are the core MLIR types. The standard types can't be moved because they are referenced within the IR directory, e.g. in things like Builder.

PiperOrigin-RevId: 236403665

5 years agoUse consistent names for dialect op source files
Lei Zhang [Fri, 1 Mar 2019 21:48:24 +0000 (13:48 -0800)]
Use consistent names for dialect op source files

This CL changes dialect op source files (.h, .cpp, .td) to follow the following
convention:

  <full-dialect-name>/<dialect-namespace>Ops.{h|cpp|td}

Builtin and standard dialects are specially treated, though. Both of them do
not have dialect namespace; the former is still named as BuiltinOps.* and the
latter is named as Ops.*.

Purely mechanical. NFC.

PiperOrigin-RevId: 236371358

5 years agoA simple pass to detect and mark all parallel loops
Uday Bondhugula [Fri, 1 Mar 2019 21:27:06 +0000 (13:27 -0800)]
A simple pass to detect and mark all parallel loops
- detect all parallel loops based on dep information and mark them with a
  "parallel" attribute
- add mlir::isLoopParallel(OpPointer<AffineForOp> ...), and refactor an existing method
  to use that (reuse some code from @andydavis (cl/236007073) for this)
- a simple/meaningful way to test memref dep test as well

Ex:

$ mlir-opt -detect-parallel test/Transforms/parallelism-detection.mlir
#map1 = ()[s0] -> (s0)
func @foo(%arg0: index) {
  %0 = alloc() : memref<1024x1024xvector<64xf32>>
  %1 = alloc() : memref<1024x1024xvector<64xf32>>
  %2 = alloc() : memref<1024x1024xvector<64xf32>>
  for %i0 = 0 to %arg0 {
    for %i1 = 0 to %arg0 {
      for %i2 = 0 to %arg0 {
        %3 = load %0[%i0, %i2] : memref<1024x1024xvector<64xf32>>
        %4 = load %1[%i2, %i1] : memref<1024x1024xvector<64xf32>>
        %5 = load %2[%i0, %i1] : memref<1024x1024xvector<64xf32>>
        %6 = mulf %3, %4 : vector<64xf32>
        %7 = addf %5, %6 : vector<64xf32>
        store %7, %2[%i0, %i1] : memref<1024x1024xvector<64xf32>>
      } {parallel: false}
    } {parallel: true}
  } {parallel: true}
  return
}

PiperOrigin-RevId: 236367368

5 years agoLoop fusion for input reuse.
MLIR Team [Fri, 1 Mar 2019 19:50:25 +0000 (11:50 -0800)]
Loop fusion for input reuse.
*) Breaks fusion pass into multiple sub passes over nodes in data dependence graph:
- first pass fuses single-use producers into their unique consumer.
- second pass enables fusing for input-reuse by fusing sibling nodes which read from the same memref, but which do not share dependence edges.
- third pass fuses remaining producers into their consumers (Note that the sibling fusion pass may have transformed a producer with multiple uses into a single-use producer).
*) Fusion for input reuse is enabled by computing a sibling node slice using the load/load accesses to the same memref, and fusion safety is guaranteed by checking that the sibling node memref write region (to a different memref) is preserved.
*) Enables output vector and output matrix computations from KFAC patches-second-moment operation to fuse into a single loop nest and reuse input from the image patches operation.
*) Adds a generic loop utilitiy for finding all sequential loops in a loop nest.
*) Adds and updates unit tests.

PiperOrigin-RevId: 236350987

5 years agoAdd support for parsing and printing affine.if and affine.for attributes. The attribu...
River Riddle [Fri, 1 Mar 2019 19:29:01 +0000 (11:29 -0800)]
Add support for parsing and printing affine.if and affine.for attributes. The attribute dictionaries are printed after the final block list for both operations:

  for %i = 0 to 10 {
     ...
  } {some_attr: true}

  if () : () () {
    ...
  } {some_attr: true}

  if () : () () {
    ...
  } else {
    ...
  } {some_attr: true}

PiperOrigin-RevId: 236346983

5 years agoAnalysis support for floordiv/mod's in loop bounds/
Uday Bondhugula [Fri, 1 Mar 2019 17:48:22 +0000 (09:48 -0800)]
Analysis support for floordiv/mod's in loop bounds/

- handle floordiv/mod's in loop bounds for all analysis purposes
- allows fusion slicing to be more powerful
- add simple test cases based on -memref-bound-check
- fusion based test cases in follow up CLs

PiperOrigin-RevId: 236328551