summaryrefslogtreecommitdiffstats
path: root/polly/lib/External/ppcg/gpu_array_tile.c
diff options
context:
space:
mode:
Diffstat (limited to 'polly/lib/External/ppcg/gpu_array_tile.c')
-rw-r--r--polly/lib/External/ppcg/gpu_array_tile.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/polly/lib/External/ppcg/gpu_array_tile.c b/polly/lib/External/ppcg/gpu_array_tile.c
new file mode 100644
index 00000000000..b358f2b8e4a
--- /dev/null
+++ b/polly/lib/External/ppcg/gpu_array_tile.c
@@ -0,0 +1,71 @@
+#include <isl/aff.h>
+#include <isl/map.h>
+
+#include "gpu_array_tile.h"
+
+struct gpu_array_tile *gpu_array_tile_free(struct gpu_array_tile *tile)
+{
+ int j;
+
+ if (!tile)
+ return NULL;
+
+ for (j = 0; j < tile->n; ++j) {
+ isl_val_free(tile->bound[j].size);
+ isl_val_free(tile->bound[j].stride);
+ isl_aff_free(tile->bound[j].lb);
+ isl_aff_free(tile->bound[j].shift);
+ }
+ free(tile->bound);
+ isl_multi_aff_free(tile->tiling);
+ free(tile);
+
+ return NULL;
+}
+
+/* Create a gpu_array_tile for an array of dimension "n_index".
+ */
+struct gpu_array_tile *gpu_array_tile_create(isl_ctx *ctx, int n_index)
+{
+ int i;
+ struct gpu_array_tile *tile;
+
+ tile = isl_calloc_type(ctx, struct gpu_array_tile);
+ if (!tile)
+ return NULL;
+
+ tile->ctx = ctx;
+ tile->bound = isl_alloc_array(ctx, struct gpu_array_bound, n_index);
+ if (!tile->bound)
+ return gpu_array_tile_free(tile);
+
+ tile->n = n_index;
+
+ for (i = 0; i < n_index; ++i) {
+ tile->bound[i].size = NULL;
+ tile->bound[i].lb = NULL;
+ tile->bound[i].stride = NULL;
+ tile->bound[i].shift = NULL;
+ }
+
+ return tile;
+}
+
+/* Compute the size of the tile specified by "tile"
+ * in number of elements and return the result.
+ */
+__isl_give isl_val *gpu_array_tile_size(struct gpu_array_tile *tile)
+{
+ int i;
+ isl_val *size;
+
+ if (!tile)
+ return NULL;
+
+ size = isl_val_one(tile->ctx);
+
+ for (i = 0; i < tile->n; ++i)
+ size = isl_val_mul(size, isl_val_copy(tile->bound[i].size));
+
+ return size;
+}
OpenPOWER on IntegriCloud