From 881248849fda7222741aca6bb4c37ccb8864fa1b Mon Sep 17 00:00:00 2001
From: Aaron Councilman <aaronjc4@illinois.edu>
Date: Tue, 19 Nov 2024 08:10:43 -0600
Subject: [PATCH] Fix editor bug when deleting created node

---
 hercules_opt/src/editor.rs | 4 +++-
 hercules_opt/src/sroa.rs   | 3 ---
 juno_frontend/src/lib.rs   | 7 +++----
 3 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/hercules_opt/src/editor.rs b/hercules_opt/src/editor.rs
index 95fd1669..bf7cede2 100644
--- a/hercules_opt/src/editor.rs
+++ b/hercules_opt/src/editor.rs
@@ -505,7 +505,9 @@ pub fn repair_plan(plan: &mut Plan, new_function: &Function, edits: &[Edit]) {
     // Step 2: drop schedules for deleted nodes and create empty schedule lists
     // for added nodes.
     for deleted in total_edit.0.iter() {
-        plan.schedules[deleted.idx()] = vec![];
+        if deleted.idx() < plan.schedules.len() {
+            plan.schedules[deleted.idx()] = vec![];
+        }
     }
     if !total_edit.1.is_empty() {
         assert_eq!(
diff --git a/hercules_opt/src/sroa.rs b/hercules_opt/src/sroa.rs
index b9380197..2dd0049b 100644
--- a/hercules_opt/src/sroa.rs
+++ b/hercules_opt/src/sroa.rs
@@ -243,15 +243,12 @@ pub fn sroa(editor: &mut FunctionEditor, reverse_postorder: &Vec<NodeID>, types:
     }
 
     // Actually deleting nodes seems to break things right now
-    /*
-    println!("{:?}", to_delete);
     editor.edit(|mut edit| {
         for node in to_delete {
             edit = edit.delete_node(node)?
         }
         Ok(edit)
     });
-    */
 }
 
 // An index tree is used to store results at many index lists
diff --git a/juno_frontend/src/lib.rs b/juno_frontend/src/lib.rs
index d4263fe8..49249fc7 100644
--- a/juno_frontend/src/lib.rs
+++ b/juno_frontend/src/lib.rs
@@ -151,18 +151,17 @@ pub fn compile_ir(
     if x_dot {
         pm.add_pass(hercules_opt::pass::Pass::Xdot(true));
     }
-    // TEMPORARY
+    add_pass!(pm, verify, Inline);
+    // Run SROA pretty early (though after inlining which can make SROA more effective) so that
+    // CCP, GVN, etc. can work on the result of SROA
     add_pass!(pm, verify, SROA);
     if x_dot {
         pm.add_pass(hercules_opt::pass::Pass::Xdot(true));
     }
-    // TEMPORARY
-    add_pass!(pm, verify, Inline);
     add_pass!(pm, verify, CCP);
     add_pass!(pm, verify, DCE);
     add_pass!(pm, verify, GVN);
     add_pass!(pm, verify, DCE);
-    //add_pass!(pm, verify, SROA);
     if x_dot {
         pm.add_pass(hercules_opt::pass::Pass::Xdot(true));
     }
-- 
GitLab