diff --git a/hercules_opt/src/loop_bound_canon.rs b/hercules_opt/src/loop_bound_canon.rs
index 680236f168c04fb26f8f8befd9ea865835235fca..3c6dc7ae028cad477969705bd453aedb4dcb167b 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 115cf171989303f0cef999cdfc6bbc1c1fb05e94..ad226a7aa7c9d2270f4480b8825324198046521a 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 d83ff0bb5df2a2814d550faeb800a4f0392e15c4..32f16063cc003d08c30b2e1401628e5a09085f55 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);