MLIR DAG rewriter w/ SSA IR, dominance and CFG analysis passes
1open Ir
2
3let string_of_inst = function
4 | Alloca a -> Printf.sprintf "alloca %d" a
5 | Load (r, p) -> Printf.sprintf "load %d, %d" r p
6 | Store (v, p) -> Printf.sprintf "store %d, %d" v p
7 | Phi (r, ops) ->
8 let ops_str = List.map (fun (v, b) -> Printf.sprintf "(%d, %d)" v b) ops |> String.concat ", " in
9 Printf.sprintf "phi %d [%s]" r ops_str
10 | Move (r, v) -> Printf.sprintf "move %d, %d" r v
11 | BinOp (r, v1, v2) -> Printf.sprintf "binop %d, %d, %d" r v1 v2
12 | Ret None -> "ret"
13 | Ret (Some v) -> Printf.sprintf "ret %d" v
14 | Br t -> Printf.sprintf "br %d" t
15 | CondBr (c, t1, t2) -> Printf.sprintf "condbr %d, %d, %d" c t1 t2
16
17let print_block b =
18 Printf.printf "block %d:\n" b.id;
19 List.iter (fun i -> Printf.printf " %s\n" (string_of_inst i)) b.insts
20
21let print_func f =
22 List.iter print_block f.blocks