open Ir let string_of_inst = function | Alloca a -> Printf.sprintf "alloca %d" a | Load (r, p) -> Printf.sprintf "load %d, %d" r p | Store (v, p) -> Printf.sprintf "store %d, %d" v p | Phi (r, ops) -> let ops_str = List.map (fun (v, b) -> Printf.sprintf "(%d, %d)" v b) ops |> String.concat ", " in Printf.sprintf "phi %d [%s]" r ops_str | Move (r, v) -> Printf.sprintf "move %d, %d" r v | BinOp (r, v1, v2) -> Printf.sprintf "binop %d, %d, %d" r v1 v2 | Ret None -> "ret" | Ret (Some v) -> Printf.sprintf "ret %d" v | Br t -> Printf.sprintf "br %d" t | CondBr (c, t1, t2) -> Printf.sprintf "condbr %d, %d, %d" c t1 t2 let print_block b = Printf.printf "block %d:\n" b.id; List.iter (fun i -> Printf.printf " %s\n" (string_of_inst i)) b.insts let print_func f = List.iter print_block f.blocks