diff options
Diffstat (limited to 'polly/lib/External/ppcg/gpu_array_tile.c')
-rw-r--r-- | polly/lib/External/ppcg/gpu_array_tile.c | 71 |
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; +} |