https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70079
--- Comment #2 from Paolo Bonzini <bonzini at gnu dot org> ---
Yes, until combine there is the equivalent of
addl $512, %ecx ;; 4
andl $-8, %ecx ;; 4.5
shrl $3, %ecx ;; 5
and combine is able to merge insn 4.5 and 5 into just the shrl.
However, this optimization would require combine to merge together a lot of
instructions. Even with some munging of the expander, the best you could get
is probably four:
leaq 8(%rdi), %rdi ;; rdi = b' = b + 8
leaq -8(%rdi), %rcx ;; i1: rcx = b' - 8
andq $-8, %rdi ;; i2: rdi = b' & -8
subq %rdi, %rcx ;; i3: rcx = b' - 8 - (b' & -8) = (b' & 7)
- 8
shrl $3, %ecx ;; i4: rcx = -1
addl $32, %ecx ;; rcx = 31
The constant isn't visible with a subset of them.