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; }