diff --git a/hercules_opt/src/editor.rs b/hercules_opt/src/editor.rs index 95fd1669a8d6760382063dc0e887a987a3e2198d..bf7cede2c3facea7e8066c8c5a1a2bda13fe5d05 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 b9380197d1c73c40e42655df872894927cf838b7..2dd0049b81cb766afdbb9786664cdf4602b84319 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 d4263fe8d93c0dbc7355b50956680fff3b588dc0..49249fc7d24b576ad3bd7cc794ef3b7303d63626 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)); }