10d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt/*
20d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * Copyright © 2012 Intel Corporation
30d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt *
40d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * Permission is hereby granted, free of charge, to any person obtaining a
50d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * copy of this software and associated documentation files (the "Software"),
60d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * to deal in the Software without restriction, including without limitation
70d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * the rights to use, copy, modify, merge, publish, distribute, sublicense,
80d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * and/or sell copies of the Software, and to permit persons to whom the
90d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * Software is furnished to do so, subject to the following conditions:
100d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt *
110d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * The above copyright notice and this permission notice (including the next
120d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * paragraph) shall be included in all copies or substantial portions of the
130d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * Software.
140d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt *
150d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
160d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
170d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
180d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
190d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
200d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
210d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * IN THE SOFTWARE.
220d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt *
230d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt * Authors:
240d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt *    Eric Anholt <eric@anholt.net>
250d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt *
260d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt */
270d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt
280d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt#include "brw_fs.h"
290d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt
300d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholtnamespace brw {
310d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt
320d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholtstruct block_data {
330d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   /**
340d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt    * Which variables are defined before being used in the block.
350d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt    *
360d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt    * Note that for our purposes, "defined" means unconditionally, completely
370d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt    * defined.
380d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt    */
390d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   bool *def;
400d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt
410d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   /**
420d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt    * Which variables are used before being defined in the block.
430d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt    */
440d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   bool *use;
450d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt
460d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   /** Which defs reach the entry point of the block. */
470d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   bool *livein;
480d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt
490d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   /** Which defs reach the exit point of the block. */
500d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   bool *liveout;
510d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt};
520d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt
530d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholtclass fs_live_variables {
540d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholtpublic:
550d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   static void* operator new(size_t size, void *ctx)
560d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   {
570d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt      void *node;
580d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt
590d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt      node = rzalloc_size(ctx, size);
600d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt      assert(node != NULL);
610d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt
620d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt      return node;
630d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   }
640d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt
650d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   fs_live_variables(fs_visitor *v, fs_cfg *cfg);
660d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   ~fs_live_variables();
670d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt
680d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   void setup_def_use();
690d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   void compute_live_variables();
700d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt
710d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   fs_visitor *v;
720d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   fs_cfg *cfg;
730d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   void *mem_ctx;
740d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt
750d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   int num_vars;
760d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt
770d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   /** Per-basic-block information on live variables */
780d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt   struct block_data *bd;
790d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt};
800d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt
810d6c96a5c34de3ffdd6167282d7520dfd3c863cbEric Anholt} /* namespace brw */
82