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