https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61306
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- 16 bit load in host endianness found at: b.3_7 = (int) load_dst_10; at least the dumping is confusing as well ;) But the issue seems to be that we are missing that a.0_2 and c.1_3 sign-extend. a.0_2 = a; c.1_3 = (char) a.0_2; c = c.1_3; _5 = (int) a.0_2; _6 = (int) c.1_3; b.3_7 = _6 | _5;