X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_union_templ.c;h=c06069db3efdcf0973d8cd48c82f904ba5948050;hb=bbf85ab5afe150c925b01e126c438784b015230a;hp=36a25d3e5bb2926ebf35ff74900b76a3443f6ba4;hpb=e2af3e04e42a1edfdffe87794bdeb1e47e9ff0d6;p=platform%2Fupstream%2Fisl.git diff --git a/isl_union_templ.c b/isl_union_templ.c index 36a25d3..c06069d 100644 --- a/isl_union_templ.c +++ b/isl_union_templ.c @@ -46,7 +46,10 @@ static __isl_give UNION *FN(UNION,alloc)(__isl_take isl_dim *dim, int size) { UNION *u; - u = isl_calloc_type(ctx, UNION); + if (!dim) + return NULL; + + u = isl_calloc_type(dim->ctx, UNION); if (!u) return NULL; @@ -120,6 +123,31 @@ static int has_dim(const void *entry, const void *val) return isl_dim_equal(part->dim, dim); } +__isl_give PART *FN(FN(UNION,extract),PARTS)(__isl_keep UNION *u, + __isl_take isl_dim *dim) +{ + uint32_t hash; + struct isl_hash_table_entry *entry; + + if (!u || !dim) + goto error; + + hash = isl_dim_get_hash(dim); + entry = isl_hash_table_find(u->dim->ctx, &u->table, hash, + &has_dim, dim, 0); + if (!entry) +#ifdef HAS_TYPE + return FN(PART,zero)(dim, u->type); +#else + return FN(PART,zero)(dim); +#endif + isl_dim_free(dim); + return FN(PART,copy)(entry->data); +error: + isl_dim_free(dim); + return NULL; +} + __isl_give UNION *FN(FN(UNION,add),PARTS)(__isl_take UNION *u, __isl_take PART *part) { @@ -229,8 +257,68 @@ void FN(UNION,free)(__isl_take UNION *u) free(u); } +S(UNION,align) { + isl_reordering *exp; + UNION *res; +}; + +static int align_entry(__isl_take PART *part, void *user) +{ + isl_reordering *exp; + S(UNION,align) *data = user; + + exp = isl_reordering_extend_dim(isl_reordering_copy(data->exp), + FN(PART,get_dim)(part)); + + data->res = FN(FN(UNION,add),PARTS)(data->res, + FN(PART,realign)(part, exp)); + + return 0; +} + +__isl_give UNION *FN(UNION,align_params)(__isl_take UNION *u, + __isl_take isl_dim *model) +{ + S(UNION,align) data = { NULL, NULL }; + + if (!u || !model) + goto error; + + if (isl_dim_match(u->dim, isl_dim_param, model, isl_dim_param)) { + isl_dim_free(model); + return u; + } + + data.exp = isl_parameter_alignment_reordering(u->dim, model); + if (!data.exp) + goto error; + +#ifdef HAS_TYPE + data.res = FN(UNION,alloc)(isl_dim_copy(data.exp->dim), + u->type, u->table.n); +#else + data.res = FN(UNION,alloc)(isl_dim_copy(data.exp->dim), u->table.n); +#endif + if (FN(FN(UNION,foreach),PARTS)(u, &align_entry, &data) < 0) + goto error; + + isl_reordering_free(data.exp); + FN(UNION,free)(u); + isl_dim_free(model); + return data.res; +error: + isl_reordering_free(data.exp); + FN(UNION,free)(u); + FN(UNION,free)(data.res); + isl_dim_free(model); + return NULL; +} + __isl_give UNION *FN(UNION,add)(__isl_take UNION *u1, __isl_take UNION *u2) { + u1 = FN(UNION,align_params)(u1, FN(UNION,get_dim)(u2)); + u2 = FN(UNION,align_params)(u2, FN(UNION,get_dim)(u1)); + u1 = FN(UNION,cow)(u1); if (!u1 || !u2) @@ -274,14 +362,24 @@ S(UNION,match_bin_data) { UNION *res; }; +/* This function is currently only used from isl_polynomial.c + * and not from isl_fold.c. + */ +static __isl_give UNION *match_bin_op(__isl_take UNION *u1, + __isl_take UNION *u2, + int (*fn)(void **, void *)) __attribute__ ((unused)); static __isl_give UNION *match_bin_op(__isl_take UNION *u1, __isl_take UNION *u2, int (*fn)(void **, void *)) { - S(UNION,match_bin_data) data = { u2, NULL }; + S(UNION,match_bin_data) data = { NULL, NULL }; + + u1 = FN(UNION,align_params)(u1, FN(UNION,get_dim)(u2)); + u2 = FN(UNION,align_params)(u2, FN(UNION,get_dim)(u1)); if (!u1 || !u2) goto error; + data.u2 = u2; #ifdef HAS_TYPE data.res = FN(UNION,alloc)(isl_dim_copy(u1->dim), u1->type, u1->table.n); #else @@ -319,7 +417,6 @@ static int match_set_entry(void **entry, void *user) S(UNION,match_set_data) *data = user; uint32_t hash; struct isl_hash_table_entry *entry2; - isl_dim *dim; PW *pw = *entry; int empty; @@ -351,11 +448,15 @@ static __isl_give UNION *match_set_op(__isl_take UNION *u, __isl_take isl_union_set *uset, __isl_give PW *(*fn)(__isl_take PW*, __isl_take isl_set*)) { - S(UNION,match_set_data) data = { uset, NULL, fn }; + S(UNION,match_set_data) data = { NULL, NULL, fn }; + + u = FN(UNION,align_params)(u, isl_union_set_get_dim(uset)); + uset = isl_union_set_align_params(uset, FN(UNION,get_dim)(u)); if (!u || !uset) goto error; + data.uset = uset; #ifdef HAS_TYPE data.res = FN(UNION,alloc)(isl_dim_copy(u->dim), u->type, u->table.n); #else @@ -465,3 +566,49 @@ error: FN(UNION,free)(u); return NULL; } + +static int mul_isl_int(void **entry, void *user) +{ + PW **pw = (PW **)entry; + isl_int *v = user; + + *pw = FN(PW,mul_isl_int)(*pw, *v); + if (!*pw) + return -1; + + return 0; +} + +__isl_give UNION *FN(UNION,mul_isl_int)(__isl_take UNION *u, isl_int v) +{ + if (isl_int_is_one(v)) + return u; + + if (u && isl_int_is_zero(v)) { + UNION *zero; + isl_dim *dim = FN(UNION,get_dim)(u); +#ifdef HAS_TYPE + zero = FN(UNION,zero)(dim, u->type); +#else + zero = FN(UNION,zero)(dim); +#endif + FN(UNION,free)(u); + return zero; + } + + u = FN(UNION,cow)(u); + if (!u) + return NULL; + +#ifdef HAS_TYPE + if (isl_int_is_neg(v)) + u->type = isl_fold_type_negate(u->type); +#endif + if (isl_hash_table_foreach(u->dim->ctx, &u->table, &mul_isl_int, v) < 0) + goto error; + + return u; +error: + FN(UNION,free)(u); + return NULL; +}