ir_rvalue_visitor.cpp revision 1e3bcbdf31f09666ba358f35ff9486faee3642ca
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); 56c5a27b5939427bdc95c926b450ed3de1ff4baafbKenneth Graunke handle_rvalue(&ir->offset); 57b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 58b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt switch (ir->op) { 59b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt case ir_tex: 60b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt break; 61b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt case ir_txb: 62b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->lod_info.bias); 63b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt break; 64b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt case ir_txf: 65b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt case ir_txl: 661e3bcbdf31f09666ba358f35ff9486faee3642caKenneth Graunke case ir_txs: 67b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->lod_info.lod); 68b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt break; 69b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt case ir_txd: 70b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->lod_info.grad.dPdx); 71b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->lod_info.grad.dPdy); 72b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt break; 73b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt } 74b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 75b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt return visit_continue; 76b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt} 77b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 78b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_visitor_status 79b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_rvalue_visitor::visit_leave(ir_swizzle *ir) 80b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt{ 81b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->val); 82b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt return visit_continue; 83b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt} 84b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 85b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_visitor_status 86b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_rvalue_visitor::visit_leave(ir_dereference_array *ir) 87b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt{ 88c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick /* The array index is not the target of the assignment, so clear the 89c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick * 'in_assignee' flag. Restore it after returning from the array index. 90c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick */ 91c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick const bool was_in_assignee = this->in_assignee; 92c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick this->in_assignee = false; 93b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->array_index); 94c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick this->in_assignee = was_in_assignee; 95c8ee8e07f7cc8f18d367ffcec065b45f8a6976f4Ian Romanick 96b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->array); 97b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt return visit_continue; 98b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt} 99b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 100b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_visitor_status 101b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_rvalue_visitor::visit_leave(ir_dereference_record *ir) 102b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt{ 103b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->record); 104b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt return visit_continue; 105b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt} 106b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 107b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_visitor_status 108b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_rvalue_visitor::visit_leave(ir_assignment *ir) 109b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt{ 110b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->rhs); 111b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->condition); 112b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 113b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt return visit_continue; 114b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt} 115b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 116b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_visitor_status 117b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_rvalue_visitor::visit_leave(ir_call *ir) 118b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt{ 119b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt foreach_iter(exec_list_iterator, iter, *ir) { 120b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt ir_rvalue *param = (ir_rvalue *)iter.get(); 121b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt ir_rvalue *new_param = param; 122b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&new_param); 123b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 124b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt if (new_param != param) { 125b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt param->replace_with(new_param); 126b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt } 127b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt } 128b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt return visit_continue; 129b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt} 130b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 131b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_visitor_status 132b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_rvalue_visitor::visit_leave(ir_return *ir) 133b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt{ 134b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->value);; 135b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt return visit_continue; 136b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt} 137b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 138b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_visitor_status 139b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtir_rvalue_visitor::visit_leave(ir_if *ir) 140b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt{ 141b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt handle_rvalue(&ir->condition); 142b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt return visit_continue; 143b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt} 144