Go to the first, previous, next, last section, table of contents.
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 first, previous, next, last section, table of contents.