https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63321
--- Comment #5 from Oleg Endo <olegendo at gcc dot gnu.org> ---
(In reply to Oleg Endo from comment #3)
> A more advanced example:
>
> void test4 (unsigned int x, unsigned int* y)
> {
> y[0] = (x >> 0) & 1;
> y[1] = (x >> 1) & 1;
> y[2] = x >> 2;
> }
Which is just another example of re-using intermediate results of stitched
shifts, only a bit more complex due to the multiple-set insns.
void test5 (unsigned int x, unsigned int* y)
{
y[0] = x << (2);
y[1] = x << (2 + 2);
y[2] = x << (2 + 2 + 8);
}
currently compiles to:
mov r4,r1
shll2 r1
mov.l r1,@r5
mov r4,r1
shll2 r1
shll2 r1
mov.l r1,@(4,r5)
mov #12,r1
shld r1,r4
rts
mov.l r4,@(8,r5)
better:
shll2 r4
mov.l r4,@r5
shll2 r4
mov.l r4,@(4,r5)
shll8 r4
rts
mov.l r4,@(8,r5)
See also some examples in PR 54089.