diff --git a/hercules_opt/src/sroa.rs b/hercules_opt/src/sroa.rs
index efa7bd9040e594482eaf103de69aa230195930b8..924c8d938a011a7925a7e3f6d1aaaa874e30be6b 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 59240fe9c9c1624a6989732b23c8c5e9a987fd79..7e6b61faa2aaa9efcfebb12b250a5d2387f20476 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 00b66aab5835849c24b11c3af643761f0a8d000f..6c14e67abb9490c951cd489f3fc00758602c8bd2 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;
 }