|  | # Experimental MetaProgramming + MLIR JIT | 
|  |  | 
|  | The purpose of this directory is to demonstrate C++ metaprogramming features | 
|  | that are available in MLIR core. At a high-level, metaprogramming can be | 
|  | interpreted as "programming with a level of indirection". | 
|  |  | 
|  | This experimental `mlir::ModelBuilder` is used to generate operations using the | 
|  | [Linalg Dialect](https://mlir.llvm.org/docs/Dialects/Linalg/). | 
|  |  | 
|  | This exposes the `mlir::edsc::ValueHandle` and `mlir::edsc::StructuredIndexed` | 
|  | classes and other functionality into an `mlir::ModelBuilder`. to build an MLIR | 
|  | function for a whole model (in the case of the [TestMNISTJit](TestMNISTJit.cpp) | 
|  | example, a `3-MLP`). | 
|  |  | 
|  | The MLIR function can be compiled using MLIR passes and progressively lowered to | 
|  | LLVMIR. The `mlir::ModelRunner` then kicks in and produces an executable version | 
|  | in memory that can be called directly, by name, from the main function. | 
|  |  | 
|  | This allows writing a `3-MLP` test in C++, allocate some buffers, JIT-compile | 
|  | and run it end-to-end, as the test demonstrates. | 
|  |  | 
|  | Note that for the moment `mlir::ModelBuilder` does not perform any type of | 
|  | advanced transformations and basically only lowers LLVM, where LLVM tools (`opt` | 
|  | and `llc`) pick it up and apply their optimizations. | 
|  |  | 
|  | At this time this is only intended for prototyping and experimenting on vanilla | 
|  | Linux CPU targets. |