Skip to content
  1. Mar 21, 2021
  2. Mar 20, 2021
  3. Mar 19, 2021
  4. Mar 18, 2021
  5. Mar 17, 2021
  6. Mar 16, 2021
    • River Riddle's avatar
      [mlir][PDL] Add support for variadic operands and results in the PDL Interpreter · 3a833a0e
      River Riddle authored
      This revision extends the PDL Interpreter dialect to add support for variadic operands and results, with ranges of these values represented via the recently added !pdl.range type. To support this extension, three new operations have been added that closely match the single variant:
      * pdl_interp.check_types : Compare a range of types with a known range.
      * pdl_interp.create_types : Create a constant range of types.
      * pdl_interp.get_operands : Get a range of operands from an operation.
      * pdl_interp.get_results : Get a range of results from an operation.
      * pdl_interp.switch_types : Switch on a range of types.
      
      This revision handles adding support in the interpreter dialect and the conversion from PDL to PDLInterp. Support for variadic operands and results in the bytecode will be added in a followup revision.
      
      Differential Revision: https://reviews.llvm.org/D95722
      3a833a0e
    • River Riddle's avatar
      [mlir][PDL] Add support for variadic operands and results in PDL · 1eb6994d
      River Riddle authored
      This revision extends the PDL dialect to add support for variadic operands and results, with ranges of these values represented via the recently added !pdl.range type. To support this extension, three new operations have been added that closely match the single variant:
      * pdl.operands : Define a range of input operands.
      * pdl.results : Extract a result group from an operation.
      * pdl.types : Define a handle to a range of types.
      
      Support for these in the pdl interpreter dialect and byte code will be added in followup revisions.
      
      Differential Revision: https://reviews.llvm.org/D95721
      1eb6994d
    • River Riddle's avatar
      [mlir][pdl] Remove CreateNativeOp in favor of a more general ApplyNativeRewriteOp. · 02c4c0d5
      River Riddle authored
      This has a numerous amount of benefits, given the overly clunky nature of CreateNativeOp:
      * Users can now call into arbitrary rewrite functions from inside of PDL, allowing for more natural interleaving of PDL/C++ and enabling for more of the pattern to be in PDL.
      * Removes the need for an additional set of C++ functions/registry/etc. The new ApplyNativeRewriteOp will use the same PDLRewriteFunction as the existing RewriteOp. This reduces the API surface area exposed to users.
      
      This revision also introduces a new PDLResultList class. This class is used to provide results of native rewrite functions back to PDL. We introduce a new class instead of using a SmallVector to simplify the work necessary for variadics, given that ranges will require some changes to the structure of PDLValue.
      
      Differential Revision: https://reviews.llvm.org/D95720
      02c4c0d5
    • River Riddle's avatar
      [mlir][pdl] Restructure how results are represented. · 242762c9
      River Riddle authored
      Up until now, results have been represented as additional results to a pdl.operation. This is fairly clunky, as it mismatches the representation of the rest of the IR constructs(e.g. pdl.operand) and also isn't a viable representation for operations returned by pdl.create_native. This representation also creates much more difficult problems when factoring in support for variadic result groups, optional results, etc. To resolve some of these problems, and simplify adding support for variable length results, this revision extracts the representation for results out of pdl.operation in the form of a new `pdl.result` operation. This operation returns the result of an operation at a given index, e.g.:
      
      ```
      %root = pdl.operation ...
      %result = pdl.result 0 of %root
      ```
      
      Differential Revision: https://reviews.llvm.org/D95719
      242762c9
    • Nicolas Vasilache's avatar
    • Adrian Kuegel's avatar
    • Lorenzo Chelini's avatar
      scf::ForOp: Fold away iterator arguments with no use and for which the... · fd7eee64
      Lorenzo Chelini authored
      scf::ForOp: Fold away iterator arguments with no use and for which the corresponding input is yielded
      
      Enhance 'ForOpIterArgsFolder' to remove unused iteration arguments in a
      scf::ForOp. If the block argument corresponding to the given iterator has no
      use and the yielded value equals the input, we fold it away.
      
      Reviewed By: nicolasvasilache
      
      Differential Revision: https://reviews.llvm.org/D98503
      fd7eee64
    • Aart Bik's avatar
      [mlir][amx] Add Intel AMX dialect (architectural-specific vector dialect) · 6ad7b97e
      Aart Bik authored
      The Intel Advanced Matrix Extensions (AMX) provides a tile matrix
      multiply unit (TMUL), a tile control register (TILECFG), and eight
      tile registers TMM0 through TMM7 (TILEDATA). This new MLIR dialect
      provides a bridge between MLIR concepts like vectors and memrefs
      and the lower level LLVM IR details of AMX.
      
      Reviewed By: nicolasvasilache
      
      Differential Revision: https://reviews.llvm.org/D98470
      6ad7b97e
  7. Mar 15, 2021
    • Alex Zinenko's avatar
      [mlir] fix shared-lib build fallout of e2310704 · 0fb4a201
      Alex Zinenko authored
      The patch in question broke the build with shared libraries due to
      missing dependencies, one of which would have been circular between
      MLIRStandard and MLIRMemRef if added. Fix this by moving more code
      around and swapping the dependency direction. MLIRMemRef now depends on
      MLIRStandard, but MLIRStandard does _not_ depend on MLIRMemRef.
      Arguably, this is the right direction anyway since numerous libraries
      depend on MLIRStandard and don't necessarily need to depend on
      MLIRMemref.
      
      Other otable changes include:
      - some EDSC code is moved inline to MemRef/EDSC/Intrinsics.h because it
        creates MemRef dialect operations;
      - a utility function related to shape moved to BuiltinTypes.h/cpp
        because it only realtes to shaped types and not any particular dialect
        (standard dialect is erroneously believed to contain MemRefType);
      - a Python test for the standard dialect is disabled completely because
        the ops it tests moved to the new MemRef dialect, but it is not
        exposed to Python bindings, and the change for that is non-trivial.
      0fb4a201
    • Julian Gross's avatar
      [MLIR] Create memref dialect and move dialect-specific ops from std. · e2310704
      Julian Gross authored
      Create the memref dialect and move dialect-specific ops
      from std dialect to this dialect.
      
      Moved ops:
      AllocOp -> MemRef_AllocOp
      AllocaOp -> MemRef_AllocaOp
      AssumeAlignmentOp -> MemRef_AssumeAlignmentOp
      DeallocOp -> MemRef_DeallocOp
      DimOp -> MemRef_DimOp
      MemRefCastOp -> MemRef_CastOp
      MemRefReinterpretCastOp -> MemRef_ReinterpretCastOp
      GetGlobalMemRefOp -> MemRef_GetGlobalOp
      GlobalMemRefOp -> MemRef_GlobalOp
      LoadOp -> MemRef_LoadOp
      PrefetchOp -> MemRef_PrefetchOp
      ReshapeOp -> MemRef_ReshapeOp
      StoreOp -> MemRef_StoreOp
      SubViewOp -> MemRef_SubViewOp
      TransposeOp -> MemRef_TransposeOp
      TensorLoadOp -> MemRef_TensorLoadOp
      TensorStoreOp -> MemRef_TensorStoreOp
      TensorToMemRefOp -> MemRef_BufferCastOp
      ViewOp -> MemRef_ViewOp
      
      The roadmap to split the memref dialect from std is discussed here:
      https://llvm.discourse.group/t/rfc-split-the-memref-dialect-from-std/2667
      
      Differential Revision: https://reviews.llvm.org/D98041
      e2310704
    • Frederik Gossen's avatar
      [MLIR] Add canonicalization for `shape.broadcast` · b55f424f
      Frederik Gossen authored
      Remove redundant operands and fold if only one left.
      
      Differential Revision: https://reviews.llvm.org/D98402
      b55f424f
  8. Mar 13, 2021
  9. Mar 12, 2021
  10. Mar 11, 2021
    • Diego Caballero's avatar
      Reland: [mlir][Vector][Affine] Improve affine vectorizer algorithm · 96891f04
      Diego Caballero authored
      This patch replaces the root-terminal vectorization approach implemented in the
      Affine vectorizer with a topological order approach that vectorizes all the
      operations within the target loop nest. These are the most important changes
      introduced by the new algorithm:
        * Removed tracking of root and terminal ops. Existing vectorization
          functionality is preserved and extended so that loop nests without
          root-terminal chains can be vectorized.
        * Vectorizing a loop nest now only requires a single topological traversal.
        * A new vector loop nest is incrementally built along the vectorization
          process. The original scalar loop is kept intact. No cloning guard is needed
          to recover the scalar loop if vectorization fails. This approach also
          simplifies the challenging task of replacing a loop operation amid the
          vectorization process without invalidating the analysis information that
          depends on the original loop.
        * Vectorization of specific operations has been implemented as independent,
          preparing them to be moved to a potential vectorization interface.
      
      Reviewed By: nicolasvasilache
      
      Differential Revision: https://reviews.llvm.org/D97442
      96891f04
    • River Riddle's avatar
      [mlir][StorageUniquer] Properly call the destructor on non-trivially destructible storage instances · 31bb8efd
      River Riddle authored
      This allows for storage instances to store data that isn't uniqued in the context, or contain otherwise non-trivial logic, in the rare situations that they occur. Storage instances with trivial destructors will still have their destructor skipped. A consequence of this is that the storage instance definition must be visible from the place that registers the type.
      
      Differential Revision: https://reviews.llvm.org/D98311
      31bb8efd
    • Diego Caballero's avatar
      [mlir][Vector][Affine] Fix heap-use-after-free in vectorizer · ed193bce
      Diego Caballero authored
      This patch fixes a heap-use-after-free introduced by the recent changes
      in the vectorizer: https://reviews.llvm.org/rG95db7b4aeaad590f37720898e339a6d54313422f
      The problem is due to the way candidate loops are visited. All candidate loops
      are pattern-matched beforehand using the 'NestedMatch' utility. These matches may
      intersect with each other so it may happen that we try to vectorize a loop that
      was previously vectorized. The new vectorization algorithm replaces the original
      loops that are vectorized with new loops and, therefore, any reference to the
      original loops in the pre-computed matches becomes invalid.
      
      This patch fixes the problem by classifying the candidate matches into buckets
      before vectorization. Each bucket contains all the matches that intersect. The
      vectorizer uses these buckets to make sure that we only vectorize *one* match from
      each bucket, at most.
      
      Differential Revision: https://reviews.llvm.org/D98382
      ed193bce
    • Alex Zinenko's avatar
      [mlir] Introduce data layout modeling subsystem · 3ba14fa0
      Alex Zinenko authored
      Data layout information allows to answer questions about the size and alignment
      properties of a type. It enables, among others, the generation of various
      linear memory addressing schemes for containers of abstract types and deeper
      reasoning about vectors. This introduces the subsystem for modeling data
      layouts in MLIR.
      
      The data layout subsystem is designed to scale to MLIR's open type and
      operation system. At the top level, it consists of attribute interfaces that
      can be implemented by concrete data layout specifications; type interfaces that
      should be implemented by types subject to data layout; operation interfaces
      that must be implemented by operations that can serve as data layout scopes
      (e.g., modules); and dialect interfaces for data layout properties unrelated to
      specific types. Built-in types are handled specially to decrease the overall
      query cost.
      
      A concrete default implementation of these interfaces is provided in the new
      Target dialect. Defaults for built-in types that match the current behavior are
      also provided.
      
      Reviewed By: rriddle
      
      Differential Revision: https://reviews.llvm.org/D97067
      3ba14fa0
    • Arpith C. Jacob's avatar
      [mlir] Add LLVM loop codegen options to control software pipelining · b4a516cc
      Arpith C. Jacob authored
      Support specifying the II and disabling pipelining.
      
      Reviewed By: ftynse
      
      Differential Revision: https://reviews.llvm.org/D98420
      b4a516cc
Loading