https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91606
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org, | |rguenth at gcc dot gnu.org --- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- This is miscompiled during dse1 (or the IL is already wrong earlier). Before dse1 we have in bb2 <bb 2> : D.10827._M_elems[0].D.10649.f1.__pfn = fun1; D.10827._M_elems[0].D.10649.f1.__delta = 0; D.10827._M_elems[0].index = 0; D.10827._M_elems[1].D.10649.f2.__pfn = fun2; D.10827._M_elems[1].D.10649.f2.__delta = 0; D.10827._M_elems[1].index = 1; <bb 3> : # idx_6 = PHI <0(2), idx_27(9)> # __for_begin_7 = PHI <&MEM <struct variant[2]> [(void *)&D.10827](2), __for_begin_28(9)> if (&MEM <struct variant[2]> [(void *)&D.10827 + 48B] == __for_begin_7) goto <bb 10>; [INV] else goto <bb 4>; [INV] <bb 4> : _18 = MEM[(const struct variant *)__for_begin_7].index; if (_18 != 0) goto <bb 9>; [17.38%] else goto <bb 5>; [82.62%] <bb 5> : _31 = &MEM[(const struct variant *)__for_begin_7].D.10649.f1; _1 = _31->__pfn; _2 = memFuncPtr.__pfn; if (_1 == _2) and so in the first iteration it goes bb2, bb3, bb4 and bb5 and bb5 reads _31->__pfn and thus D.10827._M_elems[0].D.10649.f1, but DSE1 removes the D.10827._M_elems[0].D.10649.f1.__pfn = fun1; D.10827._M_elems[0].D.10649.f1.__delta = 0; and D.10827._M_elems[1].D.10649.f2.__pfn = fun2; D.10827._M_elems[1].D.10649.f2.__delta = 0; stores.