https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79992
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |wrong-code
Status|UNCONFIRMED |NEW
Last reconfirmed| |2017-03-10
Component|c++ |tree-optimization
Ever confirmed|0 |1
--- Comment #10 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
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.