From c0bfe8723e1329d7734ab8ad7d97210d8050d365 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 26 Apr 2010 15:01:50 -0700 Subject: [PATCH] Correctly handle remapping of array dereferences if ->var is a variable. --- ir_function_inlining.cpp | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/ir_function_inlining.cpp b/ir_function_inlining.cpp index ba556a84992..5b1b3cb8b0b 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 */ -- 2.30.2