From a8a2fc3b61e010278a1ca622cd6aaab6f77ff140 Mon Sep 17 00:00:00 2001
From: Russel Arbore <russel.jma@gmail.com>
Date: Wed, 12 Feb 2025 17:13:04 -0600
Subject: [PATCH] Just do fork unrolling

---
 hercules_opt/src/fork_transforms.rs | 15 +++++++++++++++
 hercules_opt/src/lib.rs             |  2 --
 hercules_opt/src/unroll.rs          | 18 ------------------
 juno_scheduler/src/compile.rs       |  2 +-
 juno_scheduler/src/ir.rs            |  2 +-
 juno_scheduler/src/pm.rs            | 12 ++++++------
 6 files changed, 23 insertions(+), 28 deletions(-)
 delete mode 100644 hercules_opt/src/unroll.rs

diff --git a/hercules_opt/src/fork_transforms.rs b/hercules_opt/src/fork_transforms.rs
index fd6747d7..539b7fd1 100644
--- a/hercules_opt/src/fork_transforms.rs
+++ b/hercules_opt/src/fork_transforms.rs
@@ -1164,3 +1164,18 @@ fn fork_interchange(
         edit.delete_node(fork)
     });
 }
+
+/*
+ * Run fork unrolling on all fork-joins that are mutable in an editor.
+ */
+pub fn fork_unroll_all_forks(editor: &mut FunctionEditor, fork_joins: &HashMap<NodeID, NodeID>) {
+    for (fork, join) in fork_joins {
+        if editor.is_mutable(*fork) && fork_unroll(editor, *fork, *join) {
+            break;
+        }
+    }
+}
+
+pub fn fork_unroll(editor: &mut FunctionEditor, fork: NodeID, join: NodeID) -> bool {
+    false
+}
diff --git a/hercules_opt/src/lib.rs b/hercules_opt/src/lib.rs
index a810dfbf..7187508a 100644
--- a/hercules_opt/src/lib.rs
+++ b/hercules_opt/src/lib.rs
@@ -23,7 +23,6 @@ pub mod simplify_cfg;
 pub mod slf;
 pub mod sroa;
 pub mod unforkify;
-pub mod unroll;
 pub mod utils;
 
 pub use crate::ccp::*;
@@ -49,5 +48,4 @@ pub use crate::simplify_cfg::*;
 pub use crate::slf::*;
 pub use crate::sroa::*;
 pub use crate::unforkify::*;
-pub use crate::unroll::*;
 pub use crate::utils::*;
diff --git a/hercules_opt/src/unroll.rs b/hercules_opt/src/unroll.rs
deleted file mode 100644
index f3c795ca..00000000
--- a/hercules_opt/src/unroll.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-use bitvec::prelude::*;
-
-use hercules_ir::*;
-
-use crate::*;
-
-/*
- * Run loop unrolling on all loops that are mutable in an editor.
- */
-pub fn loop_unroll_all_loops(editor: &mut FunctionEditor, loops: &LoopTree) {
-    for (header, contents) in loops.bottom_up_loops() {
-        if editor.is_mutable(header) {
-            loop_unroll(editor, header, contents);
-        }
-    }
-}
-
-pub fn loop_unroll(editor: &mut FunctionEditor, header: NodeID, contents: &BitVec<u8, Lsb0>) {}
diff --git a/juno_scheduler/src/compile.rs b/juno_scheduler/src/compile.rs
index 9d5a86cc..6b40001c 100644
--- a/juno_scheduler/src/compile.rs
+++ b/juno_scheduler/src/compile.rs
@@ -113,8 +113,8 @@ impl FromStr for Appliable {
             "fork-dim-merge" => Ok(Appliable::Pass(ir::Pass::ForkDimMerge)),
             "fork-interchange" => Ok(Appliable::Pass(ir::Pass::ForkInterchange)),
             "fork-chunk" | "fork-tile" => Ok(Appliable::Pass(ir::Pass::ForkChunk)),
+            "fork-unroll" | "unroll" => Ok(Appliable::Pass(ir::Pass::ForkUnroll)),
             "lift-dc-math" => Ok(Appliable::Pass(ir::Pass::LiftDCMath)),
-            "loop-unroll" | "unroll" => Ok(Appliable::Pass(ir::Pass::LoopUnroll)),
             "outline" => Ok(Appliable::Pass(ir::Pass::Outline)),
             "phi-elim" => Ok(Appliable::Pass(ir::Pass::PhiElim)),
             "predication" => Ok(Appliable::Pass(ir::Pass::Predication)),
diff --git a/juno_scheduler/src/ir.rs b/juno_scheduler/src/ir.rs
index 1bb6cf13..840f25a6 100644
--- a/juno_scheduler/src/ir.rs
+++ b/juno_scheduler/src/ir.rs
@@ -16,6 +16,7 @@ pub enum Pass {
     ForkGuardElim,
     ForkInterchange,
     ForkSplit,
+    ForkUnroll,
     Forkify,
     GCM,
     GVN,
@@ -23,7 +24,6 @@ pub enum Pass {
     Inline,
     InterproceduralSROA,
     LiftDCMath,
-    LoopUnroll,
     Outline,
     PhiElim,
     Predication,
diff --git a/juno_scheduler/src/pm.rs b/juno_scheduler/src/pm.rs
index 5c6aec5e..951ba51d 100644
--- a/juno_scheduler/src/pm.rs
+++ b/juno_scheduler/src/pm.rs
@@ -1665,19 +1665,19 @@ fn run_pass(
             pm.delete_gravestones();
             pm.clear_analyses();
         }
-        Pass::LoopUnroll => {
+        Pass::ForkUnroll => {
             assert_eq!(args.len(), 0);
 
-            pm.make_loops();
-            let loops = pm.loops.take().unwrap();
-            for (func, loops) in build_selection(pm, selection, false)
+            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, false)
                 .into_iter()
-                .zip(loops.iter())
+                .zip(fork_join_maps.iter())
             {
                 let Some(mut func) = func else {
                     continue;
                 };
-                loop_unroll_all_loops(&mut func, loops);
+                fork_unroll_all_forks(&mut func, fork_join_map);
                 changed |= func.modified();
             }
             pm.delete_gravestones();
-- 
GitLab