summaryrefslogtreecommitdiff
path: root/cloog-core/source/stride.c
blob: d7358a08f3d6c21b871764de0de5d9d0d93cab51 (plain)
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
#include <stdlib.h>
#include <cloog/cloog.h>

#define ALLOC(type) (type*)malloc(sizeof(type))

CloogStride *cloog_stride_malloc()
{
	CloogStride *s;

	s = ALLOC(CloogStride);
	if (!s)
		cloog_die("memory overflow.\n");

	s->references = 1;
	cloog_int_init(s->stride);
	cloog_int_init(s->offset);
	cloog_int_init(s->factor);
	s->constraint = cloog_constraint_invalid();

	return s;
}

CloogStride *cloog_stride_alloc(cloog_int_t stride, cloog_int_t offset)
{
	CloogStride *s = cloog_stride_malloc();

	cloog_int_set(s->stride, stride);
	cloog_int_set(s->offset, offset);
	cloog_int_set_si(s->factor, 0);

	return s;
}

CloogStride *cloog_stride_alloc_from_constraint(cloog_int_t stride,
	CloogConstraint *constraint, cloog_int_t factor)
{
	CloogStride *s = cloog_stride_malloc();

	cloog_int_set(s->stride, stride);
	cloog_int_set(s->factor, factor);
	cloog_int_set_si(s->offset, -1);
	s->constraint = constraint;

	return s;
}

CloogStride *cloog_stride_copy(CloogStride *stride)
{
	if (!stride)
		return stride;

	stride->references++;
	return stride;
}

void cloog_stride_free(CloogStride *stride)
{
	if (!stride)
		return;

	stride->references--;
	if (stride->references > 0)
		return;

	cloog_int_clear(stride->stride);
	cloog_int_clear(stride->offset);
	cloog_int_clear(stride->factor);
	cloog_constraint_release(stride->constraint);
	free(stride);
}