public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
From: Martin Jambor <mjambor@suse.cz>
To: Pierrick Philippe <pierrick.philippe@irisa.fr>, gcc@gcc.gnu.org
Subject: Re: [Tree-SSA] Question from observation, bogus SSA form?
Date: Thu, 16 Mar 2023 17:30:37 +0100	[thread overview]
Message-ID: <ri67cvg64lu.fsf@suse.cz> (raw)
In-Reply-To: <d89b8539-d41f-18fc-1f36-83bcaab772e8@irisa.fr>

Hello Pierrick,

On Thu, Mar 16 2023, Pierrick Philippe wrote:
> Hi everyone,
>
> I was working around with the analyzer, but I usually dump the SSA-tree 
> to get a view of the analyzed code.
> This is how I noticed something wrong, at least in the sense of the 
> definition of SSA form.

please note that only some DECLs are put into a SSA form in GCC, these
are sometimes referred to as "gimple registers" and you can query the
predicate is_gimple_reg to figure out whether a DECL is one (putting
aside "virtual operands" which are a special construct of alias
analysis, are in an SSA form but the predicate returns false for them
for some reason).

This means that global variables, volatile variables, aggregates,
variables which are not considered aggregates but are nevertheless
partially modified (think insertion into a vector) or variables which
need to live in memory (most probably because their address was taken)
are not put into an SSA form.  It may not be easily possible.

>
> I'm using a version of gcc build from a /trunk/ branch (/20230309/).
>
> Here is an example code:
>
> '''
> int main(void) {
>      int x = 42;
>      int * y = &x;

Here you take address of x which therefore has to live in memory at
least as long as y is not optimized away.

>      x = 6;
>      return x;
> }
> '''
>
> And here is the output from -fdump-tree-ssa-vops:
>
> '''
> ;; Function main (main, funcdef_no=0, decl_uid=2739, cgraph_uid=1, 
> symbol_order=0)
>
> int main ()
> {
>    int * y;
>    int x;
>    int D.2744;
>    int _5;
>
>    <bb 2> :
>    # .MEM_2 = VDEF <.MEM_1(D)>
>    x = 42;                                           // First assignment 
> to var_decl x
>    y_3 = &x;
>    # .MEM_4 = VDEF <.MEM_2>
>    x = 6;                                             // Second 
> assignment to var_decl x
>    # VUSE <.MEM_4>
>    _5 = x;
>    # .MEM_6 = VDEF <.MEM_4>
>    x ={v} {CLOBBER(eol)};
>
>    <bb 3> :
> <L1>:
>    # VUSE <.MEM_6>
>    return _5;
>
> }
> '''
>
> The thing is, there is two distinct assignment to the same LHS tree at 
> two different gimple statement, which is by definition not supposed to 
> happened in SSA form.

I think it is now clear that x is not in SSA form because (at this stage
of the compilation) it is still considered to need to live in memory.

> Is there any particular reason this happen? Is that because the address 
> of x is taken and stored?
>
> I have to precise, I did not dig into the SSA form transformation and am 
> a newbie to gcc source code.
> So maybe my question is a bit naive or a known issue.

No worries, we know these important details are not straightforward when
you see them for the first time.

Good luck with your gcc hacking!

Martin

  reply	other threads:[~2023-03-16 16:30 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-16 15:26 Pierrick Philippe
2023-03-16 16:30 ` Martin Jambor [this message]
2023-03-17 13:55   ` Pierrick Philippe
2023-03-17 14:34     ` Michael Matz

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=ri67cvg64lu.fsf@suse.cz \
    --to=mjambor@suse.cz \
    --cc=gcc@gcc.gnu.org \
    --cc=pierrick.philippe@irisa.fr \
    /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).