Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © 2014 Intel Corporation
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the "Software"),
  6.  * to deal in the Software without restriction, including without limitation
  7.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8.  * and/or sell copies of the Software, and to permit persons to whom the
  9.  * Software is furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice (including the next
  12.  * paragraph) shall be included in all copies or substantial portions of the
  13.  * Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  21.  * IN THE SOFTWARE.
  22.  *
  23.  * Authors:
  24.  *    Jason Ekstrand (jason@jlekstrand.net)
  25.  *
  26.  */
  27.  
  28. #pragma once
  29.  
  30. #ifndef _NIR_WORKLIST_
  31. #define _NIR_WORKLIST_
  32.  
  33. #include "nir.h"
  34.  
  35. #ifdef __cplusplus
  36. extern "C" {
  37. #endif
  38.  
  39. /** Represents a double-ended queue of unique blocks
  40.  *
  41.  * The worklist datastructure guarantees that eacy block is in the queue at
  42.  * most once.  Pushing a block onto either end of the queue is a no-op if
  43.  * the block is already in the queue.  In order for this to work, the
  44.  * caller must ensure that the blocks are properly indexed.
  45.  */
  46. typedef struct {
  47.    /* The total size of the worklist */
  48.    unsigned size;
  49.  
  50.    /* The number of blocks currently in the worklist */
  51.    unsigned count;
  52.  
  53.    /* The offset in the array of blocks at which the list starts */
  54.    unsigned start;
  55.  
  56.    /* A bitset of all of the blocks currently present in the worklist */
  57.    BITSET_WORD *blocks_present;
  58.  
  59.    /* The actual worklist */
  60.    nir_block **blocks;
  61. } nir_block_worklist;
  62.  
  63. void nir_block_worklist_init(nir_block_worklist *w, unsigned num_blocks,
  64.                              void *mem_ctx);
  65. void nir_block_worklist_fini(nir_block_worklist *w);
  66.  
  67. void nir_block_worklist_add_all(nir_block_worklist *w, nir_function_impl *impl);
  68.  
  69. static inline bool
  70. nir_block_worklist_is_empty(const nir_block_worklist *w)
  71. {
  72.    return w->count == 0;
  73. }
  74.  
  75. void nir_block_worklist_push_head(nir_block_worklist *w, nir_block *block);
  76.  
  77. nir_block *nir_block_worklist_peek_head(const nir_block_worklist *w);
  78.  
  79. nir_block *nir_block_worklist_pop_head(nir_block_worklist *w);
  80.  
  81. void nir_block_worklist_push_tail(nir_block_worklist *w, nir_block *block);
  82.  
  83. nir_block *nir_block_worklist_peek_tail(const nir_block_worklist *w);
  84.  
  85. nir_block *nir_block_worklist_pop_tail(nir_block_worklist *w);
  86.  
  87. #ifdef __cplusplus
  88. } /* extern "C" */
  89. #endif
  90.  
  91. #endif /* _NIR_WORKLIST_ */
  92.