# Getting Started

This document provides an overview of the systems in IREE, including entry
points to get started exploring IREE's capabilities.

For information on how to set up a development environment, see
[Getting Started on Windows](getting_started_on_windows.md) and
[Getting Started on Linux](getting_started_on_linux.md).

## Code Layout

[base/](../iree/base/)

*   Common types and utilities used throughout IREE

[compiler/](../iree/compiler/)

*   IREE's MLIR dialect, LLVM compiler passes, IREE module translation, etc.

[hal/](../iree/hal/)

*   **H**ardware **A**bstraction **L**ayer for IREE's runtime, containing
    implementations for different hardware and software backends

[rt/](../iree/rt/)

*   **R**un**t**ime API for interfacing with IREE

[schemas/](../iree/schemas/)

*   Shared data storage format definitions, primarily using
    [FlatBuffers](https://google.github.io/flatbuffers/)

[tools/](../iree/tools/)

*   Assorted tools used to optimize, translate, and evaluate IREE, including
    IREE's debugger

[vm/](../iree/vm/)

*   Bytecode **V**irtual **M**achine used to work with IREE modules and provide
    an interface for hosting applications to invoke IREE functions

## Working with IREE's Components

IREE ingests MLIR in a high-level dialect like
[XLA/HLO](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/compiler/mlir/xla),
after which it can perform its own compiler passes to eventually translate the
IR into an 'IREE module', which can be executed via IREE's runtime. IREE
contains programs for running each step in that pipeline under various
configurations (e.g. for tests, with a debugger attached, etc.).

### iree-opt

The `iree-opt` program invokes
[MlirOptMain](https://github.com/tensorflow/mlir/blob/master/lib/Support/MlirOptMain.cpp)
to run some set of IREE's optimization passes on a provided .mlir input file.
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.

For example, to run some passes on the
[reshape.mlir](../iree/compiler/Translation/SPIRV/test/reshape.mlir) test file
with Bazel on Linux, use this command:

```shell
$ bazel run //iree/tools:iree-opt -- \
  -split-input-file \
  -convert-iree-to-spirv \
  -simplify-spirv-affine-exprs=false \
  -verify-diagnostics \
  $PWD/iree/compiler/Translation/SPIRV/test/reshape.mlir
```

### iree-translate

The `iree-translate` program invokes
[mlir-translate](https://github.com/tensorflow/mlir/blob/master/tools/mlir-translate/mlir-translate.cpp)
to translate from a .mlir input file into an IREE module.

For example, to translate `simple_compute_test.mlir` to an IREE module with
Bazel on Linux, use this command:

```shell
$ bazel run //iree/tools:iree-translate -- \
  -mlir-to-iree-module \
  $PWD/iree/samples/hal/simple_compute_test.mlir \
  -o /tmp/module.fb
```

### 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-translate` to translate a .mlir
file to an IREE module and then execute it. Here is an example command that runs
the `simple_mul` function in `simple_compute_test.mlir`.

```shell
$ bazel build -c opt //iree/tools:iree-translate //iree/tools:iree-run-module
$ ./bazel-bin/iree/tools/iree-run-module \
  --main_module=/tmp/module.fb \
  --main_function=simple_mul \
  --input_values="4xf32=1 2 3 4
                  4xf32=5 6 7 8"
```

### 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.

For example, to execute the contents of a test .mlir file, use this command:

```shell
$ bazel run //iree/tools:iree-run-mlir -- $PWD/test/e2e/scalars.mlir
```
