https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106786
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- See Also| |https://gcc.gnu.org/bugzill | |a/show_bug.cgi?id=121362 --- Comment #11 from Andrew Pinski <pinskia at gcc dot gnu.org> --- There is a missing fre looking through an aggregate copy due to the type difference, unsigned char vs bool: ``` _14 = VIEW_CONVERT_EXPR<unsigned char>(_17); ... MEM <unsigned char> [(struct R *)&D.3049 + 8B] = _14; z = D.3049; _1 = z.carry; ``` _1 is the same as _17 here. if we change bool to `unsigned char`, then fre is able to handle: ``` MEM <unsigned char> [(struct R *)&D.3049 + 8B] = SR.6_8; z = D.3049; _1 = z.carry; _2 = _1 != 0; _12 = (unsigned char) _2; _13 = __builtin_ia32_sbb_u64 (_12, x_5(D), y_6(D), &d); ``` Into: ``` MEM <unsigned char> [(struct R *)&D.3049 + 8B] = _21; z = D.3049; _13 = __builtin_ia32_sbb_u64 (_21, x_5(D), y_6(D), &d); ``` So maybe we can fix this via VN handling of loads of bool via a store to unsigned char as a VCE.