예제 #1
0
int has_spatial_reuse(Stmt *stmt, PlutoAccess *acc, int depth)
{
    int i, *divs;
    PlutoMatrix *newacc = pluto_get_new_access_func(stmt, acc->mat, &divs);
    assert(depth <= newacc->ncols-1);

    /* Scalars */
    if (newacc->nrows == 0) return 0;

    for (i=0; i<newacc->nrows-1; i++) {
        /* No spatial reuse when the func is varying at a non-innermost dim */
        if (newacc->val[i][depth] != 0) {
            pluto_matrix_free(newacc);
            free(divs);
            return 0;
        }
    }

    if (newacc->val[newacc->nrows-1][depth] >= 1 &&
            newacc->val[newacc->nrows-1][depth] <= SHORT_STRIDE) {
        pluto_matrix_free(newacc);
        free(divs);
        return 1;
    }

    pluto_matrix_free(newacc);
    free(divs);

    return 0;
}
예제 #2
0
int is_invariant(Stmt *stmt, PlutoAccess *acc, int depth)
{
    int i, *divs;
    PlutoMatrix *newacc = pluto_get_new_access_func(stmt, acc->mat, &divs);
    assert(depth <= newacc->ncols-1);
    for (i=0; i<newacc->nrows; i++) {
        if (newacc->val[i][depth] != 0) break;
    }
    int is_invariant = (i==newacc->nrows);
    pluto_matrix_free(newacc);
    return is_invariant;
}
예제 #3
0
int has_spatial_reuse(Stmt *stmt, PlutoAccess *acc, int depth)
{
    int i, *divs;
    PlutoMatrix *newacc = pluto_get_new_access_func(stmt, acc->mat, &divs);
    assert(depth <= newacc->ncols-1);
    for (i=0; i<newacc->nrows-1; i++) {
        if (newacc->val[i][depth] != 0) {
            pluto_matrix_free(newacc);
            return 0;
        }
    }
    if (newacc->val[newacc->nrows-1][depth] >= 1 &&
            newacc->val[newacc->nrows-1][depth] <= SHORT_STRIDE) {
        pluto_matrix_free(newacc);
        return 1;
    }

    pluto_matrix_free(newacc);

    return 0;
}