LCOV - code coverage report
Current view: top level - metalib_isl - isl_blk.c (source / functions) Hit Total Coverage
Test: 2018-10-31_point_maint_greina16.lcov Lines: 55 67 82.1 %
Date: 2018-11-01 11:27:00 Functions: 8 10 80.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright 2008-2009 Katholieke Universiteit Leuven
       3             :  *
       4             :  * Use of this software is governed by the MIT license
       5             :  *
       6             :  * Written by Sven Verdoolaege, K.U.Leuven, Departement
       7             :  * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
       8             :  */
       9             : 
      10             : #include <isl_blk.h>
      11             : #include <isl_ctx_private.h>
      12             : 
      13             : /* The maximal number of cache misses before first element is evicted */
      14             : #define ISL_BLK_MAX_MISS        100
      15             : 
      16 >12494*10^7 : struct isl_blk isl_blk_empty()
      17             : {
      18             :         struct isl_blk block;
      19 >12494*10^7 :         block.size = 0;
      20 >12494*10^7 :         block.data = NULL;
      21 >12494*10^7 :         return block;
      22             : }
      23             : 
      24 96766696336 : static int isl_blk_is_empty(struct isl_blk block)
      25             : {
      26 96766696336 :         return block.size == 0 && block.data == NULL;
      27             : }
      28             : 
      29           0 : static struct isl_blk isl_blk_error()
      30             : {
      31             :         struct isl_blk block;
      32           0 :         block.size = -1;
      33           0 :         block.data = NULL;
      34           0 :         return block;
      35             : }
      36             : 
      37 >12274*10^7 : int isl_blk_is_error(struct isl_blk block)
      38             : {
      39 >12274*10^7 :         return block.size == -1 && block.data == NULL;
      40             : }
      41             : 
      42  1489526113 : static void isl_blk_free_force(struct isl_ctx *ctx, struct isl_blk block)
      43             : {
      44             :         int i;
      45             : 
      46 79712206056 :         for (i = 0; i < block.size; ++i)
      47 78222679943 :                 isl_int_clear(block.data[i]);
      48  1489526113 :         free(block.data);
      49  1489526113 : }
      50             : 
      51 70742411375 : static struct isl_blk extend(struct isl_ctx *ctx, struct isl_blk block,
      52             :                                 size_t new_n)
      53             : {
      54             :         int i;
      55             :         isl_int *p;
      56             : 
      57 70742411375 :         if (block.size >= new_n)
      58 69216183438 :                 return block;
      59             : 
      60  1526227937 :         p = isl_realloc_array(ctx, block.data, isl_int, new_n);
      61  1526227937 :         if (!p) {
      62           0 :                 isl_blk_free_force(ctx, block);
      63           0 :                 return isl_blk_error();
      64             :         }
      65  1526227937 :         block.data = p;
      66             : 
      67 80020316238 :         for (i = block.size; i < new_n; ++i)
      68 78494088301 :                 isl_int_init(block.data[i]);
      69  1526227937 :         block.size = new_n;
      70             : 
      71  1526227937 :         return block;
      72             : }
      73             : 
      74 70693316258 : struct isl_blk isl_blk_alloc(struct isl_ctx *ctx, size_t n)
      75             : {
      76             :         int i;
      77             :         struct isl_blk block;
      78             : 
      79 70693316258 :         block = isl_blk_empty();
      80 70693316258 :         if (n && ctx->n_cached) {
      81 51994136715 :                 int best = 0;
      82 >59146*10^7 :                 for (i = 1; ctx->cache[best].size != n && i < ctx->n_cached; ++i) {
      83 >53946*10^7 :                         if (ctx->cache[best].size < n) {
      84 10789622496 :                                 if (ctx->cache[i].size > ctx->cache[best].size)
      85  9456328026 :                                         best = i;
      86 >93756*10^7 :                         } else if (ctx->cache[i].size >= n &&
      87 >40888*10^7 :                                    ctx->cache[i].size < ctx->cache[best].size)
      88 >12589*10^7 :                                         best = i;
      89             :                 }
      90 51994136715 :                 if (ctx->cache[best].size < 2 * n + 100) {
      91 50510962977 :                         block = ctx->cache[best];
      92 50510962977 :                         if (--ctx->n_cached != best)
      93 36230685427 :                                 ctx->cache[best] = ctx->cache[ctx->n_cached];
      94 50510962977 :                         if (best == 0)
      95  2665292131 :                                 ctx->n_miss = 0;
      96  1483173738 :                 } else if (ctx->n_miss++ >= ISL_BLK_MAX_MISS) {
      97     2389790 :                         isl_blk_free_force(ctx, ctx->cache[0]);
      98     2389790 :                         if (--ctx->n_cached != 0)
      99     2389511 :                                 ctx->cache[0] = ctx->cache[ctx->n_cached];
     100     2389790 :                         ctx->n_miss = 0;
     101             :                 }
     102             :         }
     103             : 
     104 70693316258 :         return extend(ctx, block, n);
     105             : }
     106             : 
     107    49095117 : struct isl_blk isl_blk_extend(struct isl_ctx *ctx, struct isl_blk block,
     108             :                                 size_t new_n)
     109             : {
     110    49095117 :         if (isl_blk_is_empty(block))
     111           0 :                 return isl_blk_alloc(ctx, new_n);
     112             : 
     113    49095117 :         return extend(ctx, block, new_n);
     114             : }
     115             : 
     116 96717601219 : void isl_blk_free(struct isl_ctx *ctx, struct isl_blk block)
     117             : {
     118 96717601219 :         if (isl_blk_is_empty(block) || isl_blk_is_error(block))
     119 44716359209 :                 return;
     120             : 
     121 52001242010 :         if (ctx->n_cached < ISL_BLK_CACHE_SIZE)
     122 50514105687 :                 ctx->cache[ctx->n_cached++] = block;
     123             :         else
     124  1487136323 :                 isl_blk_free_force(ctx, block);
     125             : }
     126             : 
     127           0 : void isl_blk_clear_cache(struct isl_ctx *ctx)
     128             : {
     129             :         int i;
     130             : 
     131           0 :         for (i = 0; i < ctx->n_cached; ++i)
     132           0 :                 isl_blk_free_force(ctx, ctx->cache[i]);
     133           0 :         ctx->n_cached = 0;
     134           0 : }

Generated by: LCOV version 1.12