macro simpl!(X) {
  ccp(X);
  simplify-cfg(X);
  lift-dc-math(X);
  gvn(X);
  phi-elim(X);
  crc(X);
  slf(X);
  dce(X);
  infer-schedules(X);
}

simpl!(*);
inline(compute_step_factor, compute_flux, compute_flux_contribution, time_step);
no-memset(compute_step_factor@res, compute_flux@res, copy_vars@res);
delete-uncalled(*);
simpl!(*);
ip-sroa[true](*);
sroa[true](*);
predication(*);
const-inline(*);
simpl!(*);
fixpoint {
  forkify(*);
  fork-guard-elim(*);
}
simpl!(*);
unforkify(compute_flux@inner_loop);

if !feature("seq") {
  fork-tile[32, 0, false, false](compute_step_factor);
  let split = fork-split(compute_step_factor);
  let compute_step_factor_body = outline(split._4_compute_step_factor.fj1);
  fork-coalesce(compute_step_factor, compute_step_factor_body);
  simpl!(compute_step_factor, compute_step_factor_body);
  compute_step_factor = compute_step_factor_body;

  fork-tile[32, 0, false, false](compute_flux);
  let split = fork-split(compute_flux);
  let compute_flux_body = outline(split._6_compute_flux.fj1);
  fork-coalesce(compute_flux, compute_flux_body);
  simpl!(compute_flux, compute_flux_body);
  compute_flux = compute_flux_body;

  fork-tile[32, 0, false, false](time_step);
  let split = fork-split(time_step);
  let time_step_body = outline(split._7_time_step.fj1);
  fork-coalesce(time_step, time_step_body);
  simpl!(time_step, time_step_body);
  time_step = time_step_body;

  fork-tile[32, 0, false, false](copy_vars);
  let split = fork-split(copy_vars);
  let copy_vars_body = outline(split._8_copy_vars.fj1);
  fork-coalesce(copy_vars, copy_vars_body);
  simpl!(copy_vars, copy_vars_body);
  copy_vars = copy_vars_body;
}

unforkify(compute_step_factor, compute_flux, time_step, copy_vars);
gcm(*);