# Developer Overview

This guide provides an overview of IREE's project structure and main tools for
developers.

** Note: project layout is evolving at the moment, see
   https://github.com/openxla/iree/issues/8955 **

## Project Code Layout

* [/compiler/](https://github.com/openxla/iree/blob/main/compiler/):
  MLIR dialects, LLVM compiler passes, module translation code, etc.
  * [bindings/](https://github.com/openxla/iree/blob/main/compiler/bindings/):
    Python and other language bindings
* [/runtime/](https://github.com/openxla/iree/tree/main/runtime/):
  Standalone runtime code including the VM and HAL drivers
  * [bindings/](https://github.com/openxla/iree/tree/main/runtime/bindings/):
    Python and other language bindings
* [/integrations/](https://github.com/openxla/iree/blob/main/integrations/):
  Integrations between IREE and other frameworks, such as TensorFlow
* [/tests/](https://github.com/openxla/iree/blob/main/tests/):
  Tests for full compiler->runtime workflows
* [/tools/](https://github.com/openxla/iree/blob/main/tools/):
  Developer tools (`iree-compile`, `iree-run-module`, etc.)
* [/samples/](https://github.com/openxla/iree/blob/main/samples/): Also see the
  separate https://github.com/iree-org/iree-samples repository

## IREE Compiler Code Layout

* [API/](https://github.com/openxla/iree/tree/main/compiler/src/iree/compiler/API):
  Public C API
* [Codegen/](https://github.com/openxla/iree/tree/main/compiler/src/iree/compiler/Codegen):
  Code generation for compute kernels
* [Dialect/](https://github.com/openxla/iree/tree/main/compiler/src/iree/compiler/Dialect):
  MLIR dialects (`Flow`, `HAL`, `Stream`, `VM`, etc.)
* [InputConversion/](https://github.com/openxla/iree/tree/main/compiler/src/iree/compiler/InputConversion):
  Conversions from input dialects and preprocessing

## IREE Runtime Code Layout

* [base/](https://github.com/openxla/iree/blob/main/runtime/src/iree/base/):
  Common types and utilities used throughout the runtime
* [hal/](https://github.com/openxla/iree/blob/main/runtime/src/iree/hal/):
  **H**ardware **A**bstraction **L**ayer for IREE's runtime, with
  implementations for hardware and software backends
* [schemas/](https://github.com/openxla/iree/blob/main/runtime/src/iree/schemas/):
  Data storage format definitions, primarily using
  [FlatBuffers](https://google.github.io/flatbuffers/)
* [task/](https://github.com/openxla/iree/blob/main/runtime/src/iree/task/):
  System for running tasks across multiple CPU threads
* [tooling/](https://github.com/openxla/iree/blob/main/runtime/src/iree/tooling/):
  Utilities for tests and developer tools, not suitable for use as-is in
  downstream applications
* [vm/](https://github.com/openxla/iree/blob/main/runtime/src/iree/vm/):
  Bytecode **V**irtual **M**achine used to work with IREE modules and invoke
  IREE functions

## Developer Tools

IREE's core compiler accepts programs in supported input MLIR dialects (e.g.
`stablehlo`, `tosa`, `linalg`). Import tools and APIs may be used to convert
from framework-specific formats like TensorFlow
[SavedModel](https://www.tensorflow.org/guide/saved_model) to MLIR modules.
While programs are ultimately compiled down to modules suitable for running on
some combination of IREE's target deployment platforms, IREE's developer tools
can run individual compiler passes, translations, and other transformations step
by step.

### iree-opt

`iree-opt` is a tool for testing IREE's compiler passes. It is similar to
[mlir-opt](https://github.com/llvm/llvm-project/tree/main/mlir/tools/mlir-opt)
and runs sets of IREE's compiler passes on `.mlir` input files. See "conversion"
in [MLIR's Glossary](https://mlir.llvm.org/getting_started/Glossary/#conversion)
for more information. Transformations performed by `iree-opt` can range from
individual passes performing isolated manipulations to broad pipelines that
encompass a sequence of steps.

Test `.mlir` files that are checked in typically include a `RUN` block at the
top of the file that specifies which passes should be performed and if
`FileCheck` should be used to test the generated output.

Here's an example of a small compiler pass running on a
[test file](https://github.com/openxla/iree/blob/main/compiler/src/iree/compiler/Dialect/Util/Transforms/test/drop_compiler_hints.mlir):

```shell
$ ../iree-build/tools/iree-opt \
  --split-input-file \
  --mlir-print-ir-before-all \
  --iree-drop-compiler-hints \
  $PWD/compiler/src/iree/compiler/Dialect/Util/Transforms/test/drop_compiler_hints.mlir
```

For a more complex example, here's how to run IREE's complete transformation
pipeline targeting the VMVX backend on the
[fullyconnected.mlir](https://github.com/openxla/iree/blob/main/tests/e2e/models/fullyconnected.mlir)
model file:

```shell
$ ../iree-build/tools/iree-opt \
  --iree-transformation-pipeline \
  --iree-hal-target-backends=vmvx \
  $PWD/tests/e2e/models/fullyconnected.mlir
```

### iree-compile

`iree-compile` is IREE's main compiler driver for generating binaries from
supported input MLIR assembly.

For example, to translate `simple.mlir` to an IREE module:

```shell
$ ../iree-build/tools/iree-compile \
  --iree-hal-target-backends=vmvx \
  $PWD/samples/models/simple_abs.mlir \
  -o /tmp/simple_abs_vmvx.vmfb
```

### iree-run-module

The `iree-run-module` program takes an already translated IREE module as input
and executes an exported main function using the provided inputs.

This program can be used in sequence with `iree-compile` to translate a
`.mlir` file to an IREE module and then execute it. Here is an example command
that executes the simple `simple_abs_vmvx.vmfb` compiled from `simple_abs.mlir`
above on IREE's VMVX driver:

```shell
$ ../iree-build/tools/iree-run-module \
  --module=/tmp/simple_abs_vmvx.vmfb \
  --device=local-task \
  --function=abs \
  --input=f32=-2
```

### iree-check-module

The `iree-check-module` program takes an already translated IREE module as input
and executes it as a series of
[googletest](https://github.com/google/googletest) tests. This is the test
runner for the IREE [check framework](./testing_guide.md#end-to-end-tests).

```shell
$ ../iree-build/tools/iree-compile \
  --iree-input-type=mhlo \
  --iree-hal-target-backends=vmvx \
  $PWD/tests/e2e/xla_ops/abs.mlir \
  -o /tmp/abs.vmfb
```

```shell
$ ../iree-build/tools/iree-check-module \
  --device=local-task \
  --module=/tmp/abs.vmfb
```

### iree-run-mlir

The `iree-run-mlir` program takes a `.mlir` file as input, translates it to an
IREE bytecode module, and executes the module.

It is designed for testing and debugging, not production uses, and therefore
does some additional work that usually must be explicit, like marking every
function as exported by default and running all of them.

For example, to execute the contents of
[samples/models/simple_abs.mlir](https://github.com/openxla/iree/blob/main/samples/models/simple_abs.mlir):

```shell
# iree-run-mlir <compiler flags> [input.mlir] <runtime flags>
$ ../iree-build/tools/iree-run-mlir \
  --iree-hal-target-backends=vmvx \
  $PWD/samples/models/simple_abs.mlir \
  --input=f32=-2
```

### iree-dump-module

The `iree-dump-module` program prints the contents of an IREE module FlatBuffer
file.

For example, to inspect the module translated above:

```shell
$ ../iree-build/tools/iree-dump-module /tmp/simple_abs_vmvx.vmfb
```

### Useful generic flags

There are a few useful generic flags when working with IREE tools:

#### Read inputs from a file

All the IREE tools support reading input values from a file. This is quite
useful for debugging. Use `-help` for each tool to see what the flag to set. The
inputs are expected to be newline-separated. Each input should be either a
scalar or a buffer. Scalars should be in the format `type=value` and buffers
should be in the format `[shape]xtype=[value]`. For example:

```
1x5xf32=1,-2,-3,4,-5
1x5x3x1xf32=15,14,13,12,11,10,9,8,7,6,5,4,3,2,1
```

#### `iree-flow-trace-dispatch-tensors`

This flag will enable tracing inputs and outputs for each dispatch function. It
is easier to narrow down test cases, since IREE breaks a ML workload into
multiple dispatch function. When the flag is on, IREE will insert trace points
before and after each dispatch function. The first trace op is for inputs, and
the second trace op is for outputs. There will be two events for one dispatch
function.
