On Wed, 30 Jun 2021, Qing Zhao wrote:

> 
> 
> On Jun 30, 2021, at 2:46 AM, Richard Biener 
> <rguent...@suse.de<mailto:rguent...@suse.de>> wrote:
> 
> On Wed, 30 Jun 2021, Qing Zhao wrote:
> 
> Hi,
> 
> I am testing the 4th patch of -ftrivial-auto-var-init with CPU2017 today, and 
> found the following issues:
> 
> ****In the dump file of “*t.i.031t.objsz1”, we have:
> 
> <bb 3> :
>  __s1_len_217 = .DEFERRED_INIT (__s1_len_176, 2);
>  __s2_len_218 = .DEFERRED_INIT (__s2_len_177, 2);
> 
> I looks like this .DEFERRED_INIT initializes an already initialized
> variable.
> 
> Yes.
> 
> For cases like the following:
> 
> int s2_len;
> s2_len = 4;
> 
> i.e, the initialization is not at the declaration.
> 
> We cannot avoid initialization for such cases.

But I'd have expected

  s2_len = .DEFERRED_INIT (s2_len, 0);
  s2_len = 4;

from the above - thus the deferred init _before_ the first
"use" which is the explicit init.  How does the other order
happen to materialize?  As said, I believe it shouldn't.

>  I'd expect to only ever see default definition SSA names
> as first argument to .DEFERRED_INIT.
> 
> You mean something like:
> __s2_len_218 = .DEFERRED_INIT (__s2_len, 2);

No,

__s2_len_218 = .DEFERRED_INIT (__s2_len_217(D), 2);

> ?
> 
> 
>  __s2_len_219 = 7;
>  if (__s2_len_219 <= 3)
>    goto <bb 4>; [INV]
>  else
>    goto <bb 9>; [INV]
> 
>  <bb 4> :
>  _1 = (long unsigned int) i_175;
> 
> 
> ****However, after “ccp”, in “t.i.032t.ccp1”, we have:
> 
> <bb 3> :
>  __s1_len_217 = .DEFERRED_INIT (__s1_len_176, 2);
>  __s2_len_218 = .DEFERRED_INIT (7, 2);
>  _36 = (long unsigned int) i_175;
>  _37 = _36 * 8;
>  _38 = argv_220(D) + _37;
> 
> 
> Looks like that the optimization “ccp” replaced the first argument of the 
> call .DEFERRED_INIT with the constant 7.
> This should be avoided.
> 
> (NOTE, this issue existed in the previous patches, however, only exposed with 
> this version since I added more verification
> code in tree-cfg.c to verify the call to .DEFERRED_INIT).
> 
> I am wondering what’s the best solution to this problem?
> 
> I think you have to trace where this "bogus" .DEFERRED_INIT comes from
> originally.  Or alternatively, if this is unavoidable,
> 
> This is unavoidable, I believe.

I see but don't believe it yet ;)

> add "constant
> folding" of .DEFERRED_INIT so that defered init of an initialized
> object becomes the object itself, thus retain the previous - eventually
> partial - initialization only.
> 
> If this additional .DEFERRED_INIT will be kept till RTL expansion phase, then 
> it will become a real initialization:
> 
> i.e.
> 
> s2_len = 0;    //.DEFERRED_INIT expanded
> s2_len = 4;    // the original initialization
> 
> Then the first initialization will be eliminated by current RTL optimization 
> easily, right?

Well, in your example above it's effectively elimiated by GIMPLE 
optimization.  IIRC you're using the first argument of .DEFERRED_INIT
for diagnostic purposes only, correct?

Richard.

> Qing
> 
> 
> Richard.
> 
> Can we add any attribute to the internal function argument to prevent later 
> optimizations that might applied on it?
> Or just update “ccp” phase to specially handle calls to .DEFERRED_INIT? (Not 
> sure whether there are other phases have the
> Same issue?)
> 
> Let me know if you have any suggestion.
> 
> Thanks a lot for your help.
> 
> Qing
> 
> --
> Richard Biener <rguent...@suse.de<mailto:rguent...@suse.de>>
> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
> Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)

Reply via email to