brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · 050eb8a Raw
83 lines · c
1/*2 * Copyright 2010      INRIA Saclay3 *4 * Use of this software is governed by the MIT license5 *6 * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,7 * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,8 * 91893 Orsay, France9 */10 11#include <isl_union_macro.h>12 13/* Evaluate "u" in the void point "pnt".14 * In particular, return the value NaN.15 */16static __isl_give isl_val *FN(UNION,eval_void)(__isl_take UNION *u,17	__isl_take isl_point *pnt)18{19	isl_ctx *ctx;20 21	ctx = isl_point_get_ctx(pnt);22	FN(UNION,free)(u);23	isl_point_free(pnt);24	return isl_val_nan(ctx);25}26 27/* Internal data structure for isl_union_*_eval.28 *29 * "pnt" is the point in which the function is evaluated.30 * "v" stores the result and is initialized to zero.31 */32S(UNION,eval_data) {33	isl_point *pnt;34	isl_val *v;35};36 37/* Update the evaluation in data->v based on the evaluation of "part".38 *39 * Only (at most) a single part on which this function is called40 * is assumed to evaluate to anything other than zero.41 * Since the value is initialized to zero, the evaluation of "part"42 * can simply be added.43 */44static isl_stat FN(UNION,eval_entry)(__isl_take PART *part, void *user)45{46	S(UNION,eval_data) *data = user;47	isl_val *v;48 49	v = FN(PART,eval)(part, isl_point_copy(data->pnt));50	data->v = isl_val_add(data->v, v);51 52	return isl_stat_non_null(data->v);53}54 55/* Evaluate "u" in the point "pnt".56 */57__isl_give isl_val *FN(UNION,eval)(__isl_take UNION *u,58	__isl_take isl_point *pnt)59{60	S(UNION,eval_data) data = { pnt };61	isl_bool is_void;62	isl_space *space;63 64	is_void = isl_point_is_void(pnt);65	if (is_void < 0)66		goto error;67	if (is_void)68		return FN(UNION,eval_void)(u, pnt);69 70	data.v = isl_val_zero(isl_point_get_ctx(pnt));71	space = isl_point_peek_space(pnt);72	if (FN(UNION,foreach_on_domain)(u, space,73					&FN(UNION,eval_entry), &data) < 0)74		data.v = isl_val_free(data.v);75	FN(UNION,free)(u);76	isl_point_free(pnt);77	return data.v;78error:79	FN(UNION,free)(u);80	isl_point_free(pnt);81	return NULL;82}83