ir_rvalue_visitor.cpp revision c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4
1b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt/* 2b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * Copyright © 2010 Intel Corporation 3b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * 4b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * Permission is hereby granted, free of charge, to any person obtaining a 5b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * copy of this software and associated documentation files (the "Software"), 6b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * to deal in the Software without restriction, including without limitation 7b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * and/or sell copies of the Software, and to permit persons to whom the 9b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * Software is furnished to do so, subject to the following conditions: 10b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * 11b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * The above copyright notice and this permission notice (including the next 12b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * paragraph) shall be included in all copies or substantial portions of the 13b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * Software. 14b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * 15b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * DEALINGS IN THE SOFTWARE. 22b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt */ 23b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 24b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt/** 25b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * \file ir_rvalue_visitor.cpp 26b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * 27b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * Generic class to implement the common pattern we have of wanting to 28b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * visit each ir_rvalue * and possibly change that node to a different 29b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * class. 30b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt */ 31b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 32b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt#include "ir.h" 33b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt#include "ir_visitor.h" 34b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt#include "ir_rvalue_visitor.h" 35b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt#include "ir_print_visitor.h" 36b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt#include "glsl_types.h" 37b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 38b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_visitor_status 39b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_rvalue_visitor::visit_leave(ir_expression *ir) 40b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt{ 41b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt unsigned int operand; 42b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 43b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt for (operand = 0; operand < ir->get_num_operands(); operand++) { 44b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->operands[operand]); 45b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt } 46b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 47b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt return visit_continue; 48b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt} 49b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 50b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_visitor_status 51b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_rvalue_visitor::visit_leave(ir_texture *ir) 52b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt{ 53b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->coordinate); 54b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->projector); 55b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->shadow_comparitor); 56b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 57b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt switch (ir->op) { 58b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt case ir_tex: 59b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt break; 60b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt case ir_txb: 61b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->lod_info.bias); 62b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt break; 63b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt case ir_txf: 64b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt case ir_txl: 65b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->lod_info.lod); 66b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt break; 67b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt case ir_txd: 68b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->lod_info.grad.dPdx); 69b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->lod_info.grad.dPdy); 70b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt break; 71b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt } 72b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 73b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt return visit_continue; 74b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt} 75b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 76b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_visitor_status 77b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_rvalue_visitor::visit_leave(ir_swizzle *ir) 78b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt{ 79b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->val); 80b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt return visit_continue; 81b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt} 82b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 83b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_visitor_status 84b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_rvalue_visitor::visit_leave(ir_dereference_array *ir) 85b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt{ 86c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick /* The array index is not the target of the assignment, so clear the 87c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick * 'in_assignee' flag. Restore it after returning from the array index. 88c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick */ 89c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick const bool was_in_assignee = this->in_assignee; 90c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick this->in_assignee = false; 91b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->array_index); 92c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick this->in_assignee = was_in_assignee; 93c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick 94b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->array); 95b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt return visit_continue; 96b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt} 97b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 98b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_visitor_status 99b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_rvalue_visitor::visit_leave(ir_dereference_record *ir) 100b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt{ 101b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->record); 102b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt return visit_continue; 103b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt} 104b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 105b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_visitor_status 106b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_rvalue_visitor::visit_leave(ir_assignment *ir) 107b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt{ 108b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->rhs); 109b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->condition); 110b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 111b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt return visit_continue; 112b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt} 113b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 114b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_visitor_status 115b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_rvalue_visitor::visit_leave(ir_call *ir) 116b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt{ 117b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt foreach_iter(exec_list_iterator, iter, *ir) { 118b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt ir_rvalue *param = (ir_rvalue *)iter.get(); 119b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt ir_rvalue *new_param = param; 120b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&new_param); 121b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 122b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt if (new_param != param) { 123b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt param->replace_with(new_param); 124b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt } 125b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt } 126b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt return visit_continue; 127b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt} 128b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 129b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_visitor_status 130b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_rvalue_visitor::visit_leave(ir_return *ir) 131b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt{ 132b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->value);; 133b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt return visit_continue; 134b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt} 135b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 136b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_visitor_status 137b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_rvalue_visitor::visit_leave(ir_if *ir) 138b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt{ 139b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->condition); 140b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt return visit_continue; 141b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt} 142