Skip to content
Snippets Groups Projects
Commit 401e1d36 authored by Russel Arbore's avatar Russel Arbore
Browse files

Possible fix to fork split

parent 3b491c96
No related branches found
No related tags found
1 merge request!132Possible fix to fork split
Pipeline #201217 passed
......@@ -248,6 +248,14 @@ pub fn reduce_cycles(
for reduce in reduces {
let (join, _, reduct) = function.nodes[reduce.idx()].try_reduce().unwrap();
let fork = join_fork_map[&join];
let isnt_outside_fork_join = |id: NodeID| {
let node = &function.nodes[id.idx()];
node.try_phi()
.map(|(control, _)| control)
.or(node.try_reduce().map(|(control, _, _)| control))
.map(|control| fork_join_nest[&fork].contains(&control))
.unwrap_or(true)
};
// First, find all data nodes that are used by the `reduct` input of the
// reduce, including the `reduct` itself.
......@@ -258,10 +266,7 @@ pub fn reduce_cycles(
for u in get_uses(&function.nodes[item.idx()]).as_ref() {
if !function.nodes[u.idx()].is_control()
&& !use_reachable.contains(u)
&& function.nodes[u.idx()]
.try_phi()
.map(|(control, _)| fork_join_nest[&fork].contains(&control))
.unwrap_or(true)
&& isnt_outside_fork_join(*u)
{
use_reachable.insert(*u);
worklist.push(*u);
......@@ -274,7 +279,10 @@ pub fn reduce_cycles(
let mut worklist = vec![reduce];
while let Some(item) = worklist.pop() {
for u in def_use.get_users(item) {
if !function.nodes[u.idx()].is_control() && !user_reachable.contains(u) {
if !function.nodes[u.idx()].is_control()
&& !user_reachable.contains(u)
&& isnt_outside_fork_join(*u)
{
user_reachable.insert(*u);
worklist.push(*u);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment