https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105495
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- The reason why it works in #c1 is that we replace the c = x_4(D); n_6 = 2; n.0_1 = n_6; n.1_2 = (unsigned int) n.0_1; __atomic_compare_exchange_4 (p_7(D), &c, n.1_2, 1, 0, 0); call in the IL with: c_20 = x_4(D); _15 = c_20; _16 = VIEW_CONVERT_EXPR<unsigned int>(_15); _17 = .ATOMIC_COMPARE_EXCHANGE (p_7(D), _16, 2, 260, 0, 0); _18 = REALPART_EXPR <_17>; _19 = VIEW_CONVERT_EXPR<int>(_18); c_21 = _19; during ccp1 pass, optimizing away the addressables. But we don't do that for aggregates with sizes of integer types, but supposedly we could do that too.