diff --git a/hercules_test/hercules_interpreter/src/interpreter.rs b/hercules_test/hercules_interpreter/src/interpreter.rs
index 2e352644cc816a3fe5c43427fa7190708508bb82..f9d666a5f00976bebd7de9ab8a2a6346f5081529 100644
--- a/hercules_test/hercules_interpreter/src/interpreter.rs
+++ b/hercules_test/hercules_interpreter/src/interpreter.rs
@@ -529,6 +529,13 @@ impl<'a> FunctionExecutionState<'a> {
 
                 state.run()
             }
+            Node::DataProjection { data, selection } => {
+                let data = self.handle_data(token, *data);
+                let InterpreterVal::MultiReturn(vs) = data else {
+                    panic!();
+                };
+                vs[*selection].clone()
+            }
             Node::Read { collect, indices } => {
                 let collection = self.handle_data(token, *collect);
                 if let InterpreterVal::Undef(_) = collection {
@@ -745,7 +752,7 @@ impl<'a> FunctionExecutionState<'a> {
                         .succs(ctrl_token.curr)
                         .find(|n| {
                             self.get_function().nodes[n.idx()]
-                                .try_projection(cond)
+                                .try_control_projection(cond)
                                 .is_some()
                         })
                         .expect("PANIC: No outgoing valid outgoing edge.");
@@ -753,7 +760,7 @@ impl<'a> FunctionExecutionState<'a> {
                     let ctrl_token = ctrl_token.moved_to(next);
                     vec![ctrl_token]
                 }
-                Node::Projection { .. } => {
+                Node::ControlProjection { .. } => {
                     let next: NodeID = self
                         .get_control_subgraph()
                         .succs(ctrl_token.curr)
@@ -861,8 +868,10 @@ impl<'a> FunctionExecutionState<'a> {
                     }
                 }
                 Node::Return { control: _, data } => {
-                    let result = self.handle_data(&ctrl_token, *data);
-                    break 'outer result;
+                    let results = data.iter()
+                        .map(|data| self.handle_data(&ctrl_token, *data))
+                        .collect();
+                    break 'outer InterpreterVal::MultiReturn(results);
                 }
                 _ => {
                     panic!("PANIC: Unexpected node in control subgraph {:?}", node);
diff --git a/hercules_test/hercules_interpreter/src/value.rs b/hercules_test/hercules_interpreter/src/value.rs
index dfc290b253666c8251370450f9f2893fe78d8830..0f5716e75b64f3753e22d074bd93210fee7ddfd1 100644
--- a/hercules_test/hercules_interpreter/src/value.rs
+++ b/hercules_test/hercules_interpreter/src/value.rs
@@ -36,6 +36,8 @@ pub enum InterpreterVal {
     // These can be freely? casted
     DynamicConstant(usize),
     ThreadID(usize),
+
+    MultiReturn(Box<[InterpreterVal]>),
 }
 
 #[derive(Clone)]
@@ -848,6 +850,7 @@ impl<'a> InterpreterVal {
                     Type::Product(_) => todo!(),
                     Type::Summation(_) => todo!(),
                     Type::Array(type_id, _) => todo!(),
+                    Type::MultiReturn(_) => todo!(),
                 }
             }
             (_, Self::Undef(v)) => InterpreterVal::Undef(v),
diff --git a/hercules_test/test_inputs/call.hir b/hercules_test/test_inputs/call.hir
index 447489343cce6e010c342add119aa0c4fa31058b..0ebf7c7dc79510ee2ac5535fc6c6f510c5187e6a 100644
--- a/hercules_test/test_inputs/call.hir
+++ b/hercules_test/test_inputs/call.hir
@@ -1,7 +1,8 @@
 fn myfunc(x: i32) -> i32
-  y = call(add, x, x)
+  cy = call(add, x, x)
+  y = data_projection(cy, 0)
   r = return(start, y)
 
 fn add(x: i32, y: i32) -> i32
   w = add(x, y)
-  r = return(start, w)
\ No newline at end of file
+  r = return(start, w)
diff --git a/hercules_test/test_inputs/call_dc_params.hir b/hercules_test/test_inputs/call_dc_params.hir
index 5ccf2686848379b4b31eec3c2201d924984ad2e0..b8da97918fd7758ddb80e96533fe2d81a4139e77 100644
--- a/hercules_test/test_inputs/call_dc_params.hir
+++ b/hercules_test/test_inputs/call_dc_params.hir
@@ -1,9 +1,10 @@
 fn myfunc(x: u64) -> u64
-  y = call<10, 4>(add, x, x)
+  cy = call<10, 4>(add, x, x)
+  y = data_projection(cy, 0)
   r = return(start, y)
 
 fn add<2>(x: u64, y: u64) -> u64
   b = dynamic_constant(#1)
   r = return(start, z)
   w = add(x, y)
-  z = add(b, w)
\ No newline at end of file
+  z = add(b, w)
diff --git a/hercules_test/test_inputs/ccp_example.hir b/hercules_test/test_inputs/ccp_example.hir
index 25b7379e19f488c2d5ecf8cb377161758c62bb98..f8004b636e5df90299b27886778e5bd56799dfd0 100644
--- a/hercules_test/test_inputs/ccp_example.hir
+++ b/hercules_test/test_inputs/ccp_example.hir
@@ -6,14 +6,14 @@ fn tricky(x: i32) -> i32
   val = phi(loop, one, later_val)
   b = ne(one, val)
   if1 = if(loop, b)
-  if1_false = projection(if1, 0)
-  if1_true = projection(if1, 1)
+  if1_false = control_projection(if1, 0)
+  if1_true = control_projection(if1, 1)
   middle = region(if1_false, if1_true)
   inter_val = sub(two, val)
   later_val = phi(middle, inter_val, two)
   idx_dec = sub(idx, one)
   cond = gte(idx_dec, one)
   if2 = if(middle, cond)
-  if2_false = projection(if2, 0)
-  if2_true = projection(if2, 1)
+  if2_false = control_projection(if2, 0)
+  if2_true = control_projection(if2, 1)
   r = return(if2_false, later_val)
diff --git a/hercules_test/test_inputs/fork_transforms/fork_fission/inner_loop.hir b/hercules_test/test_inputs/fork_transforms/fork_fission/inner_loop.hir
index 0cc13b2fe21ab6cb434b9a13b3dc212c125394aa..b7458a438b4af6dbd3809897a5fd0469244c206c 100644
--- a/hercules_test/test_inputs/fork_transforms/fork_fission/inner_loop.hir
+++ b/hercules_test/test_inputs/fork_transforms/fork_fission/inner_loop.hir
@@ -11,8 +11,8 @@ fn fun<2>(x: u64) -> u64
   idx_inc = add(idx, one_idx)
   in_bounds = lt(idx, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
   j = join(if_false)
   tid = thread_id(f, 0)
   add1 = add(reduce1, idx)
@@ -20,4 +20,4 @@ fn fun<2>(x: u64) -> u64
   add2 = add(reduce2, idx_inc)
   reduce2 =  reduce(j, zero, add2)
   out1 = add(reduce1, reduce2)
-  z = return(j, out1)
\ No newline at end of file
+  z = return(j, out1)
diff --git a/hercules_test/test_inputs/forkify/alternate_bounds.hir b/hercules_test/test_inputs/forkify/alternate_bounds.hir
index 4a9ba0153448e4c9339e901d3ba3a10e027bad56..7de8cf1e606bf2f231ad3391fad50e7b04d32d93 100644
--- a/hercules_test/test_inputs/forkify/alternate_bounds.hir
+++ b/hercules_test/test_inputs/forkify/alternate_bounds.hir
@@ -11,6 +11,6 @@ fn sum<1>(a: array(i32, #0)) -> i32
   red_add = add(red, read)
   in_bounds = lt(idx_inc, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, red_add)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, red_add)
diff --git a/hercules_test/test_inputs/forkify/broken_sum.hir b/hercules_test/test_inputs/forkify/broken_sum.hir
index d15ef5613e271cd8685660785f5505dedbf40ec9..75b12350da88214c761654a47cffb0943015afa9 100644
--- a/hercules_test/test_inputs/forkify/broken_sum.hir
+++ b/hercules_test/test_inputs/forkify/broken_sum.hir
@@ -11,6 +11,6 @@ fn sum<1>(a: array(i32, #0)) -> i32
   red_add = add(red, read)
   in_bounds = lt(idx, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, red_add)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, red_add)
diff --git a/hercules_test/test_inputs/forkify/control_after_condition.hir b/hercules_test/test_inputs/forkify/control_after_condition.hir
index db40225bac26f5d6687b4b36bd46e06c963c4815..a1a97fba3c5cd3655ccf47f6b97b1a63dbb6bf9d 100644
--- a/hercules_test/test_inputs/forkify/control_after_condition.hir
+++ b/hercules_test/test_inputs/forkify/control_after_condition.hir
@@ -11,8 +11,8 @@ fn alt_sum<1>(a: array(i32, #0)) -> i32
   rem = rem(idx, two_idx)
   odd = eq(rem, one_idx)
   negate_if = if(loop_continue, odd)
-  negate_if_false = projection(negate_if, 0)
-  negate_if_true = projection(negate_if, 1)
+  negate_if_false = control_projection(negate_if, 0)
+  negate_if_true = control_projection(negate_if, 1)
   negate_bottom = region(negate_if_false, negate_if_true)
   read = read(a, position(idx))
   read_neg = neg(read)
@@ -20,6 +20,6 @@ fn alt_sum<1>(a: array(i32, #0)) -> i32
   red_add = add(red, read_phi)
   in_bounds = lt(idx, bound)
   if = if(loop, in_bounds)
-  loop_exit = projection(if, 0)
-  loop_continue = projection(if, 1)
-  r = return(loop_exit, red)
\ No newline at end of file
+  loop_exit = control_projection(if, 0)
+  loop_continue = control_projection(if, 1)
+  r = return(loop_exit, red)
diff --git a/hercules_test/test_inputs/forkify/control_before_condition.hir b/hercules_test/test_inputs/forkify/control_before_condition.hir
index f24b565a56df1e9ed98e2637a8b66ef27ff6e7de..e351d7142a44df6c33e9598b56511fd84227fee7 100644
--- a/hercules_test/test_inputs/forkify/control_before_condition.hir
+++ b/hercules_test/test_inputs/forkify/control_before_condition.hir
@@ -11,8 +11,8 @@ fn alt_sum<1>(a: array(i32, #0)) -> i32
   rem = rem(idx, two_idx)
   odd = eq(rem, one_idx)
   negate_if = if(loop, odd)
-  negate_if_false = projection(negate_if, 0)
-  negate_if_true = projection(negate_if, 1)
+  negate_if_false = control_projection(negate_if, 0)
+  negate_if_true = control_projection(negate_if, 1)
   negate_bottom = region(negate_if_false, negate_if_true)
   read = read(a, position(idx))
   read_neg = neg(read)
@@ -20,6 +20,6 @@ fn alt_sum<1>(a: array(i32, #0)) -> i32
   red_add = add(red, read_phi)
   in_bounds = lt(idx, bound)
   if = if(negate_bottom, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, red)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, red)
diff --git a/hercules_test/test_inputs/forkify/expected_fails.hir/bad_3nest_return.hir b/hercules_test/test_inputs/forkify/expected_fails.hir/bad_3nest_return.hir
index f5ec4370b6befc4d45535fd25f024db60b55a0d0..7599e6ecbfda68266d40b0908d99ed89c5b4321c 100644
--- a/hercules_test/test_inputs/forkify/expected_fails.hir/bad_3nest_return.hir
+++ b/hercules_test/test_inputs/forkify/expected_fails.hir/bad_3nest_return.hir
@@ -16,18 +16,18 @@ fn loop<3>(a: u32) -> i32
   outer_idx_inc = add(outer_idx, one_idx)
   outer_in_bounds = lt(outer_idx, outer_bound)
   inner_if = if(inner_loop, inner_in_bounds)
-  inner_if_false = projection(inner_if, 0)
-  inner_if_true = projection(inner_if, 1)
+  inner_if_false = control_projection(inner_if, 0)
+  inner_if_true = control_projection(inner_if, 1)
   outer_if = if(outer_loop, outer_in_bounds)
-  outer_if_false = projection(outer_if, 0)
-  outer_if_true = projection(outer_if, 1)
+  outer_if_false = control_projection(outer_if, 0)
+  outer_if_true = control_projection(outer_if, 1)
   outer_bound = dynamic_constant(#1)
   outer_outer_bound = dynamic_constant(#2)
   outer_outer_loop = region(start, outer_if_false)
   outer_outer_var = phi(outer_outer_loop, zero_var, outer_var)
   outer_outer_if  = if(outer_outer_loop, outer_outer_in_bounds)
-  outer_outer_if_false = projection(outer_outer_if, 0)
-  outer_outer_if_true = projection(outer_outer_if, 1)
+  outer_outer_if_false = control_projection(outer_outer_if, 0)
+  outer_outer_if_true = control_projection(outer_outer_if, 1)
   outer_outer_idx = phi(outer_outer_loop, zero_idx, outer_outer_idx_inc, outer_outer_idx)
   outer_outer_idx_inc = add(outer_outer_idx, one_idx)
   outer_outer_in_bounds = lt(outer_outer_idx, outer_outer_bound)
diff --git a/hercules_test/test_inputs/forkify/expected_fails.hir/bad_loop_tid_sum.hir b/hercules_test/test_inputs/forkify/expected_fails.hir/bad_loop_tid_sum.hir
index 8dda179bf36d82d29bbbda48686191fa46a02fb6..8f7d5e48032571d15e1632dcd58067555b91279b 100644
--- a/hercules_test/test_inputs/forkify/expected_fails.hir/bad_loop_tid_sum.hir
+++ b/hercules_test/test_inputs/forkify/expected_fails.hir/bad_loop_tid_sum.hir
@@ -11,6 +11,6 @@ fn loop<1>(a: u64) -> u64
   idx_inc = add(idx, one_idx)
   in_bounds = lt(idx, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, var_inc)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, var_inc)
diff --git a/hercules_test/test_inputs/forkify/inner_fork.hir b/hercules_test/test_inputs/forkify/inner_fork.hir
index e2c96a68b85ee605d5804baf338ada9b493e155f..c603dc42d350e4a9e516de9f9442ac3ae353e617 100644
--- a/hercules_test/test_inputs/forkify/inner_fork.hir
+++ b/hercules_test/test_inputs/forkify/inner_fork.hir
@@ -6,7 +6,7 @@ fn loop<2>(a: u32) -> i32
   inner_bound = dynamic_constant(#0)
   outer_bound = dynamic_constant(#1)
   outer_loop = region(start, inner_join)
-  outer_if_true = projection(outer_if, 1)
+  outer_if_true = control_projection(outer_if, 1)
   inner_fork = fork(outer_if_true, #0)
   inner_join = join(inner_fork)
   outer_var = phi(outer_loop, zero_var, inner_var)
@@ -17,6 +17,6 @@ fn loop<2>(a: u32) -> i32
   outer_idx_inc = add(outer_idx, one_idx)
   outer_in_bounds = lt(outer_idx, outer_bound)
   outer_if = if(outer_loop, outer_in_bounds)
-  outer_if_false = projection(outer_if, 0)
+  outer_if_false = control_projection(outer_if, 0)
   r = return(outer_if_false, outer_var)
- 
\ No newline at end of file
+ 
diff --git a/hercules_test/test_inputs/forkify/inner_fork_complex.hir b/hercules_test/test_inputs/forkify/inner_fork_complex.hir
index 91eb00fae9dd7e043155c1f6316e50b38337bad2..c9488f7f6d3a3ebe69ffb5cbaa4d75623542df55 100644
--- a/hercules_test/test_inputs/forkify/inner_fork_complex.hir
+++ b/hercules_test/test_inputs/forkify/inner_fork_complex.hir
@@ -8,14 +8,14 @@ fn loop<2>(a: u32) -> u64
   inner_bound = dynamic_constant(#0)
   outer_bound = dynamic_constant(#1)
   outer_loop = region(start, inner_condition_true_projection, inner_condition_false_projection )
-  outer_if_true = projection(outer_if, 1)
+  outer_if_true = control_projection(outer_if, 1)
   other_phi_weird = phi(outer_loop, zero_var, inner_var, other_phi_weird)
   inner_fork = fork(outer_if_true, #0)
   inner_join = join(inner_fork)
   inner_condition_eq = eq(outer_idx, two)
   inner_condition_if = if(inner_join, inner_condition_eq)
-  inner_condition_true_projection = projection(inner_condition_if, 1)
-  inner_condition_false_projection = projection(inner_condition_if, 0)
+  inner_condition_true_projection = control_projection(inner_condition_if, 1)
+  inner_condition_false_projection = control_projection(inner_condition_if, 0)
   outer_var = phi(outer_loop, zero_var, inner_var, inner_var)
   inner_var = reduce(inner_join, outer_var, inner_var_inc)
   inner_var_inc = add(inner_var, inner_var_inc_3)
@@ -26,7 +26,7 @@ fn loop<2>(a: u32) -> u64
   outer_idx_inc = add(outer_idx, one_idx)
   outer_in_bounds = lt(outer_idx, outer_bound)
   outer_if = if(outer_loop, outer_in_bounds)
-  outer_if_false = projection(outer_if, 0)
+  outer_if_false = control_projection(outer_if, 0)
   ret_val = add(outer_var, other_phi_weird)
   r = return(outer_if_false, ret_val)
- 
\ No newline at end of file
+ 
diff --git a/hercules_test/test_inputs/forkify/loop_array_sum.hir b/hercules_test/test_inputs/forkify/loop_array_sum.hir
index f9972b5917c200b93b5775fd4a6e501318e8c548..884d22d469c068f180b8a0724325541ee44f7da4 100644
--- a/hercules_test/test_inputs/forkify/loop_array_sum.hir
+++ b/hercules_test/test_inputs/forkify/loop_array_sum.hir
@@ -11,6 +11,6 @@ fn sum<1>(a: array(i32, #0)) -> i32
   red_add = add(red, read)
   in_bounds = lt(idx, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, red)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, red)
diff --git a/hercules_test/test_inputs/forkify/loop_simple_iv.hir b/hercules_test/test_inputs/forkify/loop_simple_iv.hir
index c25b9a2cf006b67087df0b8dc652f72400557090..c671b94c27f05d5de124c0a4e705f259668400da 100644
--- a/hercules_test/test_inputs/forkify/loop_simple_iv.hir
+++ b/hercules_test/test_inputs/forkify/loop_simple_iv.hir
@@ -7,6 +7,6 @@ fn loop<1>(a: u32) -> u64
   idx_inc = add(idx, one_idx)
   in_bounds = lt(idx, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, idx)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, idx)
diff --git a/hercules_test/test_inputs/forkify/loop_sum.hir b/hercules_test/test_inputs/forkify/loop_sum.hir
index fd9c4debc163600c01e661b127b166358ac9c6db..a236ddf7323cb673608f5341f74dcea9699a3f8d 100644
--- a/hercules_test/test_inputs/forkify/loop_sum.hir
+++ b/hercules_test/test_inputs/forkify/loop_sum.hir
@@ -11,6 +11,6 @@ fn loop<1>(a: u32) -> i32
   idx_inc = add(idx, one_idx)
   in_bounds = lt(idx, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, var)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, var)
diff --git a/hercules_test/test_inputs/forkify/loop_tid_sum.hir b/hercules_test/test_inputs/forkify/loop_tid_sum.hir
index 2d3ca34db88efa5007b5fb933f0bb0e4b55e63e4..6a1e2c56f5c821be9c04c192e1d33fee083669af 100644
--- a/hercules_test/test_inputs/forkify/loop_tid_sum.hir
+++ b/hercules_test/test_inputs/forkify/loop_tid_sum.hir
@@ -11,6 +11,6 @@ fn loop<1>(a: u64) -> u64
   idx_inc = add(idx, one_idx)
   in_bounds = lt(idx, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, var)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, var)
diff --git a/hercules_test/test_inputs/forkify/merged_phi_cycle.hir b/hercules_test/test_inputs/forkify/merged_phi_cycle.hir
index cee473a08740b48935d4ff571bc003bbd9908729..2b276d3ec1c560d6e014dfdd3c1ddc93374f8c2f 100644
--- a/hercules_test/test_inputs/forkify/merged_phi_cycle.hir
+++ b/hercules_test/test_inputs/forkify/merged_phi_cycle.hir
@@ -13,6 +13,6 @@ fn sum<1>(a: i32) -> u64
   second_red_add_2 = add(first_red_add, two)
   in_bounds = lt(idx_inc, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, first_red_add_2)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, first_red_add_2)
diff --git a/hercules_test/test_inputs/forkify/nested_loop2.hir b/hercules_test/test_inputs/forkify/nested_loop2.hir
index 0f29ec747dd67bae4c5b7d8b1250ead925257e9d..c3c7d8e5b7f0a3f23f28216ae4190f40edb0d7c5 100644
--- a/hercules_test/test_inputs/forkify/nested_loop2.hir
+++ b/hercules_test/test_inputs/forkify/nested_loop2.hir
@@ -17,9 +17,9 @@ fn loop<2>(a: u32) -> i32
   outer_idx_inc = add(outer_idx, one_idx)
   outer_in_bounds = lt(outer_idx, outer_bound)
   inner_if = if(inner_loop, inner_in_bounds)
-  inner_if_false = projection(inner_if, 0)
-  inner_if_true = projection(inner_if, 1)
+  inner_if_false = control_projection(inner_if, 0)
+  inner_if_true = control_projection(inner_if, 1)
   outer_if = if(outer_loop, outer_in_bounds)
-  outer_if_false = projection(outer_if, 0)
-  outer_if_true = projection(outer_if, 1)
-  r = return(outer_if_false, outer_var)
\ No newline at end of file
+  outer_if_false = control_projection(outer_if, 0)
+  outer_if_true = control_projection(outer_if, 1)
+  r = return(outer_if_false, outer_var)
diff --git a/hercules_test/test_inputs/forkify/nested_tid_sum.hir b/hercules_test/test_inputs/forkify/nested_tid_sum.hir
index 5539202d297d5124bd3258e56568c1614e4e942e..f7e4bda4112d62dd4598b0d73ccba583b12cdd4b 100644
--- a/hercules_test/test_inputs/forkify/nested_tid_sum.hir
+++ b/hercules_test/test_inputs/forkify/nested_tid_sum.hir
@@ -17,9 +17,9 @@ fn loop<2>(a: u32) -> u64
   outer_idx_inc = add(outer_idx, one_idx)
   outer_in_bounds = lt(outer_idx, outer_bound)
   inner_if = if(inner_loop, inner_in_bounds)
-  inner_if_false = projection(inner_if, 0)
-  inner_if_true = projection(inner_if, 1)
+  inner_if_false = control_projection(inner_if, 0)
+  inner_if_true = control_projection(inner_if, 1)
   outer_if = if(outer_loop, outer_in_bounds)
-  outer_if_false = projection(outer_if, 0)
-  outer_if_true = projection(outer_if, 1)
-  r = return(outer_if_false, outer_var)
\ No newline at end of file
+  outer_if_false = control_projection(outer_if, 0)
+  outer_if_true = control_projection(outer_if, 1)
+  r = return(outer_if_false, outer_var)
diff --git a/hercules_test/test_inputs/forkify/nested_tid_sum_2.hir b/hercules_test/test_inputs/forkify/nested_tid_sum_2.hir
index 9221fd47d857c9215a7b8912e68088b5809238b5..50634a2c93095fa0d891e8b54ad18fb0f0fbab88 100644
--- a/hercules_test/test_inputs/forkify/nested_tid_sum_2.hir
+++ b/hercules_test/test_inputs/forkify/nested_tid_sum_2.hir
@@ -18,9 +18,9 @@ fn loop<2>(a: u32) -> u64
   outer_idx_inc = add(outer_idx, one_idx)
   outer_in_bounds = lt(outer_idx, outer_bound)
   inner_if = if(inner_loop, inner_in_bounds)
-  inner_if_false = projection(inner_if, 0)
-  inner_if_true = projection(inner_if, 1)
+  inner_if_false = control_projection(inner_if, 0)
+  inner_if_true = control_projection(inner_if, 1)
   outer_if = if(outer_loop, outer_in_bounds)
-  outer_if_false = projection(outer_if, 0)
-  outer_if_true = projection(outer_if, 1)
-  r = return(outer_if_false, outer_var)
\ No newline at end of file
+  outer_if_false = control_projection(outer_if, 0)
+  outer_if_true = control_projection(outer_if, 1)
+  r = return(outer_if_false, outer_var)
diff --git a/hercules_test/test_inputs/forkify/phi_loop4.hir b/hercules_test/test_inputs/forkify/phi_loop4.hir
index e69ecc3daf264359426acd7b5dbf9ff84fd96c4c..9ce594da94a34065023ab1397f031cab9b7710ff 100644
--- a/hercules_test/test_inputs/forkify/phi_loop4.hir
+++ b/hercules_test/test_inputs/forkify/phi_loop4.hir
@@ -11,6 +11,6 @@ fn loop<1>(a: u32) -> i32
   idx_inc = add(idx, one_idx)
   in_bounds = lt(idx, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, var_inc)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, var_inc)
diff --git a/hercules_test/test_inputs/forkify/split_phi_cycle.hir b/hercules_test/test_inputs/forkify/split_phi_cycle.hir
index 96de73c8e054fb9cb45ade6dfe9150fcfc79334f..a233230bcb29152fa2d10382ae66884c4aba3f37 100644
--- a/hercules_test/test_inputs/forkify/split_phi_cycle.hir
+++ b/hercules_test/test_inputs/forkify/split_phi_cycle.hir
@@ -11,6 +11,6 @@ fn sum<1>(a: i32) -> u64
   first_red_add_2 = add(first_red_add, two)
   in_bounds = lt(idx_inc, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, first_red_add_2)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, first_red_add_2)
diff --git a/hercules_test/test_inputs/forkify/super_nested_loop.hir b/hercules_test/test_inputs/forkify/super_nested_loop.hir
index 6853efbfc2b620860644bc94486fb09a09e131f0..b568b85aa8a3a2912af3b1fa8c5b92d10a2a7ece 100644
--- a/hercules_test/test_inputs/forkify/super_nested_loop.hir
+++ b/hercules_test/test_inputs/forkify/super_nested_loop.hir
@@ -16,18 +16,18 @@ fn loop<3>(a: u32) -> i32
   outer_idx_inc = add(outer_idx, one_idx)
   outer_in_bounds = lt(outer_idx, outer_bound)
   inner_if = if(inner_loop, inner_in_bounds)
-  inner_if_false = projection(inner_if, 0)
-  inner_if_true = projection(inner_if, 1)
+  inner_if_false = control_projection(inner_if, 0)
+  inner_if_true = control_projection(inner_if, 1)
   outer_if = if(outer_loop, outer_in_bounds)
-  outer_if_false = projection(outer_if, 0)
-  outer_if_true = projection(outer_if, 1)
+  outer_if_false = control_projection(outer_if, 0)
+  outer_if_true = control_projection(outer_if, 1)
   outer_bound = dynamic_constant(#1)
   outer_outer_bound = dynamic_constant(#2)
   outer_outer_loop = region(start, outer_if_false)
   outer_outer_var = phi(outer_outer_loop, zero_var, outer_var)
   outer_outer_if  = if(outer_outer_loop, outer_outer_in_bounds)
-  outer_outer_if_false = projection(outer_outer_if, 0)
-  outer_outer_if_true = projection(outer_outer_if, 1)
+  outer_outer_if_false = control_projection(outer_outer_if, 0)
+  outer_outer_if_true = control_projection(outer_outer_if, 1)
   outer_outer_idx = phi(outer_outer_loop, zero_idx, outer_outer_idx_inc, outer_outer_idx)
   outer_outer_idx_inc = add(outer_outer_idx, one_idx)
   outer_outer_in_bounds = lt(outer_outer_idx, outer_outer_bound)
diff --git a/hercules_test/test_inputs/loop_analysis/alternate_bounds.hir b/hercules_test/test_inputs/loop_analysis/alternate_bounds.hir
index 4df92a18a9895c88cf27f143285999ef2218bfcf..a6ae209b9bb8661164022c12eb4d7425f69fa444 100644
--- a/hercules_test/test_inputs/loop_analysis/alternate_bounds.hir
+++ b/hercules_test/test_inputs/loop_analysis/alternate_bounds.hir
@@ -9,6 +9,6 @@ fn sum<1>(a: u32) -> u64
   red_add = add(red, one_idx)
   in_bounds = lt(idx_inc, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, red)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, red)
diff --git a/hercules_test/test_inputs/loop_analysis/alternate_bounds_internal_control.hir b/hercules_test/test_inputs/loop_analysis/alternate_bounds_internal_control.hir
index 8b4431bfb446237b6a66088d7a7d2339d9c889d1..9bd6b626d4ae38a1611ffa131be6933c141a9e0d 100644
--- a/hercules_test/test_inputs/loop_analysis/alternate_bounds_internal_control.hir
+++ b/hercules_test/test_inputs/loop_analysis/alternate_bounds_internal_control.hir
@@ -15,9 +15,9 @@ fn sum<1>(a: u64) -> u64
   red_add2 = add(red, inner_phi)
   in_bounds = lt(idx_inc, bound)
   if = if(inner_ctrl, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
   plus_ten = add(red_add, ten)
   red_add_2_plus_blah = add(red2, plus_ten)
   final_add = add(inner_phi, red_add_2_plus_blah)
-  r = return(if_false, final_add)
\ No newline at end of file
+  r = return(if_false, final_add)
diff --git a/hercules_test/test_inputs/loop_analysis/alternate_bounds_internal_control2.hir b/hercules_test/test_inputs/loop_analysis/alternate_bounds_internal_control2.hir
index f4adf6435968ddaccc285c8d6132e7c9dd91c973..2801a1656db8db1397d1b5d32dcbbd40acd9f76e 100644
--- a/hercules_test/test_inputs/loop_analysis/alternate_bounds_internal_control2.hir
+++ b/hercules_test/test_inputs/loop_analysis/alternate_bounds_internal_control2.hir
@@ -13,9 +13,9 @@ fn sum<1>(a: u64) -> u64
   red_add = add(red, two)
   in_bounds = lt(idx_inc, bound)
   if = if(inner_ctrl, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
   plus_ten = add(red_add, ten)
   red_add_2_plus_blah = add(inner_phi, plus_ten)
   final_add = add(inner_phi, red_add_2_plus_blah)
-  r = return(if_false, final_add)
\ No newline at end of file
+  r = return(if_false, final_add)
diff --git a/hercules_test/test_inputs/loop_analysis/alternate_bounds_nested_do_loop.hir b/hercules_test/test_inputs/loop_analysis/alternate_bounds_nested_do_loop.hir
index 52f701727c33305c0719e46aacf717bf8b220fcb..edbec0c5929cfb056d4015d81b775e2a5ba4bbbb 100644
--- a/hercules_test/test_inputs/loop_analysis/alternate_bounds_nested_do_loop.hir
+++ b/hercules_test/test_inputs/loop_analysis/alternate_bounds_nested_do_loop.hir
@@ -20,9 +20,9 @@ fn loop<2>(a: u64) -> u64
   outer_idx_inc = add(outer_idx, one_idx)
   outer_in_bounds = lt(outer_idx_inc, outer_bound)
   inner_if = if(inner_loop, inner_in_bounds)
-  inner_if_false = projection(inner_if, 0)
-  inner_if_true = projection(inner_if, 1)
+  inner_if_false = control_projection(inner_if, 0)
+  inner_if_true = control_projection(inner_if, 1)
   outer_if = if(inner_if_false, outer_in_bounds)
-  outer_if_false = projection(outer_if, 0)
-  outer_if_true = projection(outer_if, 1)
-  r = return(outer_if_false, inner_var_inc)
\ No newline at end of file
+  outer_if_false = control_projection(outer_if, 0)
+  outer_if_true = control_projection(outer_if, 1)
+  r = return(outer_if_false, inner_var_inc)
diff --git a/hercules_test/test_inputs/loop_analysis/alternate_bounds_nested_do_loop2.hir b/hercules_test/test_inputs/loop_analysis/alternate_bounds_nested_do_loop2.hir
index f295b39166fc16bb4560d9100bb84526281dda84..4e81871c1e6a7978d9fbafb912e27c3e0e62ff1c 100644
--- a/hercules_test/test_inputs/loop_analysis/alternate_bounds_nested_do_loop2.hir
+++ b/hercules_test/test_inputs/loop_analysis/alternate_bounds_nested_do_loop2.hir
@@ -17,9 +17,9 @@ fn loop<2>(a: u32) -> i32
   outer_idx_inc = add(outer_idx, one_idx)
   outer_in_bounds = lt(outer_idx_inc, outer_bound)
   inner_if = if(inner_loop, inner_in_bounds)
-  inner_if_false = projection(inner_if, 0)
-  inner_if_true = projection(inner_if, 1)
+  inner_if_false = control_projection(inner_if, 0)
+  inner_if_true = control_projection(inner_if, 1)
   outer_if = if(inner_if_false, outer_in_bounds)
-  outer_if_false = projection(outer_if, 0)
-  outer_if_true = projection(outer_if, 1)
-  r = return(outer_if_false, inner_var_inc)
\ No newline at end of file
+  outer_if_false = control_projection(outer_if, 0)
+  outer_if_true = control_projection(outer_if, 1)
+  r = return(outer_if_false, inner_var_inc)
diff --git a/hercules_test/test_inputs/loop_analysis/alternate_bounds_nested_do_loop_array.hir b/hercules_test/test_inputs/loop_analysis/alternate_bounds_nested_do_loop_array.hir
index e5401779a28503677f4a5e51c703c4197b433d4e..98477c91e40d6f0099aedb1ccc9b5e227aa8c7f4 100644
--- a/hercules_test/test_inputs/loop_analysis/alternate_bounds_nested_do_loop_array.hir
+++ b/hercules_test/test_inputs/loop_analysis/alternate_bounds_nested_do_loop_array.hir
@@ -20,9 +20,9 @@ fn loop<2>(a: array(u64, #1)) -> u64
   outer_idx_inc = add(outer_idx, one_idx)
   outer_in_bounds = lt(outer_idx_inc, outer_bound)
   inner_if = if(inner_loop, inner_in_bounds)
-  inner_if_false = projection(inner_if, 0)
-  inner_if_true = projection(inner_if, 1)
+  inner_if_false = control_projection(inner_if, 0)
+  inner_if_true = control_projection(inner_if, 1)
   outer_if = if(inner_if_false, outer_in_bounds)
-  outer_if_false = projection(outer_if, 0)
-  outer_if_true = projection(outer_if, 1)
-  r = return(outer_if_false, inner_var_inc)
\ No newline at end of file
+  outer_if_false = control_projection(outer_if, 0)
+  outer_if_true = control_projection(outer_if, 1)
+  r = return(outer_if_false, inner_var_inc)
diff --git a/hercules_test/test_inputs/loop_analysis/alternate_bounds_nested_do_loop_guarded.hir b/hercules_test/test_inputs/loop_analysis/alternate_bounds_nested_do_loop_guarded.hir
index b979ad42ce0522cc9b27d1fab07736cc73831590..eee77b6c22d13f11bd859e70d9a2deba26604fc3 100644
--- a/hercules_test/test_inputs/loop_analysis/alternate_bounds_nested_do_loop_guarded.hir
+++ b/hercules_test/test_inputs/loop_analysis/alternate_bounds_nested_do_loop_guarded.hir
@@ -5,8 +5,8 @@ fn loop<2>(a: u64) -> u64
   one_var = constant(u64, 1)
   ten = constant(u64, 10)
   outer_guard_if = if(start, outer_guard_lt)
-  outer_guard_if_false = projection(outer_guard_if, 0)
-  outer_guard_if_true = projection(outer_guard_if, 1)
+  outer_guard_if_false = control_projection(outer_guard_if, 0)
+  outer_guard_if_true = control_projection(outer_guard_if, 1)
   outer_guard_lt = lt(zero_idx, outer_bound)
   outer_join = region(outer_guard_if_false, outer_if_false)
   outer_join_var = phi(outer_join, zero_idx, join_var)
@@ -16,8 +16,8 @@ fn loop<2>(a: u64) -> u64
   inner_loop = region(guard_if_true, inner_if_true)
   guard_lt = lt(zero_idx, inner_bound)
   guard_if = if(outer_loop, guard_lt)
-  guard_if_true = projection(guard_if, 1)
-  guard_if_false = projection(guard_if, 0)
+  guard_if_true = control_projection(guard_if, 1)
+  guard_if_false = control_projection(guard_if, 0)
   guard_join = region(guard_if_false, inner_if_false)
   inner_idx = phi(inner_loop, zero_idx, inner_idx_inc)
   inner_idx_inc = add(inner_idx, one_idx)
@@ -26,15 +26,15 @@ fn loop<2>(a: u64) -> u64
   outer_idx_inc = add(outer_idx, one_idx)
   outer_in_bounds = lt(outer_idx_inc, outer_bound)
   inner_if = if(inner_loop, inner_in_bounds)
-  inner_if_false = projection(inner_if, 0)
-  inner_if_true = projection(inner_if, 1)
+  inner_if_false = control_projection(inner_if, 0)
+  inner_if_true = control_projection(inner_if, 1)
   outer_if = if(guard_join, outer_in_bounds)
-  outer_if_false = projection(outer_if, 0)
-  outer_if_true = projection(outer_if, 1)
+  outer_if_false = control_projection(outer_if, 0)
+  outer_if_true = control_projection(outer_if, 1)
   outer_var = phi(outer_loop, zero_var, join_var)
   inner_var = phi(inner_loop, outer_var, inner_var_inc)
   blah = mul(outer_idx, ten)
   blah2 = add(blah, inner_idx)
   inner_var_inc = add(inner_var, blah2)
   join_var = phi(guard_join, outer_var, inner_var_inc)
-  r = return(outer_join, outer_join_var)
\ No newline at end of file
+  r = return(outer_join, outer_join_var)
diff --git a/hercules_test/test_inputs/loop_analysis/alternate_bounds_use_after_loop.hir b/hercules_test/test_inputs/loop_analysis/alternate_bounds_use_after_loop.hir
index 2fe4ca57345dd0e6c4dd94e399dba58e3cab81a4..4a6e8cd64ac6d016200979db1b4c09731ac125a2 100644
--- a/hercules_test/test_inputs/loop_analysis/alternate_bounds_use_after_loop.hir
+++ b/hercules_test/test_inputs/loop_analysis/alternate_bounds_use_after_loop.hir
@@ -13,9 +13,9 @@ fn sum<1>(a: array(i32, #0)) -> i32
   red_add = add(red, read)
   in_bounds = lt(idx_inc, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
   plus_ten = add(red_add, ten)
   mult = mul(read, three)
   final = add(plus_ten, mult)
-  r = return(if_false, final)
\ No newline at end of file
+  r = return(if_false, final)
diff --git a/hercules_test/test_inputs/loop_analysis/alternate_bounds_use_after_loop2.hir b/hercules_test/test_inputs/loop_analysis/alternate_bounds_use_after_loop2.hir
index 760ae5ad690382c42e6760af690b18e5ea36a6b2..f735c8c6c1c41c00ea885d6a847e1a43ad7a34b3 100644
--- a/hercules_test/test_inputs/loop_analysis/alternate_bounds_use_after_loop2.hir
+++ b/hercules_test/test_inputs/loop_analysis/alternate_bounds_use_after_loop2.hir
@@ -13,9 +13,9 @@ fn sum<1>(a: array(i32, #0)) -> i32
   red_add = add(red, read)
   in_bounds = lt(idx_inc, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
   plus_ten = add(red, ten)
   mult = mul(read, three)
   final = add(plus_ten, mult)
-  r = return(if_false, final)
\ No newline at end of file
+  r = return(if_false, final)
diff --git a/hercules_test/test_inputs/loop_analysis/alternate_bounds_use_after_loop_no_tid.hir b/hercules_test/test_inputs/loop_analysis/alternate_bounds_use_after_loop_no_tid.hir
index 4b9375090dd5c13a127e9db85d7ce6dc8f2f7d75..c2f5e30a5cc826b10f1f5978b2d3fdaef5582351 100644
--- a/hercules_test/test_inputs/loop_analysis/alternate_bounds_use_after_loop_no_tid.hir
+++ b/hercules_test/test_inputs/loop_analysis/alternate_bounds_use_after_loop_no_tid.hir
@@ -11,7 +11,7 @@ fn sum<1>(a: u64) -> u64
   red_add = add(red, two)
   in_bounds = lt(idx_inc, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
   plus_ten = add(red_add, ten)
-  r = return(if_false, plus_ten)
\ No newline at end of file
+  r = return(if_false, plus_ten)
diff --git a/hercules_test/test_inputs/loop_analysis/alternate_bounds_use_after_loop_no_tid2.hir b/hercules_test/test_inputs/loop_analysis/alternate_bounds_use_after_loop_no_tid2.hir
index fd06eb7dd22f64022cc797a549946bfda5e8b7cf..f7a4af06b7b3502cc73d783bbb2f367b660594d8 100644
--- a/hercules_test/test_inputs/loop_analysis/alternate_bounds_use_after_loop_no_tid2.hir
+++ b/hercules_test/test_inputs/loop_analysis/alternate_bounds_use_after_loop_no_tid2.hir
@@ -12,8 +12,8 @@ fn sum<1>(a: u64) -> u64
   blah = phi(loop, zero_idx, red_add)
   in_bounds = lt(idx_inc, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
   plus_ten = add(red_add, ten)
   plus_blah = add(blah, red_add)
-  r = return(if_false, plus_blah)
\ No newline at end of file
+  r = return(if_false, plus_blah)
diff --git a/hercules_test/test_inputs/loop_analysis/broken_sum.hir b/hercules_test/test_inputs/loop_analysis/broken_sum.hir
index d15ef5613e271cd8685660785f5505dedbf40ec9..75b12350da88214c761654a47cffb0943015afa9 100644
--- a/hercules_test/test_inputs/loop_analysis/broken_sum.hir
+++ b/hercules_test/test_inputs/loop_analysis/broken_sum.hir
@@ -11,6 +11,6 @@ fn sum<1>(a: array(i32, #0)) -> i32
   red_add = add(red, read)
   in_bounds = lt(idx, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, red_add)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, red_add)
diff --git a/hercules_test/test_inputs/loop_analysis/do_loop_far_guard.hir b/hercules_test/test_inputs/loop_analysis/do_loop_far_guard.hir
index 4df92a18a9895c88cf27f143285999ef2218bfcf..a6ae209b9bb8661164022c12eb4d7425f69fa444 100644
--- a/hercules_test/test_inputs/loop_analysis/do_loop_far_guard.hir
+++ b/hercules_test/test_inputs/loop_analysis/do_loop_far_guard.hir
@@ -9,6 +9,6 @@ fn sum<1>(a: u32) -> u64
   red_add = add(red, one_idx)
   in_bounds = lt(idx_inc, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, red)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, red)
diff --git a/hercules_test/test_inputs/loop_analysis/do_loop_immediate_guard.hir b/hercules_test/test_inputs/loop_analysis/do_loop_immediate_guard.hir
index a4732cdeaa1f474548fba0293e21a900448d1791..bfdb673faffdc1835d5b3f96ea51da6331279c0a 100644
--- a/hercules_test/test_inputs/loop_analysis/do_loop_immediate_guard.hir
+++ b/hercules_test/test_inputs/loop_analysis/do_loop_immediate_guard.hir
@@ -4,8 +4,8 @@ fn sum<1>(a: u64) -> u64
   bound = dynamic_constant(#0)
   guard_lt = lt(zero_idx, bound)
   guard = if(start, guard_lt)
-  guard_true = projection(guard, 1)
-  guard_false = projection(guard, 0)
+  guard_true = control_projection(guard, 1)
+  guard_false = control_projection(guard, 0)
   loop = region(guard_true, if_true)
   inner_side_effect = region(loop)
   idx = phi(loop, zero_idx, idx_inc)
@@ -15,7 +15,7 @@ fn sum<1>(a: u64) -> u64
   join_phi = phi(final, zero_idx, red_add)
   in_bounds = lt(idx_inc, bound)
   if = if(inner_side_effect, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
   final = region(guard_false, if_false)
-  r = return(final, join_phi)
\ No newline at end of file
+  r = return(final, join_phi)
diff --git a/hercules_test/test_inputs/loop_analysis/do_loop_no_guard.hir b/hercules_test/test_inputs/loop_analysis/do_loop_no_guard.hir
index 9e22e14baba40dcda34de4a9d36c05dfe73f11eb..d48fe0622ad8b6f53024f929b90ac1962eb07154 100644
--- a/hercules_test/test_inputs/loop_analysis/do_loop_no_guard.hir
+++ b/hercules_test/test_inputs/loop_analysis/do_loop_no_guard.hir
@@ -10,6 +10,6 @@ fn sum<1>(a: u64) -> u64
   red_add = add(red, one_idx)
   in_bounds = lt(idx_inc, bound)
   if = if(inner_side_effect, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, red_add)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, red_add)
diff --git a/hercules_test/test_inputs/loop_analysis/do_while_separate_body.hir b/hercules_test/test_inputs/loop_analysis/do_while_separate_body.hir
index 42269040615520dd5ff2c151bd545a94445f520f..435b62686bd219b94824a71438e780538bf69738 100644
--- a/hercules_test/test_inputs/loop_analysis/do_while_separate_body.hir
+++ b/hercules_test/test_inputs/loop_analysis/do_while_separate_body.hir
@@ -11,6 +11,6 @@ fn sum<1>(a: i32) -> u64
   red_add = add(outer_red, idx)
   in_bounds = lt(idx_inc, bound)
   if = if(inner_region, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, inner_red)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, inner_red)
diff --git a/hercules_test/test_inputs/loop_analysis/do_while_separate_body2.hir b/hercules_test/test_inputs/loop_analysis/do_while_separate_body2.hir
index a751952dcde83e7ffc0ee64f506314724f7bd745..d1e2d4d64a46d40cb2ad0feb3c6bcbb9eeb0a8c1 100644
--- a/hercules_test/test_inputs/loop_analysis/do_while_separate_body2.hir
+++ b/hercules_test/test_inputs/loop_analysis/do_while_separate_body2.hir
@@ -13,6 +13,6 @@ fn sum<1>(a: i32) -> u64
   red_mul = mul(red_add, idx)
   in_bounds = lt(idx_inc, bound)
   if = if(inner_region, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, inner_red)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, inner_red)
diff --git a/hercules_test/test_inputs/loop_analysis/loop_array_sum.hir b/hercules_test/test_inputs/loop_analysis/loop_array_sum.hir
index f9972b5917c200b93b5775fd4a6e501318e8c548..884d22d469c068f180b8a0724325541ee44f7da4 100644
--- a/hercules_test/test_inputs/loop_analysis/loop_array_sum.hir
+++ b/hercules_test/test_inputs/loop_analysis/loop_array_sum.hir
@@ -11,6 +11,6 @@ fn sum<1>(a: array(i32, #0)) -> i32
   red_add = add(red, read)
   in_bounds = lt(idx, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, red)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, red)
diff --git a/hercules_test/test_inputs/loop_analysis/loop_body_count.hir b/hercules_test/test_inputs/loop_analysis/loop_body_count.hir
index c6f3cbf649484f9b00f0fcc9cd208a8b4811284f..5ec745ba4e2f65780c2d43b7c5769114b7adf431 100644
--- a/hercules_test/test_inputs/loop_analysis/loop_body_count.hir
+++ b/hercules_test/test_inputs/loop_analysis/loop_body_count.hir
@@ -11,6 +11,6 @@ fn loop<1>(a: u64) -> u64
   idx_inc = add(idx, one_idx)
   in_bounds = lt(idx, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, var)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, var)
diff --git a/hercules_test/test_inputs/loop_analysis/loop_sum.hir b/hercules_test/test_inputs/loop_analysis/loop_sum.hir
index fd9c4debc163600c01e661b127b166358ac9c6db..a236ddf7323cb673608f5341f74dcea9699a3f8d 100644
--- a/hercules_test/test_inputs/loop_analysis/loop_sum.hir
+++ b/hercules_test/test_inputs/loop_analysis/loop_sum.hir
@@ -11,6 +11,6 @@ fn loop<1>(a: u32) -> i32
   idx_inc = add(idx, one_idx)
   in_bounds = lt(idx, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, var)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, var)
diff --git a/hercules_test/test_inputs/loop_analysis/loop_trip_count.hir b/hercules_test/test_inputs/loop_analysis/loop_trip_count.hir
index b756f0901fb7a66a3feb83d1611aa1711bcb5601..799cc6d9d4db4b5527566cbd9f1f222979624bcb 100644
--- a/hercules_test/test_inputs/loop_analysis/loop_trip_count.hir
+++ b/hercules_test/test_inputs/loop_analysis/loop_trip_count.hir
@@ -12,8 +12,8 @@ fn loop<1>(b: prod(u64, u64)) -> prod(u64, u64)
   idx_inc = add(idx, one_idx)
   in_bounds = lt(idx, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
   tuple1 = write(c, var, field(0))
   tuple2 = write(tuple1, idx, field(1))
-  r = return(if_false, tuple2)
\ No newline at end of file
+  r = return(if_false, tuple2)
diff --git a/hercules_test/test_inputs/loop_analysis/loop_trip_count_tuple.hir b/hercules_test/test_inputs/loop_analysis/loop_trip_count_tuple.hir
index b756f0901fb7a66a3feb83d1611aa1711bcb5601..799cc6d9d4db4b5527566cbd9f1f222979624bcb 100644
--- a/hercules_test/test_inputs/loop_analysis/loop_trip_count_tuple.hir
+++ b/hercules_test/test_inputs/loop_analysis/loop_trip_count_tuple.hir
@@ -12,8 +12,8 @@ fn loop<1>(b: prod(u64, u64)) -> prod(u64, u64)
   idx_inc = add(idx, one_idx)
   in_bounds = lt(idx, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
   tuple1 = write(c, var, field(0))
   tuple2 = write(tuple1, idx, field(1))
-  r = return(if_false, tuple2)
\ No newline at end of file
+  r = return(if_false, tuple2)
diff --git a/hercules_test/test_inputs/simple2.hir b/hercules_test/test_inputs/simple2.hir
index af5ac284b0715a0d10de73571575fd8e2b8a1ac5..d4f1bebe754d08ecb48739f4499551452ffa78bc 100644
--- a/hercules_test/test_inputs/simple2.hir
+++ b/hercules_test/test_inputs/simple2.hir
@@ -8,6 +8,6 @@ fn simple2(x: i32) -> i32
   fac_acc = mul(fac, idx_inc)
   in_bounds = lt(idx_inc, x)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, fac_acc)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, fac_acc)
diff --git a/hercules_test/test_inputs/strset.hir b/hercules_test/test_inputs/strset.hir
index 4c8b32eeb1ab3875e053818ec7745e74f7b502f1..e8615f21e5a7c8d3148b1673f6e12b0fe6deaee8 100644
--- a/hercules_test/test_inputs/strset.hir
+++ b/hercules_test/test_inputs/strset.hir
@@ -12,6 +12,6 @@ fn strset<1>(str: array(u8, #0), byte: u8) -> array(u8, #0)
   continue = ne(read, byte)
   if_cond = and(continue, in_bounds)
   if = if(loop, if_cond)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
   r = return(if_false, str_inc)
diff --git a/hercules_test/test_inputs/sum_int1.hir b/hercules_test/test_inputs/sum_int1.hir
index 4a9ba0153448e4c9339e901d3ba3a10e027bad56..7de8cf1e606bf2f231ad3391fad50e7b04d32d93 100644
--- a/hercules_test/test_inputs/sum_int1.hir
+++ b/hercules_test/test_inputs/sum_int1.hir
@@ -11,6 +11,6 @@ fn sum<1>(a: array(i32, #0)) -> i32
   red_add = add(red, read)
   in_bounds = lt(idx_inc, bound)
   if = if(loop, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
-  r = return(if_false, red_add)
\ No newline at end of file
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
+  r = return(if_false, red_add)
diff --git a/hercules_test/test_inputs/sum_int2.hir b/hercules_test/test_inputs/sum_int2.hir
index b5e9a5c010275206c964708074219cf58568fe08..bc614d4e789364ad74fb81b9129f7c758c5cc685 100644
--- a/hercules_test/test_inputs/sum_int2.hir
+++ b/hercules_test/test_inputs/sum_int2.hir
@@ -11,8 +11,8 @@ fn alt_sum<1>(a: array(i32, #0)) -> i32
   rem = rem(idx, two_idx)
   odd = eq(rem, one_idx)
   negate_if = if(loop, odd)
-  negate_if_false = projection(negate_if, 0)
-  negate_if_true = projection(negate_if, 1)
+  negate_if_false = control_projection(negate_if, 0)
+  negate_if_true = control_projection(negate_if, 1)
   negate_bottom = region(negate_if_false, negate_if_true)
   read = read(a, position(idx))
   read_neg = neg(read)
@@ -20,6 +20,6 @@ fn alt_sum<1>(a: array(i32, #0)) -> i32
   red_add = add(red, read_phi)
   in_bounds = lt(idx_inc, bound)
   if = if(negate_bottom, in_bounds)
-  if_false = projection(if, 0)
-  if_true = projection(if, 1)
+  if_false = control_projection(if, 0)
+  if_true = control_projection(if, 1)
   r = return(if_false, red_add)