brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 40396b6 Raw
102 lines · c
1/*2 * Copyright 2010      INRIA Saclay3 * Copyright 2013      Ecole Normale Superieure4 *5 * Use of this software is governed by the MIT license6 *7 * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,8 * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,9 * 91893 Orsay, France10 * and Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France11 */12 13#include <isl/val.h>14#include <isl_space_private.h>15#include <isl_point_private.h>16 17#include <isl_pw_macro.h>18 19#undef SUFFIX20#define SUFFIX	point21#undef ARG122#define ARG1	PW23#undef ARG224#define ARG2	isl_point25 26static27#include "isl_align_params_templ.c"28 29/* Evaluate "pw" in the void point "pnt".30 * In particular, return the value NaN.31 */32static __isl_give isl_val *FN(PW,eval_void)(__isl_take PW *pw,33	__isl_take isl_point *pnt)34{35	isl_ctx *ctx;36 37	ctx = isl_point_get_ctx(pnt);38	FN(PW,free)(pw);39	isl_point_free(pnt);40	return isl_val_nan(ctx);41}42 43/* Evaluate the piecewise function "pw" in "pnt".44 * If the point is void, then return NaN.45 * If the point lies outside the domain of "pw", then return 0 or NaN46 * depending on whether 0 is the default value for this type of function.47 *48 * Align the parameters if needed, but "pnt" should specify a value49 * for all parameters in "pw".50 */51__isl_give isl_val *FN(PW,eval)(__isl_take PW *pw, __isl_take isl_point *pnt)52{53	int i;54	isl_bool is_void;55	isl_bool found;56	isl_ctx *ctx;57	isl_bool ok;58	isl_space *pnt_space, *pw_space;59	isl_val *v;60 61	FN(PW,align_params_point)(&pw, &pnt);62 63	pnt_space = isl_point_peek_space(pnt);64	pw_space = FN(PW,peek_space)(pw);65	ok = isl_space_is_domain_internal(pnt_space, pw_space);66	if (ok < 0)67		goto error;68	ctx = isl_point_get_ctx(pnt);69	if (!ok)70		isl_die(ctx, isl_error_invalid,71			"incompatible spaces", goto error);72	is_void = isl_point_is_void(pnt);73	if (is_void < 0)74		goto error;75	if (is_void)76		return FN(PW,eval_void)(pw, pnt);77 78	found = isl_bool_false;79	for (i = 0; i < pw->n; ++i) {80		found = isl_set_contains_point(pw->p[i].set, pnt);81		if (found < 0)82			goto error;83		if (found)84			break;85	}86	if (found) {87		v = FN(EL,eval)(FN(EL,copy)(pw->p[i].FIELD),88					    isl_point_copy(pnt));89	} else if (DEFAULT_IS_ZERO) {90		v = isl_val_zero(ctx);91	} else {92		v = isl_val_nan(ctx);93	}94	FN(PW,free)(pw);95	isl_point_free(pnt);96	return v;97error:98	FN(PW,free)(pw);99	isl_point_free(pnt);100	return NULL;101}102