-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 07/07/2011 01:16 AM, Kenneth Graunke wrote: > On 07/05/2011 03:07 PM, Paul Berry wrote: >> Previously, do_lower_jumps.cpp determined whether to lower return >> statements in ir_lower_jumps_visitor::should_lower_jumps(). Moved >> this logic to ir_lower_jumps_visitor::visit(ir_function_signature *), >> so that it can be used in determining whether to lower a return >> statement at the end of a function. >> --- >> src/glsl/lower_jumps.cpp | 19 ++++++++++++------- >> 1 files changed, 12 insertions(+), 7 deletions(-) >> >> diff --git a/src/glsl/lower_jumps.cpp b/src/glsl/lower_jumps.cpp >> index da85c6b..fa247c6 100644 >> --- a/src/glsl/lower_jumps.cpp >> +++ b/src/glsl/lower_jumps.cpp >> @@ -210,16 +210,17 @@ struct function_record >> ir_function_signature* signature; >> ir_variable* return_flag; /* used to break out of all loops and >> then jump to the return instruction */ >> ir_variable* return_value; >> - bool is_main; >> + bool lower_return; >> unsigned nesting_depth; >> >> - function_record(ir_function_signature* p_signature = 0) >> + function_record(ir_function_signature* p_signature = 0, >> + bool lower_return = false) >> { >> this->signature = p_signature; >> this->return_flag = 0; >> this->return_value = 0; >> this->nesting_depth = 0; >> - this->is_main = this->signature&& >> (strcmp(this->signature->function_name(), "main") == 0); >> + this->lower_return = lower_return; >> } >> >> ir_variable* get_return_flag() >> @@ -398,10 +399,8 @@ struct ir_lower_jumps_visitor : public >> ir_control_flow_visitor { >> /* never lower return at the end of a this->function */ >> if(this->function.nesting_depth == 0&& >> ir->get_next()->is_tail_sentinel()) >> lower = false; >> - else if (this->function.is_main) >> - lower = lower_main_return; >> else >> - lower = lower_sub_return; >> + lower = this->function.lower_return; >> break; >> } >> return lower; >> @@ -833,9 +832,15 @@ lower_continue: >> assert(!this->function.signature); >> assert(!this->loop.loop); >> >> + bool lower_return; >> + if (strcmp(ir->function_name(), "main") == 0) >> + lower_return = lower_main_return; >> + else >> + lower_return = lower_sub_return; > > What exactly is the difference between lowering returns in "main" and > lowering them in other subroutines? void vs. non-void is definitely > different, but I don't see why main is special. Looking at the code, it > doesn't actually seem to use lower_main_return anywhere...
The difference is that some architectures (e.g., i965!) *only* want returns in main lowered. > (I realize this code was already there, but as long as you're cleaning > it up, maybe that can just get removed...) > >> function_record saved_function = this->function; >> loop_record saved_loop = this->loop; >> - this->function = function_record(ir); >> + this->function = function_record(ir, lower_return); >> this->loop = loop_record(ir); >> >> assert(!this->loop.loop); -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/ iEYEARECAAYFAk4Xh4wACgkQX1gOwKyEAw8R1gCcDqpk/pjz2TDyNhx/NPiTSpTS 1G0AoJb5fvKmQyiBoQz0fwmdxEoN0sIV =0/1Z -----END PGP SIGNATURE----- _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev