aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/llvm16/tools/polly/lib/External/isl/isl_union_eval.c
blob: 050eb8af289c416af50bd8c61dde4afb2aeb78c1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*
 * Copyright 2010      INRIA Saclay
 *
 * Use of this software is governed by the MIT license
 *
 * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
 * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
 * 91893 Orsay, France
 */

#include <isl_union_macro.h>

/* Evaluate "u" in the void point "pnt".
 * In particular, return the value NaN.
 */
static __isl_give isl_val *FN(UNION,eval_void)(__isl_take UNION *u,
	__isl_take isl_point *pnt)
{
	isl_ctx *ctx;

	ctx = isl_point_get_ctx(pnt);
	FN(UNION,free)(u);
	isl_point_free(pnt);
	return isl_val_nan(ctx);
}

/* Internal data structure for isl_union_*_eval.
 *
 * "pnt" is the point in which the function is evaluated.
 * "v" stores the result and is initialized to zero.
 */
S(UNION,eval_data) {
	isl_point *pnt;
	isl_val *v;
};

/* Update the evaluation in data->v based on the evaluation of "part".
 *
 * Only (at most) a single part on which this function is called
 * is assumed to evaluate to anything other than zero.
 * Since the value is initialized to zero, the evaluation of "part"
 * can simply be added.
 */
static isl_stat FN(UNION,eval_entry)(__isl_take PART *part, void *user)
{
	S(UNION,eval_data) *data = user;
	isl_val *v;

	v = FN(PART,eval)(part, isl_point_copy(data->pnt));
	data->v = isl_val_add(data->v, v);

	return isl_stat_non_null(data->v);
}

/* Evaluate "u" in the point "pnt".
 */
__isl_give isl_val *FN(UNION,eval)(__isl_take UNION *u,
	__isl_take isl_point *pnt)
{
	S(UNION,eval_data) data = { pnt };
	isl_bool is_void;
	isl_space *space;

	is_void = isl_point_is_void(pnt);
	if (is_void < 0)
		goto error;
	if (is_void)
		return FN(UNION,eval_void)(u, pnt);

	data.v = isl_val_zero(isl_point_get_ctx(pnt));
	space = isl_point_peek_space(pnt);
	if (FN(UNION,foreach_on_domain)(u, space,
					&FN(UNION,eval_entry), &data) < 0)
		data.v = isl_val_free(data.v);
	FN(UNION,free)(u);
	isl_point_free(pnt);
	return data.v;
error:
	FN(UNION,free)(u);
	isl_point_free(pnt);
	return NULL;
}