isl_union_eval.c
1.81 KB
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
/*
* 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);
}
/* Do the tuples of "space" correspond to those of the domain of "part"?
* That is, is the domain space of "part" equal to "space", ignoring parameters?
*/
static isl_bool FN(UNION,has_domain_space_tuples)(const void *entry,
const void *val)
{
PART *part = (PART *)entry;
isl_space *space = (isl_space *) val;
return FN(PART,has_domain_space_tuples)(part, space);
}
__isl_give isl_val *FN(UNION,eval)(__isl_take UNION *u,
__isl_take isl_point *pnt)
{
uint32_t hash;
struct isl_hash_table_entry *entry;
isl_bool is_void;
isl_space *space;
isl_val *v;
if (!u || !pnt)
goto error;
is_void = isl_point_is_void(pnt);
if (is_void < 0)
goto error;
if (is_void)
return FN(UNION,eval_void)(u, pnt);
space = isl_space_copy(pnt->dim);
if (!space)
goto error;
hash = isl_space_get_hash(space);
entry = isl_hash_table_find(u->space->ctx, &u->table,
hash, &FN(UNION,has_domain_space_tuples),
space, 0);
isl_space_free(space);
if (!entry)
goto error;
if (entry == isl_hash_table_entry_none) {
v = isl_val_zero(isl_point_get_ctx(pnt));
isl_point_free(pnt);
} else {
v = FN(PART,eval)(FN(PART,copy)(entry->data), pnt);
}
FN(UNION,free)(u);
return v;
error:
FN(UNION,free)(u);
isl_point_free(pnt);
return NULL;
}