On 21 March 2006 14:59, Richard Henderson wrote:

> On Mon, Mar 20, 2006 at 04:19:52PM -0000, Dave Korn wrote:
>> However, I might still want to make it an option for cases where debugging
>> isn't going to be important; it seems to me that the generated code should
>> still be valid.
> 
> At which point you should tail call to abort and be done with it.
> So the correct change is to the tail call code, which currently
> filters out noreturn functions.

  Ok, seems reasonable.  I see code in calls.c that checks for the noreturn
flag and clears try_tail_call if so, so I'll need to fix that.  I'm wondering
if that'd be enough on its own though, because I don't see why this chunk of
code from sibcall.c...

          if (no_sibcalls_this_function
              /* ??? Overly conservative.  */
              || frame_offset
              /* Any function that calls setjmp might have longjmp called from
                 any called function.  ??? We really should represent this
                 properly in the CFG so that this needn't be special cased.
*/
              || current_function_calls_setjmp
              /* Can't if more than one successor or single successor is not
                 exit block.  These two tests prevent tail call optimization
                 in the presense of active exception handlers.  */
              || call_block->succ == NULL
              || call_block->succ->succ_next != NULL
              || (call_block->succ->dest != EXIT_BLOCK_PTR
                  && call_block->succ->dest != alternate_exit)
              /* If this call doesn't end the block, there are operations at
                 the end of the block which we must execute after returning.
*/
              || ! call_ends_block_p (insn, call_block->end))
            sibcall = 0, tailrecursion = 0;

.. wouldn't check the succ block of the noreturn call and forbid the sibcall
if it wasn't at the end of the enclosing function.

  I may also have to improve my call/call_value patterns.  At the moment they
just test SIBLING_CALL_P and emit a non-linking jump if so, but that means
they still have a clobber of LR attached which is no longer the case and
that's likely to force my functions to still have stackframes unnecessarily.

  Looking at the ARM md-file as an example, it seems that I can use expanders
to match them.

  And looking at call.c, it seems there are perhaps some undocumented (in
3.3.3) named patterns that provide a sib- equivalent for each of the normal
call_xxxxx patterns?  Ow, that's a little tricky!



    cheers,
      DaveK
-- 
Can't think of a witty .sigline today....

Reply via email to