# Transform Dialect Tutorial

MLIR supports declarative specification for controlling compiler transformations
via the transform dialect. It allows one to request compiler transformations
using compiler IR itself, which can be embedded into the original IR that is
being transformed (similarly to pragmas) or supplied separately (similarly to
scheduling languages). This tutorial presents the concepts of the MLIR transform
dialect and related infrastructure. It will be accompanied by a practical
demonstration of three use scenarios:

- Composing Transform dialect operations available in (upstream) MLIR to perform
  a sequence of optimizing transformations that results in efficient code for an
  MLIR linear algebra operation.
- Defining new Transform dialect operations and adapting existing transformation
  code to work with the Transform dialect infrastructure.
- Setting up and using the Transform dialect infrastructure in a downstream
  out-of-tree project with custom dialects, transformations and passes.

After following the tutorial, one will be able to apply the Transform dialect in
their work and extend it when necessary. Basic familiarity with MLIR is a
prerequisite. See [Toy tutorial](../Toy) for introduction to MLIR.

The tutorial is divided into the following chapters.

-  [Chapter #0](Ch0.md): A Primer on “Structured” Linalg Operations
-  [Chapter #1](Ch1.md): Combining Existing Transformations
-  [Chapter #2](Ch2.md): Adding a Simple New Transformation Operation
-  [Chapter #3](Ch3.md): More than Simple Transform Operations
-  [Chapter #4](Ch4.md): Matching Payload with Transform Operations
-  [Chapter H](ChH.md): Reproducing Halide Schedule

The code corresponding to this tutorial is located under
`mlir/Examples/transform` and the corresponding tests in
`mlir/test/Examples/transform`.
