diff --git a/lesson3/brench_no_args.toml b/lesson3/brench_no_args.toml new file mode 100644 index 0000000..24224b6 --- /dev/null +++ b/lesson3/brench_no_args.toml @@ -0,0 +1,21 @@ +extract = 'total_dyn_inst: (\d+)' +timeout = 200 + +[runs.baseline] +pipeline = ["bril2json", "brili -p"] + +[runs.tdce] +pipeline = ["bril2json", "../target/debug/tdce", "bril2json", "brili -p"] + +[runs.lvn] +pipeline = ["bril2json", "../target/debug/lvn", "bril2json", "brili -p"] + +[runs.lvn_then_tdce] +pipeline = [ + "bril2json", + "../target/debug/lvn", + "bril2json", + "../target/debug/tdce", + "bril2json", + "brili -p", +] diff --git a/lesson3/lvn/src/main.rs b/lesson3/lvn/src/main.rs index 56abe56..355df4e 100644 --- a/lesson3/lvn/src/main.rs +++ b/lesson3/lvn/src/main.rs @@ -13,7 +13,7 @@ struct Opts { input: Option, } -#[derive(PartialEq, Eq, Hash, Clone)] +#[derive(PartialEq, Eq, Hash, Clone, PartialOrd, Ord)] enum OpArg { Value(usize), Unknown(String), @@ -244,7 +244,7 @@ pub fn lvn(block: &mut BasicBlock) { } => { let is_overwritten = last_assignment.get(dest).copied().unwrap() > i; - let new_args = args + let mut new_args = args .iter() .map(|arg| { table @@ -253,6 +253,21 @@ pub fn lvn(block: &mut BasicBlock) { .unwrap_or(OpArg::Unknown(arg.clone())) }) .collect::>(); + if matches!( + op, + ValueOps::Add + | ValueOps::Fadd + | ValueOps::Mul + | ValueOps::Fmul + | ValueOps::Eq + | ValueOps::Feq + | ValueOps::And + | ValueOps::Or + | ValueOps::Ceq + | ValueOps::Phi + ) { + new_args.sort(); + } match table.add_value_and_get_existing_variable( Value::Op(*op, new_args.clone()), dest,