static bool lst_do_strip_mine (lst_p lst, int stride) { int i; lst_p l; bool res = false; int depth; if (!stride) stride = PARAM_VALUE (PARAM_LOOP_BLOCK_TILE_SIZE); if (!lst || !LST_LOOP_P (lst)) return false; FOR_EACH_VEC_ELT (lst_p, LST_SEQ (lst), i, l) res |= lst_do_strip_mine (l, stride); depth = lst_depth (lst); if (depth >= 0 && lst_strip_mine_profitable_p (lst, stride)) { res |= lst_do_strip_mine_loop (lst, lst_depth (lst), stride); lst_add_loop_under_loop (lst); } return res; }
static bool lst_do_strip_mine_loop (lst_p lst, int depth, int stride) { int i; lst_p l; poly_bb_p pbb; if (!lst) return false; if (LST_LOOP_P (lst)) { bool res = false; FOR_EACH_VEC_ELT (lst_p, LST_SEQ (lst), i, l) res |= lst_do_strip_mine_loop (l, depth, stride); return res; } pbb = LST_PBB (lst); return pbb_strip_mine_time_depth (pbb, psct_dynamic_dim (pbb, depth), stride); }
static int lst_do_strip_mine_loop (lst_p lst, int depth, int stride) { int i; lst_p l; poly_bb_p pbb; if (!lst) return 0; if (LST_LOOP_P (lst)) { int res = 0; FOR_EACH_VEC_ELT (LST_SEQ (lst), i, l) res += lst_do_strip_mine_loop (l, depth, stride); return res; } pbb = LST_PBB (lst); pbb_strip_mine_time_depth (pbb, psct_dynamic_dim (pbb, depth), stride); return 1; }