From 5a118a331e782e0b134447580a09acce3ef261a3 Mon Sep 17 00:00:00 2001 From: rarbore2 <rarbore2@illinois.edu> Date: Sat, 14 Dec 2024 19:17:50 -0600 Subject: [PATCH] Fix outlining --- hercules_opt/src/outline.rs | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/hercules_opt/src/outline.rs b/hercules_opt/src/outline.rs index 4cded421..915b11c9 100644 --- a/hercules_opt/src/outline.rs +++ b/hercules_opt/src/outline.rs @@ -1,12 +1,9 @@ -extern crate bitvec; extern crate hercules_ir; use std::collections::{BTreeMap, BTreeSet}; use std::iter::zip; use std::sync::atomic::{AtomicUsize, Ordering}; -use self::bitvec::prelude::*; - use self::hercules_ir::def_use::*; use self::hercules_ir::dom::*; use self::hercules_ir::gcm::*; @@ -88,7 +85,11 @@ pub fn outline( // Note, this is the control ID of the exit point of the previous partition, // not just the previous partition - partition A may have multiple exit // points that jump to partition B. - let callee_pred_param_idx = if control_subgraph.preds(top_node).count() > 1 { + let top_node_outside_preds: Box<[_]> = control_subgraph + .preds(top_node) + .filter(|pred_id| !partition.contains(pred_id)) + .collect(); + let callee_pred_param_idx = if top_node_outside_preds.len() > 1 { Some(param_idx_to_outside_id.len()) } else { None @@ -97,10 +98,10 @@ pub fn outline( .iter() .map(|outside_id| { let func = editor.func(); - control_subgraph.preds(top_node).map(move |pred_id| { + top_node_outside_preds.iter().map(move |pred_id| { ( - (*outside_id, pred_id), - does_data_dom_control(func, *outside_id, pred_id, dom), + (*outside_id, *pred_id), + does_data_dom_control(func, *outside_id, *pred_id, dom), ) }) }) @@ -421,11 +422,9 @@ pub fn outline( // - Region (single predecessor), If, Match, or Fork: the original top // node gets replaced with a new region with a single predecessor. The // call is generated in a straightforward manner. - let (new_region_id, call_id) = if let Node::Region { preds } = edit.get_node(top_node) - && preds.len() > 1 - { + let (new_region_id, call_id) = if top_node_outside_preds.len() > 1 { let new_region = Node::Region { - preds: preds.clone(), + preds: top_node_outside_preds.clone(), }; let new_region_id = edit.add_node(new_region); let mut args = vec![]; @@ -439,10 +438,10 @@ pub fn outline( let undef_id = edit.add_node(undef); let phi = Node::Phi { control: new_region_id, - data: control_subgraph - .preds(top_node) + data: top_node_outside_preds + .iter() .map(|pred_id| { - if outside_id_and_top_pred_to_does_dom[&(*outside_id, pred_id)] { + if outside_id_and_top_pred_to_does_dom[&(*outside_id, *pred_id)] { *outside_id } else { undef_id @@ -454,7 +453,7 @@ pub fn outline( } // Add a phi for the control predecessor indicator. - let control_id_constants = control_subgraph.preds(top_node).map(|pred_id| { + let control_id_constants = top_node_outside_preds.iter().map(|pred_id| { let id = edit.add_constant(Constant::UnsignedInteger32(pred_id.idx() as u32)); edit.add_node(Node::Constant { id }) }); @@ -474,7 +473,7 @@ pub fn outline( (new_region_id, call_id) } else { let new_region = Node::Region { - preds: Box::new([control_subgraph.preds(top_node).next().unwrap()]), + preds: top_node_outside_preds, }; let new_region_id = edit.add_node(new_region); let call = Node::Call { -- GitLab