On Wed, Jun 30, 2021 at 8:47 AM Qing Zhao via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> I came up with a very simple testing case that can repeat the same issue:
>
> [qinzhao@localhost gcc]$ cat t.c
> extern void bar (int);
> void foo (int a)
> {
>   int i;
>   for (i = 0; i < a; i++) {
>     if (__extension__({int size2;
>         size2 = 4;
>         size2 > 5;}))
>     bar (a);
>   }
> }

You should show the full dump,
What we have is the following:



size2_3 = PHI <size2_1(D), size2_13>
   <bb 3> :

size2_12 = .DEFERRED_INIT (size2_3, 2);
size2_13 = 4;

So CCP decides to propagate 4 into the PHI and then decides size2_1(D)
is undefined so size2_3 is then considered 4 and propagates it into
the .DEFERRED_INIT.

Thanks,
Andrew


>
> [qinzhao@localhost gcc]$ /home/qinzhao/Work/GCC/gcc_build_debug/gcc/xgcc 
> -B/home/qinzhao/Work/GCC/gcc_build_debug/gcc/ -std=c99   -m64  -march=native 
> -ftrivial-auto-var-init=zero t.c -fdump-tree-all  -O1
> t.c: In function ‘foo’:
> t.c:11:1: error: ‘DEFFERED_INIT’ calls should have the same LHS as the first 
> argument
>    11 | }
>       | ^
> size2_12 = .DEFERRED_INIT (4, 2);
> during GIMPLE pass: ccp
> dump file: a-t.c.032t.ccp1
> t.c:11:1: internal compiler error: verify_gimple failed
> 0x143ee47 verify_gimple_in_cfg(function*, bool)
>         ../../latest_gcc/gcc/tree-cfg.c:5501
> 0x122d799 execute_function_todo
>         ../../latest_gcc/gcc/passes.c:2042
> 0x122c74b do_per_function
>         ../../latest_gcc/gcc/passes.c:1687
> 0x122d986 execute_todo
>         ../../latest_gcc/gcc/passes.c:2096
> Please submit a full bug report,
> with preprocessed source if appropriate.
> Please include the complete backtrace with any bug report.
> See <https://gcc.gnu.org/bugs/> for instructions.
>
> In this testing case, both “I” and “size2” are auto vars that are not 
> initialized at declaration but are initialized later by assignment.
> However, “I” doesn’t have any issue, but “size2” has such issue.
>
> ******“ssa” dump:
>
>   <bb 2> :
>   i_7 = .DEFERRED_INIT (i_6(D), 2);
>   i_8 = 0;
>   goto <bb 6>; [INV]
>
>   <bb 3> :
>   size2_12 = .DEFERRED_INIT (size2_3, 2);
>   size2_13 = 4;
>
> ******”ccp1” dump:
>
>   <bb 2> :
>   i_7 = .DEFERRED_INIT (i_6(D), 2);
>   goto <bb 4>; [INV]
>
>   <bb 3> :
>   size2_12 = .DEFERRED_INIT (4, 2);
>
> So, I am wondering:  Is it possible that “ssa” phase have a bug ?
>
> Qing
>
> > On Jun 30, 2021, at 9:39 AM, Richard Biener <rguent...@suse.de> wrote:
> >
> > 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