diff options
author | Eric Anholt <eric@anholt.net> | 2010-04-26 15:01:50 -0700 |
---|---|---|
committer | Ian Romanick <ian.d.romanick@intel.com> | 2010-04-28 18:22:54 -0700 |
commit | c0bfe8723e1329d7734ab8ad7d97210d8050d365 (patch) | |
tree | 02ef48488ef9a7d4c0c448479c045498e8e74664 | |
parent | c824e35dd092a9cc0dbfd36d90fcdf1488c8942d (diff) |
Correctly handle remapping of array dereferences if ->var is a variable.
-rw-r--r-- | ir_function_inlining.cpp | 31 |
1 files changed, 11 insertions, 20 deletions
diff --git a/ir_function_inlining.cpp b/ir_function_inlining.cpp index ba556a8499..5b1b3cb8b0 100644 --- a/ir_function_inlining.cpp +++ b/ir_function_inlining.cpp @@ -184,34 +184,25 @@ ir_function_cloning_visitor::visit(ir_swizzle *ir) void ir_function_cloning_visitor::visit(ir_dereference *ir) { - if (ir->mode == ir_dereference::ir_reference_variable) { - ir_variable *old_var = ir->var->as_variable(); - - /* If it's a deref of a real variable, then we need to remap it if - * it was local to the function. - */ - if (old_var) { - ir_variable *new_var; - - new_var = this->get_remapped_variable(old_var); + ir_variable *old_var = ir->var->as_variable(); + ir_instruction *var; - this->result = new ir_dereference(new_var); - } else { - ir->var->accept(this); + if (old_var) + var = this->get_remapped_variable(old_var); + else { + ir->var->accept(this); + var = this->result; + } - this->result = new ir_dereference(this->result); - } + if (ir->mode == ir_dereference::ir_reference_variable) { + this->result = new ir_dereference(var); } else if (ir->mode == ir_dereference::ir_reference_array) { - ir_instruction *variable; ir_rvalue *index; - ir->var->accept(this); - variable = this->result; - ir->selector.array_index->accept(this); index = this->result->as_rvalue(); - this->result = new ir_dereference(variable, index); + this->result = new ir_dereference(var, index); } else { assert(ir->mode == ir_dereference::ir_reference_record); /* FINISHME: inlining of structure references */ |