diff --git a/hercules_opt/src/ccp.rs b/hercules_opt/src/ccp.rs index 692d0f71d1229087d6a20514cc63f1a356f8f0b6..cf3a0919585b4254ff4d3f6996755c063bca68d6 100644 --- a/hercules_opt/src/ccp.rs +++ b/hercules_opt/src/ccp.rs @@ -845,11 +845,24 @@ fn ccp_flow_function( } Node::Read { collect, - indices: _, - } => CCPLattice { - reachability: inputs[collect.idx()].reachability.clone(), - constant: ConstantLattice::bottom(), - }, + indices, + } => { + let mut reachability = inputs[collect.idx()].reachability.clone(); + for index in indices.iter() { + if let Index::Position(positions) = index { + for position in positions.iter() { + reachability = ReachabilityLattice::join( + &reachability, + &inputs[position.idx()].reachability, + ); + } + } + } + CCPLattice { + reachability, + constant: ConstantLattice::bottom(), + } + } // Projection handles reachability when following an if or match. Node::Projection { control, selection } => match &editor.func().nodes[control.idx()] { Node::If { control: _, cond } => { diff --git a/juno_samples/nested_ccp/src/main.rs b/juno_samples/nested_ccp/src/main.rs index 1acea9bfa9e6a68c797845294a5cdfc00046927a..f866112f34914add4f9598d217bf6589fd033dba 100644 --- a/juno_samples/nested_ccp/src/main.rs +++ b/juno_samples/nested_ccp/src/main.rs @@ -8,8 +8,9 @@ juno_build::juno!("nested_ccp"); fn main() { async_std::task::block_on(async { + let mut a = vec![17.0, 18.0, 19.0]; let output = unsafe { - ccp_example().await + ccp_example(a.as_mut_ptr()).await }; println!("{}", output); assert_eq!(output, 1.0); diff --git a/juno_samples/nested_ccp/src/nested_ccp.jn b/juno_samples/nested_ccp/src/nested_ccp.jn index 506f0361f0792d45ebd0a6c8582335b7883562b4..7a9575854ee5220c67ffa3c4a784458646677119 100644 --- a/juno_samples/nested_ccp/src/nested_ccp.jn +++ b/juno_samples/nested_ccp/src/nested_ccp.jn @@ -1,15 +1,15 @@ #[entry] -fn ccp_example() -> f32 { +fn ccp_example(arg : f32[3]) -> f32 { let x : f32 = 2; if x < 3 { x = 1; } else { if x == 1 { - x = 4; + x = 3; } else { - x = 1; + x = 7; } } - if false { for i = 0 to 3 by 1 { } } + if false { for i = 0 to 3 by 1 { x = arg[i]; arg[i] = 0; } } return x; }