This directory contains IREE's main MLIR-based compiler.
A few paths of interest include:
└── compiler/src/iree/compiler/
├── API/ (C and Python APIs)
├── Bindings/ (used to generate different ABI bindings)
├── Codegen/ (device code generation for assorted APIs)
├── ConstEval/ (JIT eval using the compiler+runtime to optimize constants)
├── Dialect/
│ ├── Flow/ (tensor program modeling and compute workload partitioning)
│ ├── HAL/ (Hardware Abstraction Layer for buffer and execution management)
│ │ └── Target/
│ │ ├── LLVM/
│ │ ├── VMVX/
│ │ ├── VulkanSPIRV/
│ │ └── etc.
│ ├── Stream/ (device placement and asynchronous scheduling)
│ ├── Util/ (common types across other IREE dialects)
│ └── VM/ (abstract Virtual Machine)
├── InputConversion/ (conversions from frontend/input dialects)
└── Translation/ (translation pipeline definitions)
Noteworthy compiler components not included here include:
├── compiler/plugins/
│ └── input/ (Input dialect support plugins)
│ └── target/ (HAL target backend plugins)
└── llvm-external-projects/
└── iree-dialects/ (IREE dialects for other projects to target)
Additional input/target/etc. plugins may also be defined out-of-tree.
The general flow of data from a frontend framework down to a compiled program is:
program written in framework
|
| import tool
V
imported .mlir file
|
| main IREE compiler
V
compiled program
where import tools live outside of the compiler/ directory (and possibly outside of the IREE repo itself).
Refer to IREE's presentations and talks and this architecture diagram for details on how the pieces fit together:
The compiler/ directory uses clang-format with (mostly) the LLVM style, unlike the runtime/ directory which uses the Google style.
Read more: