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.