From 09c58d7553f34d92233fd6c8d75c3a9f44a0ab6c Mon Sep 17 00:00:00 2001
From: Aaron Councilman <aaronjc4@illinois.edu>
Date: Tue, 19 Nov 2024 12:36:23 -0600
Subject: [PATCH] Fix SROA edit issues

---
 hercules_opt/src/sroa.rs | 18 ++++++++++++------
 juno_frontend/src/lib.rs |  4 ++--
 juno_samples/products.jn |  8 +++++++-
 3 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/hercules_opt/src/sroa.rs b/hercules_opt/src/sroa.rs
index efa7bd90..924c8d93 100644
--- a/hercules_opt/src/sroa.rs
+++ b/hercules_opt/src/sroa.rs
@@ -212,6 +212,7 @@ pub fn sroa(editor: &mut FunctionEditor, reverse_postorder: &Vec<NodeID>, types:
     // enough information to process a particular node, we add it back to the worklist
     let mut next_id: usize = editor.func().nodes.len();
     let mut to_insert = BTreeMap::new();
+    let mut to_replace : Vec<(NodeID, NodeID)> = vec![];
 
     while let Some(mut item) = worklist.pop_front() {
         if let WorkItem::Unhandled(node) = item {
@@ -299,7 +300,7 @@ pub fn sroa(editor: &mut FunctionEditor, reverse_postorder: &Vec<NodeID>, types:
                         let read_info = index_map.lookup(indices);
                         match read_info {
                             IndexTree::Leaf(field) => {
-                                editor.edit(|edit| edit.replace_all_uses(node, *field));
+                                to_replace.push((node, *field));
                             }
                             _ => {}
                         }
@@ -426,12 +427,17 @@ pub fn sroa(editor: &mut FunctionEditor, reverse_postorder: &Vec<NodeID>, types:
     }
 
     // Create new nodes nodes
-    for (node_id, node) in to_insert {
-        editor.edit(|mut edit| {
+    editor.edit(|mut edit| {
+        for (node_id, node) in to_insert {
             let id = edit.add_node(node);
-            assert!(node_id == id.idx());
-            Ok(edit)
-        });
+            assert_eq!(node_id, id.idx());
+        }
+        Ok(edit)
+    });
+
+    // Replace uses of old reads
+    for (old, new) in to_replace {
+        editor.edit(|edit| edit.replace_all_uses(old, new));
     }
 
     // Remove nodes
diff --git a/juno_frontend/src/lib.rs b/juno_frontend/src/lib.rs
index 59240fe9..7e6b61fa 100644
--- a/juno_frontend/src/lib.rs
+++ b/juno_frontend/src/lib.rs
@@ -69,11 +69,11 @@ impl fmt::Display for ErrorMessage {
         match self {
             ErrorMessage::SemanticError(errs) => {
                 for err in errs {
-                    write!(f, "{}", err)?;
+                    write!(f, "{}\n", err)?;
                 }
             }
             ErrorMessage::SchedulingError(msg) => {
-                write!(f, "{}", msg)?;
+                write!(f, "{}\n", msg)?;
             }
         }
         Ok(())
diff --git a/juno_samples/products.jn b/juno_samples/products.jn
index 00b66aab..6c14e67a 100644
--- a/juno_samples/products.jn
+++ b/juno_samples/products.jn
@@ -1,6 +1,12 @@
 fn test_call(x : i32, y : f32) -> (i32, f32) {
   let res = (x, y);
-  if x < 13 { res = (x + 1, y); }
+  for i = 0 to 10 {
+    if i % 2 == 0 {
+      res.0 += 1;
+    } else {
+      res.1 *= 2.0;
+    }
+  }
   return res;
 }
 
-- 
GitLab