summaryrefslogtreecommitdiff
path: root/cloog-core/source/block.c
diff options
context:
space:
mode:
Diffstat (limited to 'cloog-core/source/block.c')
-rw-r--r--cloog-core/source/block.c404
1 files changed, 404 insertions, 0 deletions
diff --git a/cloog-core/source/block.c b/cloog-core/source/block.c
new file mode 100644
index 0000000..08fe807
--- /dev/null
+++ b/cloog-core/source/block.c
@@ -0,0 +1,404 @@
+
+ /**-------------------------------------------------------------------**
+ ** CLooG **
+ **-------------------------------------------------------------------**
+ ** block.c **
+ **-------------------------------------------------------------------**
+ ** First version: june 11th 2005 **
+ **-------------------------------------------------------------------**/
+
+
+/******************************************************************************
+ * CLooG : the Chunky Loop Generator (experimental) *
+ ******************************************************************************
+ * *
+ * Copyright (C) 2001-2005 Cedric Bastoul *
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Lesser General Public *
+ * License as published by the Free Software Foundation; either *
+ * version 2.1 of the License, or (at your option) any later version. *
+ * *
+ * This library is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this library; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
+ * Boston, MA 02110-1301 USA *
+ * *
+ * CLooG, the Chunky Loop Generator *
+ * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr *
+ * *
+ ******************************************************************************/
+/* CAUTION: the english used for comments is probably the worst you ever read,
+ * please feel free to correct and improve it !
+ */
+
+# include <stdlib.h>
+# include <stdio.h>
+# include "../include/cloog/cloog.h"
+
+
+/******************************************************************************
+ * Memory leaks hunting *
+ ******************************************************************************/
+
+
+/**
+ * These functions and global variables are devoted to memory leaks hunting: we
+ * want to know at each moment how many CloogBlock structures had been allocated
+ * (cloog_block_allocated) and how many had been freed (cloog_block_freed).
+ * Each time a CloogBlock structure is allocated, a call to the function
+ * cloog_block_leak_up() must be carried out, and respectively
+ * cloog_block_leak_down() when a CloogBlock structure is freed. The special
+ * variable cloog_block_max gives the maximal number of CloogBlock structures
+ * simultaneously alive (i.e. allocated and non-freed) in memory.
+ * - June 11th 2005: first version.
+ */
+
+
+static void cloog_block_leak_up(CloogState *state)
+{
+ state->block_allocated++;
+ if ((state->block_allocated - state->block_freed) > state->block_max)
+ state->block_max = state->block_allocated - state->block_freed;
+}
+
+
+static void cloog_block_leak_down(CloogState *state)
+{
+ state->block_freed++;
+}
+
+
+/******************************************************************************
+ * Structure display function *
+ ******************************************************************************/
+
+
+/**
+ * cloog_domain_print_structure :
+ * this function is a human-friendly way to display the CloogDomain data
+ * structure, it includes an indentation level (level) in order to work with
+ * others print_structure functions.
+ * - June 16th 2005: first version.
+ */
+void cloog_block_print_structure(FILE * file, CloogBlock * block, int level)
+{ int i ;
+
+ /* Go to the right level. */
+ for (i=0; i<level; i++)
+ fprintf(file,"|\t") ;
+
+ if (block != NULL)
+ { fprintf(file,"+-- CloogBlock\n") ;
+
+ /* A blank line. */
+ for (i=0; i<level+2; i++)
+ fprintf(file,"|\t") ;
+ fprintf(file,"\n") ;
+
+ /* Print statement list. */
+ cloog_statement_print_structure(file,block->statement,level+1) ;
+
+ /* A blank line. */
+ for (i=0; i<level+2; i++)
+ fprintf(file,"|\t") ;
+ fprintf(file,"\n") ;
+
+ /* Print scattering function. */
+ for(i=0; i<level+1; i++)
+ fprintf(file,"|\t") ;
+
+ fprintf(file,"+-- Null scattering function\n") ;
+
+ /* A blank line. */
+ for (i=0; i<level+2; i++)
+ fprintf(file,"|\t") ;
+ fprintf(file,"\n") ;
+
+ /* Print scalar dimensions. */
+ for (i=0; i<level+1; i++)
+ fprintf(file,"|\t") ;
+
+ if (block->nb_scaldims == 0)
+ fprintf(file,"No scalar dimensions\n") ;
+ else
+ { fprintf(file,"Scalar dimensions (%d):",block->nb_scaldims) ;
+ for (i = 0; i < block->nb_scaldims; i++) {
+ fprintf(file, " ");
+ cloog_int_print(file, block->scaldims[i]);
+ }
+ fprintf(file,"\n") ;
+ }
+
+ /* A blank line. */
+ for (i=0; i<level+2; i++)
+ fprintf(file,"|\t") ;
+ fprintf(file,"\n") ;
+
+ /* Print depth. */
+ for (i=0; i<level+1; i++)
+ fprintf(file,"|\t") ;
+ fprintf(file,"Depth: %d\n",block->depth) ;
+
+ /* A blank line. */
+ for (i=0; i<level+1; i++)
+ fprintf(file,"|\t") ;
+ fprintf(file,"\n") ;
+ }
+ else
+ fprintf(file,"+-- Null CloogBlock\n") ;
+}
+
+
+/**
+ * cloog_block_print function:
+ * This function prints the content of a CloogBlock structure (block) into a
+ * file (file, possibly stdout).
+ * - June 11th 2005: first version.
+ * - June 16th 2005: now just a call to cloog_block_print_structure.
+ */
+void cloog_block_print(FILE * file, CloogBlock * block)
+{ cloog_block_print_structure(file,block,0) ;
+}
+
+
+/**
+ * cloog_block_list_print function:
+ * This function prints the content of a CloogBlock structure (block) into a
+ * file (file, possibly stdout).
+ * - June 16th 2005: first version.
+ */
+void cloog_block_list_print(FILE * file, CloogBlockList * blocklist)
+{ int i=0 ;
+
+ while (blocklist != NULL)
+ { fprintf(file,"+-- CloogBlockList node %d\n",i) ;
+ cloog_block_print_structure(file,blocklist->block,1) ;
+ blocklist = blocklist->next ;
+ i++ ;
+ }
+}
+
+
+/******************************************************************************
+ * Memory deallocation function *
+ ******************************************************************************/
+
+
+/**
+ * cloog_block_free function:
+ * This function frees the allocated memory for a CloogStatement structure.
+ * - June 11th 2005: first version.
+ * - June 30th 2005: scaldims field management.
+ */
+void cloog_block_free(CloogBlock * block)
+{ int i ;
+
+ if (block != NULL)
+ { block->references -- ;
+
+ if (block->references == 0) {
+ cloog_block_leak_down(block->state);
+ if (block->scaldims != NULL)
+ { for (i=0;i<block->nb_scaldims;i++)
+ cloog_int_clear(block->scaldims[i]);
+
+ free(block->scaldims) ;
+ }
+ if (block->statement)
+ cloog_statement_free(block->statement);
+ free(block) ;
+ }
+ }
+}
+
+
+/**
+ * cloog_block_list_free function:
+ * This function frees the allocated memory for a CloogBlockList structure.
+ * - June 11th 2005: first version.
+ */
+void cloog_block_list_free(CloogBlockList * blocklist)
+{ CloogBlockList * temp ;
+
+ while (blocklist != NULL)
+ { temp = blocklist->next ;
+ cloog_block_free(blocklist->block) ;
+ free(blocklist) ;
+ blocklist = temp ;
+ }
+}
+
+
+/******************************************************************************
+ * Processing functions *
+ ******************************************************************************/
+
+/**
+ * cloog_block_malloc function:
+ * This function allocates the memory space for a CloogBlock structure and
+ * sets its fields with default values. Then it returns a pointer to the
+ * allocated space.
+ * - November 21th 2005: first version.
+ */
+CloogBlock *cloog_block_malloc(CloogState *state)
+{ CloogBlock * block ;
+
+ /* Memory allocation for the CloogBlock structure. */
+ block = (CloogBlock *)malloc(sizeof(CloogBlock)) ;
+ if (block == NULL)
+ cloog_die("memory overflow.\n");
+ cloog_block_leak_up(state);
+
+ /* We set the various fields with default values. */
+ block->state = state;
+ block->statement = NULL ;
+ block->nb_scaldims = 0 ;
+ block->scaldims = NULL ;
+ block->depth = 0 ;
+ block->references = 1 ;
+ block->usr = NULL;
+
+ return block ;
+}
+
+
+/**
+ * cloog_block_alloc function:
+ * This function allocates the memory space for a CloogBlock structure and
+ * sets its fields with those given as input. Then it returns a pointer to the
+ * allocated space. The two parameters nb_scaldims and scaldims are for internal
+ * service, put to respectively 0 and NULL if you don't know what they are
+ * useful for !
+ * - statement is the statement list of the block,
+ * - scattering is the scattering function for the block (NULL if unsure !),
+ * - nb_scaldims is the number of scalar dimensions (0 if unsure !),
+ * - scaldims is the array with the scalar dimensions values (NULL if unsure !),
+ * - depth is the original block depth (the number of outer loops).
+ **
+ * - June 11th 2005: first version.
+ * - June 30th 2005: addition of the nb_scaldims and scaldims parameters.
+ * - November 21th 2005: use of cloog_block_malloc.
+ */
+CloogBlock *cloog_block_alloc(CloogStatement *statement, int nb_scaldims,
+ cloog_int_t *scaldims, int depth)
+{ CloogBlock * block ;
+
+ /* Block allocation. */
+ block = cloog_block_malloc(statement->state);
+
+ block->statement = statement ;
+ block->nb_scaldims = nb_scaldims ;
+ block->scaldims = scaldims ;
+ block->depth = depth ;
+ block->references = 1 ;
+
+ return block ;
+}
+
+
+/**
+ * cloog_block_list_malloc function:
+ * This function allocates the memory space for a CloogBlockList structure and
+ * sets its fields with default values. Then it returns a pointer to the
+ * allocated space.
+ * - November 21th 2005: first version.
+ */
+CloogBlockList * cloog_block_list_malloc()
+{ CloogBlockList * blocklist ;
+
+ /* Memory allocation for the CloogBlock structure. */
+ blocklist = (CloogBlockList *)malloc(sizeof(CloogBlockList)) ;
+ if (blocklist == NULL)
+ cloog_die("memory overflow.\n");
+
+ /* We set the various fields with default values. */
+ blocklist->block = NULL ;
+ blocklist->next = NULL ;
+
+ return blocklist ;
+}
+
+
+/**
+ * cloog_block_list_alloc function:
+ * This function allocates the memory space for a CloogBlockList structure and
+ * sets its fields with those given as input. Then it returns a pointer to the
+ * allocated space.
+ * - block is the block element of the list node,
+ **
+ * - June 11th 2005: first version.
+ * - November 21th 2005: use of cloog_block_list_malloc.
+ */
+CloogBlockList * cloog_block_list_alloc(CloogBlock * block)
+{ CloogBlockList * blocklist ;
+
+ /* Block list node allocation. */
+ blocklist = cloog_block_list_malloc() ;
+
+ blocklist->block = block ;
+ blocklist->block->references ++ ; /* The block has a new reference to it. */
+ blocklist->next = NULL ;
+
+ return blocklist ;
+}
+
+
+/**
+ * cloog_block_copy function:
+ * This function returns a copy of a CloogBlock structure 'block'. To save
+ * memory this is not a memory copy but we increment a counter of active
+ * references inside the structure, then return a pointer to that structure.
+ */
+CloogBlock * cloog_block_copy(CloogBlock * block)
+{ if (block == NULL)
+ return NULL ;
+
+ block->references ++ ;
+ return block ;
+}
+
+
+/**
+ * cloog_block_merge function:
+ * this function adds at the end of the statement list of the block 'block',
+ * the statement list of the block 'merged'. Then the CloogBlock structure
+ * of 'merged' is freed (obviously not its statement list that is now
+ * included in 'block').
+ * - June 11th 2005: first version.
+ */
+void cloog_block_merge(CloogBlock * block, CloogBlock * merged)
+{ CloogStatement * statement ;
+
+ if ((block == NULL) || (merged == NULL))
+ return ;
+
+ if (block->statement != NULL)
+ { statement = block->statement ;
+
+ while (statement->next != NULL)
+ statement = statement->next ;
+
+ statement->next = merged->statement ;
+ }
+ else
+ block->statement = merged->statement ;
+
+ merged->statement = NULL;
+ cloog_block_free(merged);
+}
+
+
+
+
+
+
+
+
+
+