Go to the previous, next section.
The following procedure will take a tree_for as an argument and
will produce a system of inequalities (a named_lin_ineq) that
represent the iteration space of the loop.
named_lin_ineq * include_for(tree_for * tf)
{
// the index variable name
immed idx(tf->index());
// Find the lower bound
// create an array_info class to extract linear function of the bounds
array_info * lb_ai = new array_info;
append_to_list(lb_ai, tf->lb_op(), tf, io_max, TRUE);
named_lin_ineq * cl;
// convert the bounds to named linear inequality class
cl = named_lin_ineq::mk_named_lin_ineq(lb_ai, idx, TRUE);
if(cl == NULL) {
printf("Unknown lower bound\n");
return NULL;
}
// Find the upper bound
array_info * ub_ai = new array_info;
append_to_list(ub_ai, tf->ub_op(), tf, io_min, TRUE);
named_lin_ineq * cu;
cu = named_lin_ineq::mk_named_lin_ineq(*ub_ai, idx, FALSE);
if(cu == NULL) {
printf("Unknown upper bound\n");
delete cl;
return NULL;
}
// add the lower bound and upper bound togther
cu = named_lin_ineq::and(cl, cu, 0, 1);
// Find the step
access_vector * stp_av = new access_vector(tf->step_op(), tf, TRUE);
named_lin_ineq * stp;
stp = named_lin_ineq::mk_named_lin_ineq(stp_av, idx, FALSE);
boolean stpbad = TRUE;
if(stp) // check bad step size
if((stp->n() == 2)&& // no sym variables
(stp->ineqs().m() == 1)) // no max or mins
if(stp->ineqs()[0][0] == 1) // nont step
stpbad = FALSE;
if(stpbad) {
printf("Unknown or non-unit step size\n");
delete cl;
delete cu;
if(stp) delete stp;
return NULL;
}
cu->cleanup();
delete cl;
delete stp;
return cu;
}
Go to the previous, next section.