1bf215546Sopenharmony_ci/* 2bf215546Sopenharmony_ci * Copyright © 2010 Intel Corporation 3bf215546Sopenharmony_ci * 4bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 5bf215546Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 6bf215546Sopenharmony_ci * to deal in the Software without restriction, including without limitation 7bf215546Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8bf215546Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 9bf215546Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 10bf215546Sopenharmony_ci * 11bf215546Sopenharmony_ci * The above copyright notice and this permission notice (including the next 12bf215546Sopenharmony_ci * paragraph) shall be included in all copies or substantial portions of the 13bf215546Sopenharmony_ci * Software. 14bf215546Sopenharmony_ci * 15bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16bf215546Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17bf215546Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18bf215546Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19bf215546Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20bf215546Sopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21bf215546Sopenharmony_ci * DEALINGS IN THE SOFTWARE. 22bf215546Sopenharmony_ci */ 23bf215546Sopenharmony_ci 24bf215546Sopenharmony_ci/** 25bf215546Sopenharmony_ci * \file ir_variable_refcount.h 26bf215546Sopenharmony_ci * 27bf215546Sopenharmony_ci * Provides a visitor which produces a list of variables referenced, 28bf215546Sopenharmony_ci * how many times they were referenced and assigned, and whether they 29bf215546Sopenharmony_ci * were defined in the scope. 30bf215546Sopenharmony_ci */ 31bf215546Sopenharmony_ci 32bf215546Sopenharmony_ci#ifndef GLSL_IR_VARIABLE_REFCOUNT_H 33bf215546Sopenharmony_ci#define GLSL_IR_VARIABLE_REFCOUNT_H 34bf215546Sopenharmony_ci 35bf215546Sopenharmony_ci#include "ir.h" 36bf215546Sopenharmony_ci#include "ir_visitor.h" 37bf215546Sopenharmony_ci#include "compiler/glsl_types.h" 38bf215546Sopenharmony_ci 39bf215546Sopenharmony_cistruct assignment_entry { 40bf215546Sopenharmony_ci exec_node link; 41bf215546Sopenharmony_ci ir_assignment *assign; 42bf215546Sopenharmony_ci}; 43bf215546Sopenharmony_ci 44bf215546Sopenharmony_ciclass ir_variable_refcount_entry 45bf215546Sopenharmony_ci{ 46bf215546Sopenharmony_cipublic: 47bf215546Sopenharmony_ci ir_variable_refcount_entry(ir_variable *var); 48bf215546Sopenharmony_ci 49bf215546Sopenharmony_ci ir_variable *var; /* The key: the variable's pointer. */ 50bf215546Sopenharmony_ci 51bf215546Sopenharmony_ci /** 52bf215546Sopenharmony_ci * List of assignments to the variable, if any. 53bf215546Sopenharmony_ci * This is intended to be used for dead code optimisation and may 54bf215546Sopenharmony_ci * not be a complete list. 55bf215546Sopenharmony_ci */ 56bf215546Sopenharmony_ci exec_list assign_list; 57bf215546Sopenharmony_ci 58bf215546Sopenharmony_ci /** Number of times the variable is referenced, including assignments. */ 59bf215546Sopenharmony_ci unsigned referenced_count; 60bf215546Sopenharmony_ci 61bf215546Sopenharmony_ci /** Number of times the variable is assigned. */ 62bf215546Sopenharmony_ci unsigned assigned_count; 63bf215546Sopenharmony_ci 64bf215546Sopenharmony_ci bool declaration; /* If the variable had a decl in the instruction stream */ 65bf215546Sopenharmony_ci}; 66bf215546Sopenharmony_ci 67bf215546Sopenharmony_ciclass ir_variable_refcount_visitor : public ir_hierarchical_visitor { 68bf215546Sopenharmony_cipublic: 69bf215546Sopenharmony_ci ir_variable_refcount_visitor(void); 70bf215546Sopenharmony_ci ~ir_variable_refcount_visitor(void); 71bf215546Sopenharmony_ci 72bf215546Sopenharmony_ci virtual ir_visitor_status visit(ir_variable *); 73bf215546Sopenharmony_ci virtual ir_visitor_status visit(ir_dereference_variable *); 74bf215546Sopenharmony_ci 75bf215546Sopenharmony_ci virtual ir_visitor_status visit_enter(ir_function_signature *); 76bf215546Sopenharmony_ci virtual ir_visitor_status visit_leave(ir_assignment *); 77bf215546Sopenharmony_ci 78bf215546Sopenharmony_ci /** 79bf215546Sopenharmony_ci * Find variable in the hash table, and insert it if not present 80bf215546Sopenharmony_ci */ 81bf215546Sopenharmony_ci ir_variable_refcount_entry *get_variable_entry(ir_variable *var); 82bf215546Sopenharmony_ci 83bf215546Sopenharmony_ci /** 84bf215546Sopenharmony_ci * Hash table mapping ir_variable to ir_variable_refcount_entry. 85bf215546Sopenharmony_ci */ 86bf215546Sopenharmony_ci struct hash_table *ht; 87bf215546Sopenharmony_ci 88bf215546Sopenharmony_ci void *mem_ctx; 89bf215546Sopenharmony_ci}; 90bf215546Sopenharmony_ci 91bf215546Sopenharmony_ci#endif /* GLSL_IR_VARIABLE_REFCOUNT_H */ 92