https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93040
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org --- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- Indeed bswap passes job. I think the issue is the pass sees <bb 2> [local count: 1073741824]: _1 = *p_9(D); _2 = (signed short) _1; _3 = MEM[(unsigned char *)p_9(D) + 1B]; _4 = (int) _3; _5 = _4 << 8; _6 = (signed short) _5; _7 = _2 | _6; _10 = (short unsigned int) _7; return _10; and it analyzes _2 | _6 not being able to deal with the integer promotions occuring somehow. _6 already stops being analyzed at the (int) _3 promotion for some reason for example (possibly depth search limit...). Raising the limit by 1 fixes the get_unaligned_16 testcase, raising by another 1 the get_unaligned_32 one.