https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91202
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Though, note the combiner doesn't try to match that, nor with the void foo (unsigned char a, unsigned char b, unsigned char *c) { *c = a >> b; } case, the final subreg is in some other instruction (e.g. the set of hard register to it, or memory store) and combiner doesn't try to split i at the point of the subreg but of the subreg operand. Dunno what options we have, hand recognize in some machine specific pass, or a new optab for that kind of thing, something else?