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] 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