Skip to content

Commit

Permalink
Fix graphviz module
Browse files Browse the repository at this point in the history
  • Loading branch information
Y-Nak committed Sep 25, 2024
1 parent ae15114 commit 15de8fd
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 68 deletions.
3 changes: 2 additions & 1 deletion crates/ir/src/func_cursor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,11 @@ pub trait FuncCursor {

fn remove_inst(&mut self, func: &mut Function) {
let inst_id = self.expect_inst();
let next_loc = self.next_loc(func);

func.dfg.untrack_inst(inst_id);
func.layout.remove_inst(inst_id);

let next_loc = self.next_loc(func);
self.set_location(next_loc);
}

Expand Down
2 changes: 1 addition & 1 deletion crates/ir/src/function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,6 @@ impl DisplayWithFunc for Signature {
let args_ty = args_ty.trim();
let ret_ty = DisplayableWithModule(ret_ty, func.ctx());

write!(formatter, "func {linkage} %{name}({args_ty} -> {ret_ty})")
write!(formatter, "func {linkage} %{name}({args_ty}) -> {ret_ty}")
}
}
20 changes: 16 additions & 4 deletions crates/ir/src/graphviz/block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ use std::fmt::Write;

use dot2::label;

use crate::{ir_writer::DisplayableWithFunc, BlockId, ControlFlowGraph, Function};
use crate::{
ir_writer::{DisplayableWithFunc, ValueWithTy},
BlockId, ControlFlowGraph, Function,
};

use super::function::DUMMY_BLOCK;

Expand Down Expand Up @@ -48,11 +51,20 @@ impl<'a> BlockNode<'a> {
// Write block body.
write!(label, r#"<tr><td align="left" balign="left">"#).unwrap();
for inst in layout.iter_inst(self.block) {
let mut inst_string = String::new();
if let Some(result) = self.func.dfg.inst_result(inst) {
let result_with_ty = ValueWithTy(result);
write!(
&mut inst_string,
"{} = ",
DisplayableWithFunc(result_with_ty, self.func)
)
.unwrap();
}
let inst = DisplayableWithFunc(inst, self.func);
let mut insn_string = String::new();
write!(&mut insn_string, "{}", inst).unwrap();
write!(&mut inst_string, "{inst};").unwrap();

write!(label, "{}", dot2::escape_html(&insn_string)).unwrap();
write!(label, "{}", dot2::escape_html(&inst_string)).unwrap();
write!(label, "<br/>").unwrap();
}
write!(label, r#"</td></tr>"#).unwrap();
Expand Down
114 changes: 54 additions & 60 deletions crates/ir/src/graphviz/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,78 +19,72 @@ pub fn render_to<W: io::Write>(func: &Function, output: &mut W) -> io::Result<()

#[cfg(test)]
mod test {

use macros::inst_set;

use crate::{
builder::test_util::test_func_builder,
inst::{
arith::Add,
control_flow::{Br, Jump, Phi, Return},
},
isa::Isa,
Type,
};

use super::*;

#[inst_set(InstKind = "TestInstKind")]
struct TestInstSet(Add, Return, Jump, Phi, Br);

#[test]
fn test_dump_ir() {
// let mut builder = test_func_builder(&[Type::I64], Type::Void);
// let is = TestInstSet::new();
//
// let entry_block = builder.append_block();
// let then_block = builder.append_block();
// let else_block = builder.append_block();
// let merge_block = builder.append_block();
//
// let arg0 = builder.args()[0];
//
// builder.switch_to_block(entry_block);
// let br = Br::new(&is, arg0, then_block, else_block);
// builder.insert_inst_no_result(br);
//
// builder.switch_to_block(then_block);
// let v1 = builder.make_imm_value(1i64);
// let jump = Jump::new(&is, merge_block);
// builder.insert_inst_no_result(jump);
//
// builder.switch_to_block(else_block);
// let v2 = builder.make_imm_value(2i64);
// let jump = Jump::new(&is, merge_block);
// builder.insert_inst_no_result(jump);
//
// builder.switch_to_block(merge_block);
// let phi = Phi::new(&is, vec![(v1, then_block), (v2, else_block)], Type::I64);
// let v3 = builder.insert_inst(phi, Type::I64);
// let add = Add::new(&is, v3, arg0);
// builder.insert_inst(add, Type::I64);
// let ret = Return::new(&is, None);
// builder.insert_inst_no_result(ret);
//
// builder.seal_all();
// let module = builder.finish().build();
// let func_ref = module.iter_functions().next().unwrap();
//
// let mut text = vec![];
// render_to(&module.funcs[func_ref], &mut text).unwrap();
// let text = String::from_utf8(text).unwrap();
//
// let expected = "digraph test_func {
// block3[label=<<table border=\"0\" cellborder=\"1\" cellspacing=\"0\"><tr><td bgcolor=\"gray\" align=\"center\" colspan=\"1\">block3</td></tr><tr><td align=\"left\" balign=\"left\">v3.i64 = phi (1.i64 block1) (2.i64 block2);<br/>v4.i64 = add v3 v0;<br/>ret;<br/></td></tr></table>>][shape=\"none\"];
// block2[label=<<table border=\"0\" cellborder=\"1\" cellspacing=\"0\"><tr><td bgcolor=\"gray\" align=\"center\" colspan=\"1\">block2</td></tr><tr><td align=\"left\" balign=\"left\">jump block3;<br/></td></tr></table>>][shape=\"none\"];
// block1[label=<<table border=\"0\" cellborder=\"1\" cellspacing=\"0\"><tr><td bgcolor=\"gray\" align=\"center\" colspan=\"1\">block1</td></tr><tr><td align=\"left\" balign=\"left\">jump block3;<br/></td></tr></table>>][shape=\"none\"];
// block0[label=<<table border=\"0\" cellborder=\"1\" cellspacing=\"0\"><tr><td bgcolor=\"gray\" align=\"center\" colspan=\"1\">block0</td></tr><tr><td align=\"left\" balign=\"left\">branch v0 block1 block2;<br/></td></tr></table>>][shape=\"none\"];
// dummy_block[label=\"func public %test_func(i64) -> ()\"][shape=\"none\"];
// dummy_block -> block0[label=\"\"][style=\"invis\"];
// block2 -> block3[label=\"2.i64\"];
// block1 -> block3[label=\"1.i64\"];
// block0 -> block1[label=\"\"];
// block0 -> block2[label=\"\"];
//}
//";
// assert_eq!(text, expected);
let (evm, mut builder) = test_func_builder(&[Type::I64], Type::Void);
let is = evm.inst_set();

let entry_block = builder.append_block();
let then_block = builder.append_block();
let else_block = builder.append_block();
let merge_block = builder.append_block();

let arg0 = builder.args()[0];

builder.switch_to_block(entry_block);
let br = Br::new(is, arg0, then_block, else_block);
builder.insert_inst_no_result(br);

builder.switch_to_block(then_block);
let v1 = builder.make_imm_value(1i64);
let jump = Jump::new(is, merge_block);
builder.insert_inst_no_result(jump);

builder.switch_to_block(else_block);
let v2 = builder.make_imm_value(2i64);
let jump = Jump::new(is, merge_block);
builder.insert_inst_no_result(jump);

builder.switch_to_block(merge_block);
let phi = Phi::new(is, vec![(v1, then_block), (v2, else_block)], Type::I64);
let v3 = builder.insert_inst(phi, Type::I64);
let add = Add::new(is, v3, arg0);
builder.insert_inst(add, Type::I64);
let ret = Return::new(is, None);
builder.insert_inst_no_result(ret);

builder.seal_all();
let module = builder.finish().build();
let func_ref = module.iter_functions().next().unwrap();

let mut text = vec![];
render_to(&module.funcs[func_ref], &mut text).unwrap();
let text = String::from_utf8(text).unwrap();
let expected = "digraph test_func {
block3[label=<<table border=\"0\" cellborder=\"1\" cellspacing=\"0\"><tr><td bgcolor=\"gray\" align=\"center\" colspan=\"1\">block3</td></tr><tr><td align=\"left\" balign=\"left\">v3.i64 = phi (1.i64 block1) (2.i64 block2);<br/>v4.i64 = add v3 v0;<br/>return;<br/></td></tr></table>>][shape=\"none\"];
block2[label=<<table border=\"0\" cellborder=\"1\" cellspacing=\"0\"><tr><td bgcolor=\"gray\" align=\"center\" colspan=\"1\">block2</td></tr><tr><td align=\"left\" balign=\"left\">jump block3;<br/></td></tr></table>>][shape=\"none\"];
block1[label=<<table border=\"0\" cellborder=\"1\" cellspacing=\"0\"><tr><td bgcolor=\"gray\" align=\"center\" colspan=\"1\">block1</td></tr><tr><td align=\"left\" balign=\"left\">jump block3;<br/></td></tr></table>>][shape=\"none\"];
block0[label=<<table border=\"0\" cellborder=\"1\" cellspacing=\"0\"><tr><td bgcolor=\"gray\" align=\"center\" colspan=\"1\">block0</td></tr><tr><td align=\"left\" balign=\"left\">br v0 block1 block2;<br/></td></tr></table>>][shape=\"none\"];
dummy_block[label=\"func public %test_func(i64) -> void\"][shape=\"none\"];
dummy_block -> block0[label=\"\"][style=\"invis\"];
block2 -> block3[label=\"2.i64\"];
block1 -> block3[label=\"1.i64\"];
block0 -> block1[label=\"\"];
block0 -> block2[label=\"\"];
}
";
assert_eq!(text, expected);
}
}
4 changes: 2 additions & 2 deletions crates/ir/src/ir_writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ impl<'a> FuncDisplayHelper<'a> {
Self { func, level: 0 }
}

fn display(&mut self, mut f: &mut fmt::Formatter) -> fmt::Result {
fn display(&mut self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_fmt(format_args!(
"func {} %{}(",
self.func.sig.linkage(),
Expand Down Expand Up @@ -185,7 +185,7 @@ where
}

#[derive(Clone)]
struct ValueWithTy(ValueId);
pub(super) struct ValueWithTy(pub(super) ValueId);

impl DisplayWithFunc for ValueWithTy {
fn fmt(&self, func: &Function, formatter: &mut fmt::Formatter) -> fmt::Result {
Expand Down

0 comments on commit 15de8fd

Please sign in to comment.