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