https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79992

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|---                         |INVALID

--- Comment #13 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #10)
> After inlining:
>   [t1.cc:17:42] D.36139 = D.36138;
>   [t1.cc:17:42] D.36138 ={v} {CLOBBER};
>   D.36137 = D.36139;
>   [t1.cc:30:38] need_pie_2 = D.36137;
>   _39 = [t1.cc:31:28] MEM[(const int * *)&need_pie_2 + 8B];
> 
> 
> That looks ok, the clobber is only of 36138, we use 36139, and then use
> 36137.
> 
> After ESRA:
>   [t1.cc:24:33] SR.18_42 = 1;
>   SR.17_1 = SR.18_42;
>   [t1.cc:28:38] base_f$__i_28 = SR.17_1;
>   [t1.cc:16:35] need_pie_1_17 = base_f$__i_28;
>   [t1.cc:10:9] MEM[(struct  &)[t1.cc:17:42] &D.36138] ={v} {CLOBBER};
>   [t1.cc:10:47] [t1.cc:10:47] MEM[(struct __lambda0 *)&D.36138] =
> need_pie_1_17;
>   [t1.cc:10:47] [t1.cc:10:47] D.36138.v = [t1.cc:24:29] &[t1.cc:24:20]
> MEM[(const struct __lambda0 *)[t1.cc:17:42] &D.36138].__i;
>   [t1.cc:17:42] D.36139 = D.36138;
>   [t1.cc:17:42] SR.15_24 = [t1.cc:17:42] MEM[(struct need_pie_2 *)&D.36138];
>   [t1.cc:17:42] SR.16_53 = [t1.cc:17:42] MEM[(struct need_pie_2 *)&D.36138 +
> 8B];
>   [t1.cc:17:42] D.36138 ={v} {CLOBBER};
>   SR.13_21 = SR.15_24;
>   SR.14_20 = SR.16_53;
>   [t1.cc:30:38] need_pie_2_54 = SR.13_21;
>   [t1.cc:30:38] need_pie_2$8_25 = SR.14_20;
>   _39 = need_pie_2$8_25;
>   [t1.cc:32:11] _2 = [t1.cc:32:11] *_39;
> 
> 
> Looks find so far.
> 
> And then after fre:
>   [t1.cc:10:9] MEM[(struct  &)[t1.cc:17:42] &D.36138] ={v} {CLOBBER};
>   [t1.cc:10:47] [t1.cc:10:47] MEM[(struct __lambda0 *)&D.36138] = 1;
>   [t1.cc:10:47] [t1.cc:10:47] D.36138.v = [t1.cc:24:29] &[t1.cc:24:20]
> MEM[(const struct __lambda0 *)[t1.cc:17:42] &D.36138].__i;
>   [t1.cc:17:42] D.36139 = D.36138;
>   [t1.cc:17:42] D.36138 ={v} {CLOBBER};
>   [t1.cc:32:11] _2 = [t1.cc:32:11] MEM[(const int *)&D.36138];
> 
> So FRE messes up.

How so?  SRA has

>   [t1.cc:10:47] [t1.cc:10:47] D.36138.v = [t1.cc:24:29] &[t1.cc:24:20]
> MEM[(const struct __lambda0 *)[t1.cc:17:42] &D.36138].__i;
...
>   [t1.cc:17:42] D.36138 ={v} {CLOBBER};
...
>   [t1.cc:32:11] _2 = [t1.cc:32:11] *_39;

so access *_39 after the clobber.  And _39 points to D.36138.

Clearly this is an invalid testcase.

static auto get_wrapped_number() {
    return [i = 1] { return &i; };
}

returns an address to automatic storage.

Reply via email to