diff --git a/hercules_opt/src/forkify.rs b/hercules_opt/src/forkify.rs index 18dfe36ab5528d16d123c3aef37d89f9cbf51756..478fb3d508ea8220b01be1255308ca247e9ecfb1 100644 --- a/hercules_opt/src/forkify.rs +++ b/hercules_opt/src/forkify.rs @@ -154,9 +154,6 @@ pub fn forkify( let join_id = NodeID::new(function.nodes.len()); function.nodes.push(join); - // Reconnect control nodes. - get_uses_mut(&mut function.nodes[loop_dst.idx()]).map(loop_false_read, join_id); - // Convert reducing phi nodes to reduce nodes. let reduction_phis: Vec<_> = def_use .get_users(header) @@ -219,15 +216,18 @@ pub fn forkify( let thread_id = Node::ThreadID { control: fork_id }; let thread_id_id = NodeID::new(function.nodes.len()); function.nodes.push(thread_id); + for user in def_use.get_users(idx_phi) { get_uses_mut(&mut function.nodes[user.idx()]).map(idx_phi, thread_id_id); } - function.nodes[idx_phi.idx()] = Node::Start; - - // Delete old loop control nodes; for user in def_use.get_users(header) { get_uses_mut(&mut function.nodes[user.idx()]).map(header, fork_id); } + for user in def_use.get_users(loop_false_read) { + get_uses_mut(&mut function.nodes[user.idx()]).map(loop_false_read, join_id); + } + + function.nodes[idx_phi.idx()] = Node::Start; function.nodes[header.idx()] = Node::Start; function.nodes[loop_end.idx()] = Node::Start; function.nodes[loop_true_read.idx()] = Node::Start;