From d1eb3b4dbb9de12ccc8b8f840149d7794245e784 Mon Sep 17 00:00:00 2001 From: Russel Arbore <russel.jma@gmail.com> Date: Mon, 17 Feb 2025 14:20:26 -0600 Subject: [PATCH 1/3] loop canon bounds doesn't work for test2 in fork_join_tests --- juno_samples/fork_join_tests/src/cpu.sch | 6 ++++++ juno_samples/fork_join_tests/src/fork_join_tests.jn | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/juno_samples/fork_join_tests/src/cpu.sch b/juno_samples/fork_join_tests/src/cpu.sch index 7c416e90..115cf171 100644 --- a/juno_samples/fork_join_tests/src/cpu.sch +++ b/juno_samples/fork_join_tests/src/cpu.sch @@ -25,6 +25,12 @@ gvn(*); phi-elim(*); dce(*); +xdot[true](auto.test2); +lift-dc-math(auto.test2); +xdot[true](auto.test2); +loop-bound-canon(auto.test2); +xdot[true](auto.test2); + fixpoint panic after 20 { forkify(*); fork-guard-elim(*); diff --git a/juno_samples/fork_join_tests/src/fork_join_tests.jn b/juno_samples/fork_join_tests/src/fork_join_tests.jn index 8f569cfb..51115f15 100644 --- a/juno_samples/fork_join_tests/src/fork_join_tests.jn +++ b/juno_samples/fork_join_tests/src/fork_join_tests.jn @@ -12,7 +12,7 @@ fn test1(input : i32) -> i32[4, 4] { #[entry] fn test2(input : i32) -> i32[4, 5] { let arr : i32[4, 5]; - @loop1 for i = 0 to 8 { + @loop1 for i = 1 to 9 { @loop2 for k = 0 to 5 { @loop3 for j = 0 to 4 { arr[j, k] += input; -- GitLab From 8dabbb84ffe44aa90c1a08800ab58f4fbd328473 Mon Sep 17 00:00:00 2001 From: Xavier Routh <xrouth2@illinois.edu> Date: Tue, 18 Feb 2025 11:05:22 -0600 Subject: [PATCH 2/3] fix to canonicalize all loops --- hercules_opt/src/loop_bound_canon.rs | 5 ++- juno_samples/fork_join_tests/src/cpu.sch | 5 ++- juno_scheduler/src/pm.rs | 48 +++++++++++++----------- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/hercules_opt/src/loop_bound_canon.rs b/hercules_opt/src/loop_bound_canon.rs index 680236f1..3c6dc7ae 100644 --- a/hercules_opt/src/loop_bound_canon.rs +++ b/hercules_opt/src/loop_bound_canon.rs @@ -47,6 +47,8 @@ pub fn canonicalize_single_loop_bounds( ) -> bool { let function = editor.func(); + println!("canonicalizing {:?}", l.header); + let Some(loop_condition) = get_loop_exit_conditions(function, l, control_subgraph) else { return false; }; @@ -65,7 +67,7 @@ pub fn canonicalize_single_loop_bounds( if has_canonical_iv(editor, l, &ivs).is_some() { // println!("has canon iv!"); - return true; + return false; } let loop_bound_iv_phis = get_loop_condition_ivs(editor, l, &ivs, &loop_condition); @@ -305,5 +307,6 @@ pub fn canonicalize_single_loop_bounds( Ok(edit) }); + println!("result: {:?}", result); return result; } diff --git a/juno_samples/fork_join_tests/src/cpu.sch b/juno_samples/fork_join_tests/src/cpu.sch index 115cf171..ad226a7a 100644 --- a/juno_samples/fork_join_tests/src/cpu.sch +++ b/juno_samples/fork_join_tests/src/cpu.sch @@ -34,9 +34,12 @@ xdot[true](auto.test2); fixpoint panic after 20 { forkify(*); fork-guard-elim(*); - fork-coalesce(*); + fork-coalesce(*); + dce(*); } +xdot[true](auto.test2); + dce(*); gvn(*); diff --git a/juno_scheduler/src/pm.rs b/juno_scheduler/src/pm.rs index d83ff0bb..32f16063 100644 --- a/juno_scheduler/src/pm.rs +++ b/juno_scheduler/src/pm.rs @@ -2728,29 +2728,35 @@ fn run_pass( } Pass::LoopBoundCanon => { assert_eq!(args.len(), 0); + loop { + let mut inner_changed = false; + pm.make_fork_join_maps(); + pm.make_loops(); + pm.make_control_subgraphs(); + let fork_join_maps = pm.fork_join_maps.take().unwrap(); + let loops = pm.loops.take().unwrap(); + let control_subgraphs = pm.control_subgraphs.take().unwrap(); - pm.make_fork_join_maps(); - pm.make_loops(); - pm.make_control_subgraphs(); - let fork_join_maps = pm.fork_join_maps.take().unwrap(); - let loops = pm.loops.take().unwrap(); - let control_subgraphs = pm.control_subgraphs.take().unwrap(); - - for (((func, fork_join_map), loops), control_subgraph) in - build_selection(pm, selection, false) - .into_iter() - .zip(fork_join_maps.iter()) - .zip(loops.iter()) - .zip(control_subgraphs.iter()) - { - let Some(mut func) = func else { - continue; - }; - loop_bound_canon_toplevel(&mut func, fork_join_map, control_subgraph, loops); - changed |= func.modified(); + for (((func, fork_join_map), loops), control_subgraph) in + build_selection(pm, selection.clone(), false) + .into_iter() + .zip(fork_join_maps.iter()) + .zip(loops.iter()) + .zip(control_subgraphs.iter()) + { + let Some(mut func) = func else { + continue; + }; + loop_bound_canon_toplevel(&mut func, fork_join_map, control_subgraph, loops); + changed |= func.modified(); + inner_changed |= func.modified(); + } + pm.delete_gravestones(); + pm.clear_analyses(); + if !inner_changed { + break; + } } - pm.delete_gravestones(); - pm.clear_analyses(); } } println!("Ran Pass: {:?}", pass); -- GitLab From 0792170806a1dcedb0347c239f9489b9704923aa Mon Sep 17 00:00:00 2001 From: Xavier Routh <xrouth2@illinois.edu> Date: Tue, 18 Feb 2025 11:34:17 -0600 Subject: [PATCH 3/3] loop canon bound fix --- hercules_opt/src/loop_bound_canon.rs | 24 ++++++++++++++---------- juno_samples/cava/src/cpu.sch | 1 + juno_samples/fork_join_tests/src/cpu.sch | 9 ++------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/hercules_opt/src/loop_bound_canon.rs b/hercules_opt/src/loop_bound_canon.rs index 3c6dc7ae..e305e9db 100644 --- a/hercules_opt/src/loop_bound_canon.rs +++ b/hercules_opt/src/loop_bound_canon.rs @@ -270,17 +270,20 @@ pub fn canonicalize_single_loop_bounds( edit.replace_all_uses_where(bound_id, new_condition, |usee| *usee == binop_node)?; } - // Add back to uses of the IV - for user in update_expr_users { - let new_user = Node::Binary { - left: user, - right: *initializer, - op: BinaryOperator::Add, - }; - let new_user = edit.add_node(new_user); - edit = edit.replace_all_uses(user, new_user)?; - } + // for user in update_expr_users { + // let new_user = Node::Binary { + // left: user, + // right: *initializer, + // op: BinaryOperator::Add, + // }; + // let new_user = edit.add_node(new_user); + // edit = edit.replace_all_uses(user, new_user)?; + // } + + // for + + // Add the offset back to users of the IV update expression let new_user = Node::Binary { left: *update_expression, right: *initializer, @@ -294,6 +297,7 @@ pub fn canonicalize_single_loop_bounds( && *usee != condition_node })?; + // Add the offset back to users of the IV directly let new_user = Node::Binary { left: *iv_phi, right: *initializer, diff --git a/juno_samples/cava/src/cpu.sch b/juno_samples/cava/src/cpu.sch index 1b595b05..4013fd27 100644 --- a/juno_samples/cava/src/cpu.sch +++ b/juno_samples/cava/src/cpu.sch @@ -38,6 +38,7 @@ fixpoint { } simpl!(fuse1); array-slf(fuse1); +loop-bound-canon(fuse1); inline(fuse2); no-memset(fuse2@res); diff --git a/juno_samples/fork_join_tests/src/cpu.sch b/juno_samples/fork_join_tests/src/cpu.sch index ad226a7a..c71aec11 100644 --- a/juno_samples/fork_join_tests/src/cpu.sch +++ b/juno_samples/fork_join_tests/src/cpu.sch @@ -25,11 +25,8 @@ gvn(*); phi-elim(*); dce(*); -xdot[true](auto.test2); -lift-dc-math(auto.test2); -xdot[true](auto.test2); -loop-bound-canon(auto.test2); -xdot[true](auto.test2); +lift-dc-math(*); +loop-bound-canon(*); fixpoint panic after 20 { forkify(*); @@ -38,8 +35,6 @@ fixpoint panic after 20 { dce(*); } -xdot[true](auto.test2); - dce(*); gvn(*); -- GitLab