https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65478
--- Comment #16 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Jan Hubicka from comment #15) > The inline bump needed is about 23. Richard, i guess convincing early > optimizers to turn that hack into shifts (that is done by GCC but only at > RTL time), is out of reach for this release, right? Humm, you mean <bb 2>: x.d = arg1_3(D); _5 = x.i[3]; if (_5 != 0) goto <bb 3>; else goto <bb 4>; ... <bb 4>: _12 = x.i[2]; if (_12 != 0) goto <bb 5>; else goto <bb 6>; to sth like <bb 4>: _12 = (unsigned short)(arg1_3(D) >> 32); if (_12 != 0) goto <bb 5>; else goto <bb 6>; ? SCCVN doesn't handle sth "fancy" for the case of union accesses with not matching offset/size. We could add that, but I suppose in your case it's just for the sake of inliner predicates as the actual generated code might be worse on some targets? But yes, in principle we can do sth fancy for union loads, though I'd use BIT_FIELD_REFs (hoping no issues wrt endian...) as the canonical and "easy" way to represent things here. Thus _12 = BIT_FIELD_REF <arg1_3(D), ...> (or REALPART/IMAGPART for special cases where that is valid).