/* 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; }
/* Return "lhs && rhs", defined on the shared definition domain. */ __isl_give isl_pw_aff *pet_and(__isl_take isl_pw_aff *lhs, __isl_take isl_pw_aff *rhs) { isl_set *cond; isl_set *dom; dom = isl_set_intersect(isl_pw_aff_domain(isl_pw_aff_copy(lhs)), isl_pw_aff_domain(isl_pw_aff_copy(rhs))); cond = isl_set_intersect(isl_pw_aff_non_zero_set(lhs), isl_pw_aff_non_zero_set(rhs)); return indicator_function(cond, dom); }
/* Construct the required skip conditions within the context "pc", * given the if condition "cond". */ void pet_skip_info_if_extract_cond(struct pet_skip_info *skip, __isl_keep isl_pw_aff *cond, __isl_keep pet_context *pc, struct pet_state *state) { isl_multi_pw_aff *test; if (!skip->skip[pet_skip_now] && !skip->skip[pet_skip_later]) return; test = isl_multi_pw_aff_from_pw_aff(isl_pw_aff_copy(cond)); pet_skip_info_if_extract_index(skip, test, pc, state); isl_multi_pw_aff_free(test); }
/* Return "!!pa", i.e., a function that is equal to 1 when "pa" * is non-zero and equal to 0 when "pa" is equal to zero, * on the domain of "pa". * * If "pa" involves any NaN, then return NaN. */ __isl_give isl_pw_aff *pet_to_bool(__isl_take isl_pw_aff *pa) { isl_set *cond, *dom; if (!pa) return NULL; if (isl_pw_aff_involves_nan(pa)) { isl_space *space = isl_pw_aff_get_domain_space(pa); isl_local_space *ls = isl_local_space_from_space(space); isl_pw_aff_free(pa); return isl_pw_aff_nan_on_domain(ls); } dom = isl_pw_aff_domain(isl_pw_aff_copy(pa)); cond = isl_pw_aff_non_zero_set(pa); pa = indicator_function(cond, dom); return pa; }
/* Return "lhs || rhs", with shortcut semantics. * That is, if lhs is true, then the result is defined even if rhs is not. * In practice, we compute lhs ? lhs : rhs. */ static __isl_give isl_pw_aff *pw_aff_or_else(__isl_take isl_pw_aff *lhs, __isl_take isl_pw_aff *rhs) { return isl_pw_aff_cond(isl_pw_aff_copy(lhs), lhs, rhs); }
/* Return "lhs && rhs", with shortcut semantics. * That is, if lhs is false, then the result is defined even if rhs is not. * In practice, we compute lhs ? rhs : lhs. */ static __isl_give isl_pw_aff *pw_aff_and_then(__isl_take isl_pw_aff *lhs, __isl_take isl_pw_aff *rhs) { return isl_pw_aff_cond(isl_pw_aff_copy(lhs), rhs, lhs); }