# IRDL

[paper (PDF)](https://dl.acm.org/doi/pdf/10.1145/3519939.3523700), [talk (youtube)](https://www.youtube.com/watch?v=uKXv1Cc_Pgs)
---
### Why?
Too many IRs!
```plaintext
Swift ----> SIL-IR --------+
|
C/C++ ---------------------+-----> LLVM ----> machine code
|
Rust ----> HIR ---> MIR --+
```
---
### (You are like little baby, watch this)
```plaintext
Swift ----> SIL-IR --------+
|
C/C++ ---------------------+-----> LLVM ----> machine code
| ^ ^
Rust ----> HIR ---> MIR --+ | |
| |
| |
Haskell --> Core --> STG ---> Cmm ---+--> NCG ---+
```
---
### On a smaller scale
```plaintext
LQC ---> Burn Semantics ---> Burn Assembly ---> TAC --+
|
|
|
Interpreted by Burninator <--- Burn Config <---+
```
---
### Usual Cost of Adding a New IR
* Custom IR
* Parser
* Printer
* Pass manager
* Dead code elimination
* Peephole optimizations
---
### Cost of Adding a New IR (for us)
* Custom IR
* ~~Parser~~
* Printer (probably, debugging)
* ~~Pass manager~~
* Dead code elimination _sometimes_
* Peephole optimizations _sometimes_
---
### Recent development: MLIR
_Multi-Level Intermediate Representation_
<img src="https://i.imgur.com/Ztwh8xX.png" width="600px" />
---
_Only problem you can't solve with more languages is too many languages_
---
### What MLIR Solves
* Custom IR
* ~~Parser~~
* ~~Printer~~
* ~~Pass manager~~
* ~~Dead code elim~~
* ~~Peephole optimizations~~
---
### Problem?
_gotta use C++_
<img src="https://i.imgur.com/U6xhwxN.png" width="400px" />
---
### Existing Solutions
* TableGen - legacy LLVM framework <!-- generic boilerplate, mostly backend -->
* ODS - Operator Definition Specification, used by MLIR, built on TableGen, incomplete
---
### (Proposed) Solution: IRDL
_IRDL: An IR Definition Language for SSA Compilers_
---
### Designed, Principled
* Everything is a Constraint or an Operation
* Types, Aliases => Constraints
* Instructions, Regions, Literals => Operations
---
_A collection of Constraints and Operations is a Dialect_
---
### Example: Complex Math
```c++
Dialect cmath {
Alias !FloatType = !AnyOf<!f32, !f64>
Type complex {
Parameters (elementType: !FloatType)
Summary "A complex number"
}
Operation mul {
ConstraintVar (!T: !complex<FloatType>)
Operands (lhs: !T, rhs: !T)
Results (res: !T)
Format "$lhs, $rhs : $T.elementType"
Summary "Multiply two complex numbers"
}
}
```
---
### Constraint Composition
Usual logical AND/OR/NOT
```c++
Alias NonZero = !And<int32_t, !Not<0 : int32_t>>
Alias Integer = !AnyOf<int32_t, int64_t>
Alias Float = !AnyOf<f32, f64>
Alias Number = !AnyOf<!Integer, !Float>
```
---
### Literals in Constraints
Limited use of literals and enums in constraints
```c++
Enum signedness { Signless, Signed, Unsigned }
Type integer {
Parameters (bitwidth: uint32_t, signed: signedness)
}
Alias signed_integer = !integer<uint32_t, signedness.Signed>
```
Dependent types, plz
---
### Control Flow
```c++
Operation range_loop_done {}
Operation range_loop {
Operands (start: !i32, stop: !i32, step: !i32)
Region body {
Arguments (i: !i32)
Terminator range_loop_done
}
}
```
`Terminator` means body must be a single BB
---
### Control Flow
```c++
Operation conditional_branch {
Operands (condition: !i1) // 1 bit bools are cute
Successors (true_branch, false_branch) // basic blocks
}
```
---
### C++ Escape Hatch
```c++
Constraint Size : uint32_t {
Summary "integer value between 0 and 32"
CppConstraint "$_self <= 32"
}
Type SizedVec {
Parameters (typ: !AnyType, size: Size)
}
Operation append_vec {
ConstraintVars (T: !AnyType)
Operands (lhs: SizedVec<T, Size>, rhs: SizedVec<T, Size>)
Results (res: SizedVec<T, Size>)
CppConstraint "$_self.lhs().size() +
$_self.rhs().size() == $_self.res().size()"
}
```
---
### Big Punchline
LLVM MLIR: 942 ops over 28 IR dialects
IRDL can represent 97% of them directly
The remainder require minimal C++
---
### Cool How Do I Use It
_Bad news_: [it's currently a branch in a fork of LLVM](https://github.com/opencompl/llvm-project/pull/1) :cry:
---
### Links
* [IRDL Paper](https://dl.acm.org/doi/pdf/10.1145/3519939.3523700)
* [PLDI Talk](https://www.youtube.com/watch?v=uKXv1Cc_Pgs), ~16 mins
* [IRDL @ MLIR Open Developer Meeting](https://www.youtube.com/watch?v=SlCXx5IFV40), ~1 hour
* [Older MLIR Paper](https://arxiv.org/pdf/2002.11054.pdf)
---
---
### Different Ways I've Typed IRDL Today
* IRDL
* IDRL
* IDLR
* IRBL
{"metaMigratedAt":"2023-06-17T12:52:43.687Z","metaMigratedFrom":"YAML","title":"IRDL: An IR Definition Language for SSA Compilers","breaks":true,"description":"View the slide with \"Slide Mode\".","contributors":"[{\"id\":\"c6e46a61-f54d-4860-911f-10882d5462ae\",\"add\":9317,\"del\":4212}]"}