/* If the id has a negative refcount, then it is a static isl_id * and should not be freed. */ void *isl_id_free(__isl_take isl_id *id) { struct isl_hash_table_entry *entry; if (!id) return NULL; if (id->ref < 0) return NULL; if (--id->ref > 0) return NULL; entry = isl_hash_table_find(id->ctx, &id->ctx->id_table, id->hash, isl_id_eq, id, 0); if (!entry) isl_die(id->ctx, isl_error_unknown, "unable to find id", (void)0); else isl_hash_table_remove(id->ctx, &id->ctx->id_table, entry); if (id->free_user) id->free_user(id->user); free((char *)id->name); isl_ctx_deref(id->ctx); free(id); return NULL; }
/* Return the result of applying the comparison operator "type" * to "pa1" and "pa2". * * In particular, construct an isl_pw_aff that is equal to 1 * on the subset of the shared domain of "pa1" and "pa2" where * the comparison holds and 0 on the other part of the shared domain. * * If "pa1" or "pa2" involve any NaN, then return NaN. */ __isl_give isl_pw_aff *pet_comparison(enum pet_op_type type, __isl_take isl_pw_aff *pa1, __isl_take isl_pw_aff *pa2) { isl_set *dom; isl_set *cond; isl_pw_aff *res; if (!pa1 || !pa2) goto error; if (isl_pw_aff_involves_nan(pa1) || isl_pw_aff_involves_nan(pa2)) { isl_space *space = isl_pw_aff_get_domain_space(pa1); isl_local_space *ls = isl_local_space_from_space(space); isl_pw_aff_free(pa1); isl_pw_aff_free(pa2); return isl_pw_aff_nan_on_domain(ls); } dom = isl_pw_aff_domain(isl_pw_aff_copy(pa1)); dom = isl_set_intersect(dom, isl_pw_aff_domain(isl_pw_aff_copy(pa2))); switch (type) { case pet_op_lt: cond = isl_pw_aff_lt_set(pa1, pa2); break; case pet_op_le: cond = isl_pw_aff_le_set(pa1, pa2); break; case pet_op_gt: cond = isl_pw_aff_gt_set(pa1, pa2); break; case pet_op_ge: cond = isl_pw_aff_ge_set(pa1, pa2); break; case pet_op_eq: cond = isl_pw_aff_eq_set(pa1, pa2); break; case pet_op_ne: cond = isl_pw_aff_ne_set(pa1, pa2); break; default: isl_die(isl_pw_aff_get_ctx(pa1), isl_error_internal, "not a comparison operator", cond = NULL); isl_pw_aff_free(pa1); isl_pw_aff_free(pa2); } cond = isl_set_coalesce(cond); res = indicator_function(cond, dom); return res; error: isl_pw_aff_free(pa1); isl_pw_aff_free(pa2); return NULL; }