From 8732b1c36f1aba3d4dedbeac2f4172c740340db4 Mon Sep 17 00:00:00 2001 From: Russel Arbore <russel.jma@gmail.com> Date: Thu, 6 Feb 2025 10:43:10 -0600 Subject: [PATCH 1/4] SimplifyCFG pass --- hercules_opt/src/ccp.rs | 65 --------------------- hercules_opt/src/lib.rs | 2 + hercules_opt/src/simplify_cfg.rs | 99 ++++++++++++++++++++++++++++++++ juno_scheduler/src/compile.rs | 1 + juno_scheduler/src/default.rs | 6 +- juno_scheduler/src/ir.rs | 1 + juno_scheduler/src/pm.rs | 18 ++++++ 7 files changed, 126 insertions(+), 66 deletions(-) create mode 100644 hercules_opt/src/simplify_cfg.rs diff --git a/hercules_opt/src/ccp.rs b/hercules_opt/src/ccp.rs index 9768198c..b8fa9284 100644 --- a/hercules_opt/src/ccp.rs +++ b/hercules_opt/src/ccp.rs @@ -333,71 +333,6 @@ pub fn ccp(editor: &mut FunctionEditor, reverse_postorder: &Vec<NodeID>) { } Ok(edit) }); - - // Step 4: collapse region chains. - collapse_region_chains(editor); -} - -/* - * Top level function to collapse region chains. A chain is a list of at least - * one region node that takes only one control input. Region chains can be - * deleted. The use of the head of the chain can turn into the use by the user - * of the tail of the chain. - */ -pub fn collapse_region_chains(editor: &mut FunctionEditor) { - let num_nodes = editor.func().nodes.len(); - // Loop over all region nodes. It's fine to modify the function as we loop - // over it. - for id in (0..num_nodes).map(NodeID::new) { - if let Node::Region { preds } = &editor.func().nodes[id.idx()] { - let has_call_user = editor - .get_users(id) - .any(|x| editor.func().nodes[x.idx()].is_call()); - - if preds.len() == 1 && !has_call_user { - // Step 1: bridge gap between use and user. - let predecessor = preds[0]; - let successor = editor - .get_users(id) - .filter(|x| !editor.func().nodes[x.idx()].is_phi()) - .next() - .expect("Region node doesn't have a non-phi user."); - - editor.edit(|edit| { - // Set successor's use of this region to use the region's use. - edit.replace_all_uses_where(id, predecessor, |n| *n == successor) - }); - - // Step 2: bridge gap between uses and users of corresponding - // phi nodes. - let phis: Vec<NodeID> = editor - .get_users(id) - .filter(|x| editor.func().nodes[x.idx()].is_phi()) - .collect(); - for phi_id in phis { - let data_uses = - if let Node::Phi { control, data } = &editor.func().nodes[phi_id.idx()] { - assert!(*control == id); - data - } else { - panic!() - }; - assert!(data_uses.len() == 1, "Phi node doesn't have exactly one data use, while corresponding region had exactly one control use."); - let predecessor = data_uses[0]; - - editor.edit(|mut edit| { - // Set successors' use of this phi to use the phi's use. - edit = edit.replace_all_uses(phi_id, predecessor)?; - // Delete this phi. - edit.delete_node(phi_id) - }); - } - - // Delete this region. - editor.edit(|edit| edit.delete_node(id)); - } - } - } } fn ccp_flow_function( diff --git a/hercules_opt/src/lib.rs b/hercules_opt/src/lib.rs index 48475f2f..7187508a 100644 --- a/hercules_opt/src/lib.rs +++ b/hercules_opt/src/lib.rs @@ -19,6 +19,7 @@ pub mod outline; pub mod phi_elim; pub mod pred; pub mod schedule; +pub mod simplify_cfg; pub mod slf; pub mod sroa; pub mod unforkify; @@ -43,6 +44,7 @@ pub use crate::outline::*; pub use crate::phi_elim::*; pub use crate::pred::*; pub use crate::schedule::*; +pub use crate::simplify_cfg::*; pub use crate::slf::*; pub use crate::sroa::*; pub use crate::unforkify::*; diff --git a/hercules_opt/src/simplify_cfg.rs b/hercules_opt/src/simplify_cfg.rs new file mode 100644 index 00000000..2e19e6c0 --- /dev/null +++ b/hercules_opt/src/simplify_cfg.rs @@ -0,0 +1,99 @@ +use std::collections::HashMap; + +use hercules_ir::*; + +use crate::*; + +/* + * Top level function to simplify control flow in a Hercules function. + */ +pub fn simplify_cfg(editor: &mut FunctionEditor, fork_join_map: &HashMap<NodeID, NodeID>) { + // Collapse region chains. + collapse_region_chains(editor); + + // Get rid of unnecessary fork-joins. + remove_useless_fork_joins(editor, fork_join_map); +} + +/* + * Function to collapse region chains. A chain is a list of at least one region + * node that takes only one control input. Region chains can be deleted. The use + * of the head of the chain can turn into the use by the user of the tail of the + * chain. + */ +fn collapse_region_chains(editor: &mut FunctionEditor) { + // Loop over all region nodes. + for id in editor.node_ids() { + if let Node::Region { preds } = &editor.func().nodes[id.idx()] { + let has_call_user = editor + .get_users(id) + .any(|x| editor.func().nodes[x.idx()].is_call()); + + if preds.len() == 1 && !has_call_user { + // Step 1: bridge gap between use and user. + let predecessor = preds[0]; + let successor = editor + .get_users(id) + .filter(|x| !editor.func().nodes[x.idx()].is_phi()) + .next() + .expect("Region node doesn't have a non-phi user."); + + editor.edit(|edit| { + // Set successor's use of this region to use the region's use. + edit.replace_all_uses_where(id, predecessor, |n| *n == successor) + }); + + // Step 2: bridge gap between uses and users of corresponding + // phi nodes. + let phis: Vec<NodeID> = editor + .get_users(id) + .filter(|x| editor.func().nodes[x.idx()].is_phi()) + .collect(); + for phi_id in phis { + let data_uses = + if let Node::Phi { control, data } = &editor.func().nodes[phi_id.idx()] { + assert!(*control == id); + data + } else { + panic!() + }; + assert!(data_uses.len() == 1, "Phi node doesn't have exactly one data use, while corresponding region had exactly one control use."); + let predecessor = data_uses[0]; + + editor.edit(|mut edit| { + // Set successors' use of this phi to use the phi's use. + edit = edit.replace_all_uses(phi_id, predecessor)?; + // Delete this phi. + edit.delete_node(phi_id) + }); + } + + // Delete this region. + editor.edit(|edit| edit.delete_node(id)); + } + } + } +} + +/* + * Function to remove unused fork-joins. A fork-join is unused if there are no + * reduce users of the join node. In such situations, it is asserted there are + * no thread ID users of the fork as well. + */ +fn remove_useless_fork_joins(editor: &mut FunctionEditor, fork_join_map: &HashMap<NodeID, NodeID>) { + for (fork, join) in fork_join_map { + if editor.get_users(*join).len() == 1 { + assert_eq!(editor.get_users(*fork).len(), 1); + + let fork_use = get_uses(&editor.func().nodes[fork.idx()]).as_ref()[0]; + let join_use = get_uses(&editor.func().nodes[join.idx()]).as_ref()[0]; + + editor.edit(|mut edit| { + edit = edit.replace_all_uses(*join, join_use)?; + edit = edit.replace_all_uses(*fork, fork_use)?; + edit = edit.delete_node(*fork)?; + edit.delete_node(*join) + }); + } + } +} diff --git a/juno_scheduler/src/compile.rs b/juno_scheduler/src/compile.rs index 713c30d4..123111b8 100644 --- a/juno_scheduler/src/compile.rs +++ b/juno_scheduler/src/compile.rs @@ -115,6 +115,7 @@ impl FromStr for Appliable { "outline" => Ok(Appliable::Pass(ir::Pass::Outline)), "phi-elim" => Ok(Appliable::Pass(ir::Pass::PhiElim)), "predication" => Ok(Appliable::Pass(ir::Pass::Predication)), + "simplify-cfg" => Ok(Appliable::Pass(ir::Pass::SimplifyCFG)), "slf" | "store-load-forward" => Ok(Appliable::Pass(ir::Pass::SLF)), "sroa" => Ok(Appliable::Pass(ir::Pass::SROA)), "unforkify" => Ok(Appliable::Pass(ir::Pass::Unforkify)), diff --git a/juno_scheduler/src/default.rs b/juno_scheduler/src/default.rs index d1f139db..faccd5aa 100644 --- a/juno_scheduler/src/default.rs +++ b/juno_scheduler/src/default.rs @@ -46,6 +46,7 @@ pub fn default_schedule() -> ScheduleStmt { PhiElim, DCE, CCP, + SimplifyCFG, DCE, GVN, DCE, @@ -59,6 +60,7 @@ pub fn default_schedule() -> ScheduleStmt { Predication, DCE, CCP, + SimplifyCFG, DCE, GVN, DCE, @@ -72,8 +74,10 @@ pub fn default_schedule() -> ScheduleStmt { DCE, ForkSplit, Unforkify, - GVN, + CCP, + SimplifyCFG, DCE, + GVN, DCE, AutoOutline, InterproceduralSROA, diff --git a/juno_scheduler/src/ir.rs b/juno_scheduler/src/ir.rs index 9e85509f..e8cc2d39 100644 --- a/juno_scheduler/src/ir.rs +++ b/juno_scheduler/src/ir.rs @@ -23,6 +23,7 @@ pub enum Pass { Outline, PhiElim, Predication, + SimplifyCFG, SLF, SROA, Unforkify, diff --git a/juno_scheduler/src/pm.rs b/juno_scheduler/src/pm.rs index 901361c6..7d9687f6 100644 --- a/juno_scheduler/src/pm.rs +++ b/juno_scheduler/src/pm.rs @@ -1946,6 +1946,24 @@ fn run_pass( pm.delete_gravestones(); pm.clear_analyses(); } + Pass::SimplifyCFG => { + assert!(args.is_empty()); + pm.make_fork_join_maps(); + let fork_join_maps = pm.fork_join_maps.take().unwrap(); + + for (func, fork_join_map) in build_selection(pm, selection) + .into_iter() + .zip(fork_join_maps.iter()) + { + let Some(mut func) = func else { + continue; + }; + simplify_cfg(&mut func, fork_join_map); + changed |= func.modified(); + } + pm.delete_gravestones(); + pm.clear_analyses(); + } Pass::SROA => { assert!(args.is_empty()); pm.make_reverse_postorders(); -- GitLab From 7a744b2a9ff921afe70e6eccb4e354fd36ddfd5f Mon Sep 17 00:00:00 2001 From: Russel Arbore <russel.jma@gmail.com> Date: Thu, 6 Feb 2025 10:48:32 -0600 Subject: [PATCH 2/4] reorganize control tests --- Cargo.toml | 2 +- juno_samples/{nested_ccp => control}/Cargo.toml | 4 ++-- juno_samples/{nested_ccp => control}/build.rs | 4 ++-- .../{nested_ccp/src/nested_ccp.jn => control/src/control.jn} | 0 juno_samples/{nested_ccp => control}/src/gpu.sch | 0 juno_samples/{nested_ccp => control}/src/main.rs | 4 ++-- juno_samples/{ => unused}/complex_tuple.jn | 0 juno_samples/{ => unused}/cpu.sch | 0 juno_samples/{ => unused}/gpu.sch | 0 juno_samples/{ => unused}/intrinsics1.jn | 0 juno_samples/{ => unused}/intrinsics2.jn | 0 juno_samples/{ => unused}/intrinsics3.jn | 0 juno_samples/{ => unused}/matadd.jn | 0 juno_samples/{ => unused}/nested_ccp.jn | 0 juno_samples/{ => unused}/poly_matmul.jn | 0 juno_samples/{ => unused}/products.jn | 0 juno_samples/{ => unused}/simple1.jn | 0 juno_samples/{ => unused}/simple1_withcall.jn | 0 juno_samples/{ => unused}/simple2.jn | 0 juno_samples/{ => unused}/test1.jn | 0 juno_samples/{ => unused}/vecadd.jn | 0 21 files changed, 7 insertions(+), 7 deletions(-) rename juno_samples/{nested_ccp => control}/Cargo.toml (88%) rename juno_samples/{nested_ccp => control}/build.rs (81%) rename juno_samples/{nested_ccp/src/nested_ccp.jn => control/src/control.jn} (100%) rename juno_samples/{nested_ccp => control}/src/gpu.sch (100%) rename juno_samples/{nested_ccp => control}/src/main.rs (96%) rename juno_samples/{ => unused}/complex_tuple.jn (100%) rename juno_samples/{ => unused}/cpu.sch (100%) rename juno_samples/{ => unused}/gpu.sch (100%) rename juno_samples/{ => unused}/intrinsics1.jn (100%) rename juno_samples/{ => unused}/intrinsics2.jn (100%) rename juno_samples/{ => unused}/intrinsics3.jn (100%) rename juno_samples/{ => unused}/matadd.jn (100%) rename juno_samples/{ => unused}/nested_ccp.jn (100%) rename juno_samples/{ => unused}/poly_matmul.jn (100%) rename juno_samples/{ => unused}/products.jn (100%) rename juno_samples/{ => unused}/simple1.jn (100%) rename juno_samples/{ => unused}/simple1_withcall.jn (100%) rename juno_samples/{ => unused}/simple2.jn (100%) rename juno_samples/{ => unused}/test1.jn (100%) rename juno_samples/{ => unused}/vecadd.jn (100%) diff --git a/Cargo.toml b/Cargo.toml index 890d7924..54cfc512 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,7 @@ members = [ "juno_samples/patterns", "juno_samples/matmul", "juno_samples/casts_and_intrinsics", - "juno_samples/nested_ccp", + "juno_samples/control", "juno_samples/antideps", "juno_samples/implicit_clone", "juno_samples/cava", diff --git a/juno_samples/nested_ccp/Cargo.toml b/juno_samples/control/Cargo.toml similarity index 88% rename from juno_samples/nested_ccp/Cargo.toml rename to juno_samples/control/Cargo.toml index 5ee3f747..4a882327 100644 --- a/juno_samples/nested_ccp/Cargo.toml +++ b/juno_samples/control/Cargo.toml @@ -1,11 +1,11 @@ [package] -name = "juno_nested_ccp" +name = "juno_control" version = "0.1.0" authors = ["Russel Arbore <rarbore2@illinois.edu>"] edition = "2021" [[bin]] -name = "juno_nested_ccp" +name = "juno_control" path = "src/main.rs" [features] diff --git a/juno_samples/nested_ccp/build.rs b/juno_samples/control/build.rs similarity index 81% rename from juno_samples/nested_ccp/build.rs rename to juno_samples/control/build.rs index 074937e7..33f9f18b 100644 --- a/juno_samples/nested_ccp/build.rs +++ b/juno_samples/control/build.rs @@ -4,7 +4,7 @@ fn main() { #[cfg(not(feature = "cuda"))] { JunoCompiler::new() - .file_in_src("nested_ccp.jn") + .file_in_src("control.jn") .unwrap() .build() .unwrap(); @@ -12,7 +12,7 @@ fn main() { #[cfg(feature = "cuda")] { JunoCompiler::new() - .file_in_src("nested_ccp.jn") + .file_in_src("control.jn") .unwrap() .schedule_in_src("gpu.sch") .unwrap() diff --git a/juno_samples/nested_ccp/src/nested_ccp.jn b/juno_samples/control/src/control.jn similarity index 100% rename from juno_samples/nested_ccp/src/nested_ccp.jn rename to juno_samples/control/src/control.jn diff --git a/juno_samples/nested_ccp/src/gpu.sch b/juno_samples/control/src/gpu.sch similarity index 100% rename from juno_samples/nested_ccp/src/gpu.sch rename to juno_samples/control/src/gpu.sch diff --git a/juno_samples/nested_ccp/src/main.rs b/juno_samples/control/src/main.rs similarity index 96% rename from juno_samples/nested_ccp/src/main.rs rename to juno_samples/control/src/main.rs index b364c03c..39cb8014 100644 --- a/juno_samples/nested_ccp/src/main.rs +++ b/juno_samples/control/src/main.rs @@ -4,7 +4,7 @@ use hercules_rt::CUDABox; use hercules_rt::{runner, HerculesCPURef, HerculesCPURefMut}; -juno_build::juno!("nested_ccp"); +juno_build::juno!("control"); fn main() { async_std::task::block_on(async { @@ -39,6 +39,6 @@ fn main() { } #[test] -fn nested_ccp_test() { +fn control_test() { main(); } diff --git a/juno_samples/complex_tuple.jn b/juno_samples/unused/complex_tuple.jn similarity index 100% rename from juno_samples/complex_tuple.jn rename to juno_samples/unused/complex_tuple.jn diff --git a/juno_samples/cpu.sch b/juno_samples/unused/cpu.sch similarity index 100% rename from juno_samples/cpu.sch rename to juno_samples/unused/cpu.sch diff --git a/juno_samples/gpu.sch b/juno_samples/unused/gpu.sch similarity index 100% rename from juno_samples/gpu.sch rename to juno_samples/unused/gpu.sch diff --git a/juno_samples/intrinsics1.jn b/juno_samples/unused/intrinsics1.jn similarity index 100% rename from juno_samples/intrinsics1.jn rename to juno_samples/unused/intrinsics1.jn diff --git a/juno_samples/intrinsics2.jn b/juno_samples/unused/intrinsics2.jn similarity index 100% rename from juno_samples/intrinsics2.jn rename to juno_samples/unused/intrinsics2.jn diff --git a/juno_samples/intrinsics3.jn b/juno_samples/unused/intrinsics3.jn similarity index 100% rename from juno_samples/intrinsics3.jn rename to juno_samples/unused/intrinsics3.jn diff --git a/juno_samples/matadd.jn b/juno_samples/unused/matadd.jn similarity index 100% rename from juno_samples/matadd.jn rename to juno_samples/unused/matadd.jn diff --git a/juno_samples/nested_ccp.jn b/juno_samples/unused/nested_ccp.jn similarity index 100% rename from juno_samples/nested_ccp.jn rename to juno_samples/unused/nested_ccp.jn diff --git a/juno_samples/poly_matmul.jn b/juno_samples/unused/poly_matmul.jn similarity index 100% rename from juno_samples/poly_matmul.jn rename to juno_samples/unused/poly_matmul.jn diff --git a/juno_samples/products.jn b/juno_samples/unused/products.jn similarity index 100% rename from juno_samples/products.jn rename to juno_samples/unused/products.jn diff --git a/juno_samples/simple1.jn b/juno_samples/unused/simple1.jn similarity index 100% rename from juno_samples/simple1.jn rename to juno_samples/unused/simple1.jn diff --git a/juno_samples/simple1_withcall.jn b/juno_samples/unused/simple1_withcall.jn similarity index 100% rename from juno_samples/simple1_withcall.jn rename to juno_samples/unused/simple1_withcall.jn diff --git a/juno_samples/simple2.jn b/juno_samples/unused/simple2.jn similarity index 100% rename from juno_samples/simple2.jn rename to juno_samples/unused/simple2.jn diff --git a/juno_samples/test1.jn b/juno_samples/unused/test1.jn similarity index 100% rename from juno_samples/test1.jn rename to juno_samples/unused/test1.jn diff --git a/juno_samples/vecadd.jn b/juno_samples/unused/vecadd.jn similarity index 100% rename from juno_samples/vecadd.jn rename to juno_samples/unused/vecadd.jn -- GitLab From 1e8ca1f173c2164236e4b443e8b0375a3f26570a Mon Sep 17 00:00:00 2001 From: Russel Arbore <russel.jma@gmail.com> Date: Thu, 6 Feb 2025 11:15:25 -0600 Subject: [PATCH 3/4] Test simplify-cfg, put fork opts back in default schedule --- Cargo.lock | 20 ++++++++++---------- hercules_cg/src/cpu.rs | 2 +- hercules_opt/src/ccp.rs | 7 ++----- juno_samples/control/src/control.jn | 17 +++++++++++++++++ juno_scheduler/src/default.rs | 9 ++++++--- 5 files changed, 36 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e761361b..06ee00ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1118,6 +1118,16 @@ dependencies = [ "with_builtin_macros", ] +[[package]] +name = "juno_control" +version = "0.1.0" +dependencies = [ + "async-std", + "hercules_rt", + "juno_build", + "with_builtin_macros", +] + [[package]] name = "juno_edge_detection" version = "0.1.0" @@ -1179,16 +1189,6 @@ dependencies = [ "with_builtin_macros", ] -[[package]] -name = "juno_nested_ccp" -version = "0.1.0" -dependencies = [ - "async-std", - "hercules_rt", - "juno_build", - "with_builtin_macros", -] - [[package]] name = "juno_patterns" version = "0.1.0" diff --git a/hercules_cg/src/cpu.rs b/hercules_cg/src/cpu.rs index f6a1f309..4f8f91ef 100644 --- a/hercules_cg/src/cpu.rs +++ b/hercules_cg/src/cpu.rs @@ -719,7 +719,7 @@ impl<'a> CPUContext<'a> { ); write!( body, - " {} = call i64 @llvm.umax.i64(i64{},i64%dc{}))\n", + " {} = call i64 @llvm.umax.i64(i64{},i64%dc{})\n", new_val, cur_value, x.idx() diff --git a/hercules_opt/src/ccp.rs b/hercules_opt/src/ccp.rs index b8fa9284..1969430a 100644 --- a/hercules_opt/src/ccp.rs +++ b/hercules_opt/src/ccp.rs @@ -347,7 +347,7 @@ fn ccp_flow_function( CCPLattice::meet(&val, &inputs[id.idx()]) }), // If node has only one output, if doesn't directly handle crossover of - // reachability and constant propagation. Read handles that. + // reachability and constant propagation. Projection handles that. Node::If { control, cond: _ } => inputs[control.idx()].clone(), Node::Match { control, sum: _ } => inputs[control.idx()].clone(), Node::Fork { @@ -674,10 +674,7 @@ fn ccp_flow_function( { ConstantLattice::top() } else { - ConstantLattice::meet( - first_constant, - &ConstantLattice::meet(second_constant, third_constant), - ) + ConstantLattice::meet(second_constant, third_constant) }; CCPLattice { diff --git a/juno_samples/control/src/control.jn b/juno_samples/control/src/control.jn index aed4e297..d6687327 100644 --- a/juno_samples/control/src/control.jn +++ b/juno_samples/control/src/control.jn @@ -38,3 +38,20 @@ fn no_underflow() -> usize { return res; } + +#[entry] +fn useless_control(arg: f32) -> f32 { + let x : f32; + if arg > 0.0 { + x = 7.0; + } else { + x = 9.0 - 2.0; + } + for i = 0 to 1 { + x += arg; + } + for i = 0 to 10 { + x = 13.0; + } + return x; +} diff --git a/juno_scheduler/src/default.rs b/juno_scheduler/src/default.rs index faccd5aa..2cd2c122 100644 --- a/juno_scheduler/src/default.rs +++ b/juno_scheduler/src/default.rs @@ -68,9 +68,11 @@ pub fn default_schedule() -> ScheduleStmt { DCE, GVN, DCE, - // Forkify, - // ForkGuardElim, - // ForkCoalesce, + Forkify, + ForkGuardElim, + ForkCoalesce, + DCE, + SimplifyCFG, DCE, ForkSplit, Unforkify, @@ -82,6 +84,7 @@ pub fn default_schedule() -> ScheduleStmt { AutoOutline, InterproceduralSROA, SROA, + SimplifyCFG, InferSchedules, DCE, GCM, -- GitLab From 85237e42877d6b5177805c9221b4716204e46e77 Mon Sep 17 00:00:00 2001 From: Russel Arbore <russel.jma@gmail.com> Date: Thu, 6 Feb 2025 11:25:28 -0600 Subject: [PATCH 4/4] test on gpu as well --- juno_samples/control/src/gpu.sch | 15 ++++++++++++++- juno_samples/control/src/main.rs | 15 +++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/juno_samples/control/src/gpu.sch b/juno_samples/control/src/gpu.sch index c56d046a..3ae9473d 100644 --- a/juno_samples/control/src/gpu.sch +++ b/juno_samples/control/src/gpu.sch @@ -3,14 +3,27 @@ phi-elim(*); dce(*); let out = auto-outline(*); -gpu(out.ccp_example, out.median_array, out.no_underflow); +gpu(out.ccp_example, out.median_array, out.no_underflow, out.useless_control); ip-sroa(*); sroa(*); dce(*); gvn(*); +dce(*); phi-elim(*); dce(*); +ccp(out.useless_control); +dce(out.useless_control); +simplify-cfg(out.useless_control); +dce(out.useless_control); +predication(out.useless_control); +dce(out.useless_control); +forkify(out.useless_control); +fork-guard-elim(out.useless_control); +fork-coalesce(out.useless_control); +dce(out.useless_control); +simplify-cfg(out.useless_control); +dce(out.useless_control); infer-schedules(*); diff --git a/juno_samples/control/src/main.rs b/juno_samples/control/src/main.rs index 39cb8014..af3408ed 100644 --- a/juno_samples/control/src/main.rs +++ b/juno_samples/control/src/main.rs @@ -13,28 +13,35 @@ fn main() { #[cfg(not(feature = "cuda"))] { let a = HerculesCPURef::from_slice(&a); - let b = HerculesCPURefMut::from_slice(&mut b); let mut r = runner!(ccp_example); let output_example = r.run(a).await; + assert_eq!(output_example, 1.0); + + let b = HerculesCPURefMut::from_slice(&mut b); let mut r = runner!(median_array); let output_median = r.run(9, b).await; - assert_eq!(output_example, 1.0); assert_eq!(output_median, 18); } #[cfg(feature = "cuda")] { let mut a = CUDABox::from_cpu_ref(HerculesCPURef::from_slice(&a)); - let mut b = CUDABox::from_cpu_ref(HerculesCPURef::from_slice(&b)); let mut r = runner!(ccp_example); let output_example = r.run(a.get_ref_mut()).await; + assert_eq!(output_example, 1.0); + + let mut b = CUDABox::from_cpu_ref(HerculesCPURef::from_slice(&b)); let mut r = runner!(median_array); let output_median = r.run(9, b.get_ref_mut()).await; - assert_eq!(output_example, 1.0); assert_eq!(output_median, 18); } + let mut r = runner!(no_underflow); let out_no_underflow = r.run().await; assert_eq!(out_no_underflow, 7); + + let mut r = runner!(useless_control); + let out_useless_control = r.run(-1.0).await; + assert_eq!(out_useless_control, 13.0); }); } -- GitLab