Skip to content
Snippets Groups Projects

Possible fix to fork split

Merged rarbore2 requested to merge fix_fork_split into main
1 file
+ 13
5
Compare changes
  • Side-by-side
  • Inline
+ 13
5
@@ -248,6 +248,14 @@ pub fn reduce_cycles(
@@ -248,6 +248,14 @@ pub fn reduce_cycles(
for reduce in reduces {
for reduce in reduces {
let (join, _, reduct) = function.nodes[reduce.idx()].try_reduce().unwrap();
let (join, _, reduct) = function.nodes[reduce.idx()].try_reduce().unwrap();
let fork = join_fork_map[&join];
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
// First, find all data nodes that are used by the `reduct` input of the
// reduce, including the `reduct` itself.
// reduce, including the `reduct` itself.
@@ -258,10 +266,7 @@ pub fn reduce_cycles(
@@ -258,10 +266,7 @@ pub fn reduce_cycles(
for u in get_uses(&function.nodes[item.idx()]).as_ref() {
for u in get_uses(&function.nodes[item.idx()]).as_ref() {
if !function.nodes[u.idx()].is_control()
if !function.nodes[u.idx()].is_control()
&& !use_reachable.contains(u)
&& !use_reachable.contains(u)
&& function.nodes[u.idx()]
&& isnt_outside_fork_join(*u)
.try_phi()
.map(|(control, _)| fork_join_nest[&fork].contains(&control))
.unwrap_or(true)
{
{
use_reachable.insert(*u);
use_reachable.insert(*u);
worklist.push(*u);
worklist.push(*u);
@@ -274,7 +279,10 @@ pub fn reduce_cycles(
@@ -274,7 +279,10 @@ pub fn reduce_cycles(
let mut worklist = vec![reduce];
let mut worklist = vec![reduce];
while let Some(item) = worklist.pop() {
while let Some(item) = worklist.pop() {
for u in def_use.get_users(item) {
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);
user_reachable.insert(*u);
worklist.push(*u);
worklist.push(*u);
}
}
Loading