public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jeff Law <jeffreyalaw@gmail.com>
To: "Wang, Yanzhang" <yanzhang.wang@intel.com>,
	"gcc-patches@gcc.gnu.org" <gcc-patches@gcc.gnu.org>
Cc: "juzhe.zhong@rivai.ai" <juzhe.zhong@rivai.ai>,
	"kito.cheng@sifive.com" <kito.cheng@sifive.com>,
	"Li, Pan2" <pan2.li@intel.com>
Subject: Re: [PATCH] RISCV: Add -m(no)-omit-leaf-frame-pointer support.
Date: Thu, 8 Jun 2023 09:05:04 -0600	[thread overview]
Message-ID: <7fb7d7d5-0e9a-d8b8-5dc6-7db946e67a00@gmail.com> (raw)
In-Reply-To: <IA1PR11MB646644384E3EE4771832D12CF253A@IA1PR11MB6466.namprd11.prod.outlook.com>



On 6/6/23 21:50, Wang, Yanzhang wrote:
> Hi Jeff,
> 
> Thanks your comments. I have few questions that I don't quite understand.
> 
>> One of the things that needs to be upstreamed is long jump support within
>> a function.  Essentially once a function reaches 1M in size we have the
>> real possibility that a direct jump may not reach its target.
>>
>> To support this I expect that $ra is going to become a fixed register (ie,
>> not available to the register allocator as a temporary).  It'll be used
>> as a scratch register for long jump sequences.
>>
>> One of the consequences of this is $ra will need to be saved in leaf
>> functions that are near or over 1M in size.
>>
>> Note that at the time when we have to lay out the stack, we do not know
>> the precise length of the function.  So there's a degree of "fuzz" in the
>> decision whether or not to save $ra in a function that is close to the 1M
>> limit.
> 
> Do you mean that, long jump to more than 1M offset will need multiple jal
> and each jal will save the $ra ?
Long jumps are implemnted as an indirect jump which needs a scratch 
register to hold the high part of the jump target address.

> 
> If yes, I'm confused about what's the influence of the $ra saving for
> function prologue. We will save the fp+ra at the prologue, the next $ra
> saving seems will not modify the $ra already saved.
The long branch handling is done at the assembler level.  So the 
clobbering of $ra isn't visible to the compiler.  Thus the compiler has 
to be extremely careful to not hold values in $ra because the assembler 
may clobber $ra.

This ultimately comes back to the phase ordering problem.  At register 
allocation time we don't know if we need long jumps or not.  So we don't 
know if $ra is potentially clobbered by the assembler.   A similar phase 
ordering problems exists in the prologue/epilogue generation.

The other approach to long branch handling would be to do it all in the 
compiler.  I would actually prefer this approach, but it's not likely to 
land in the near term.


> 
> I think it's yes (not valid) when we want to get the return address to parent
> function from $ra directly in the function body. But we can get the right
> return address from fp with offset if we save them at prologue, is it right ?
Right.  You'll be able to get the value of $ra out of the stack.



> 
>> Meaning that what you really want is to be using -fno-omit-frame-pointer
>> and for $ra to always be saved in the stack, even in a leaf function.
> 
> This is also another solution but will change the default behavior of
> -fno-omit-frame-pointer.
That's OK.  While -f options are target independent options, targets are 
allowed to adjust certain behaviors based on those options.

If you're not going to use dwarf, then my recommendation is to ensure 
that the data you need is *always* available in the stack at known 
offsets.   That will mean your code isn't optimized as well.  It means 
hand written assembly code has to follow the conventions, you can't link 
against libraries that do not follow those conventions, etc etc.  But 
that's the price you pay for not using dwarf (or presumably ORC/SFRAME 
which I haven't studied in detail).

Jeff






Jeff

  reply	other threads:[~2023-06-08 15:05 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-02  7:07 yanzhang.wang
2023-06-03  2:43 ` Jeff Law
2023-06-05  2:49   ` Wang, Yanzhang
2023-06-07  2:13     ` Jeff Law
2023-06-07  3:50       ` Wang, Yanzhang
2023-06-08 15:05         ` Jeff Law [this message]
2023-06-21  8:14           ` Wang, Yanzhang
2023-06-24 15:01             ` Jeff Law
2023-06-25  1:40               ` Stefan O'Rear
2023-06-25 12:49                 ` Jeff Law
2023-06-25 18:45                   ` Stefan O'Rear
2023-06-26 14:30                     ` Jeff Law
2023-06-26 14:50                       ` Kito Cheng
2023-06-26 16:51                         ` Jeff Law
2023-06-05  1:04 ` Li, Pan2
2023-06-05  3:36   ` Wang, Yanzhang
2023-07-13  6:12 ` yanzhang.wang
2023-07-18  7:49 ` [PATCH v3] " yanzhang.wang
2023-07-21  3:49   ` Kito Cheng
2023-07-21  4:11     ` Jeff Law
2023-08-02  1:51       ` Wang, Yanzhang
2023-08-03  6:12         ` Jeff Law
2023-08-03  6:16           ` Li, Pan2
2023-08-03  6:22             ` Li, Pan2

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7fb7d7d5-0e9a-d8b8-5dc6-7db946e67a00@gmail.com \
    --to=jeffreyalaw@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=juzhe.zhong@rivai.ai \
    --cc=kito.cheng@sifive.com \
    --cc=pan2.li@intel.com \
    --cc=yanzhang.wang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).