BuildUDIV: If the divisor is even we can simplify the fixup of the multiplied value...
authorBenjamin Kramer <benny.kra@googlemail.com>
Thu, 17 Mar 2011 20:39:14 +0000 (20:39 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Thu, 17 Mar 2011 20:39:14 +0000 (20:39 +0000)
commit1c10b8de46ce8e39178eeded4786b1e53722f099
treeeac996256e2784243c516affcd8e5910c3226ec9
parentd9103df51b858cf051a1650ac7eb33d416e9ac41
BuildUDIV: If the divisor is even we can simplify the fixup of the multiplied value by introducing an early shift.

This allows us to compile "unsigned foo(unsigned x) { return x/28; }" into
shrl $2, %edi
imulq $613566757, %rdi, %rax
shrq $32, %rax
ret

instead of
movl    %edi, %eax
imulq   $613566757, %rax, %rcx
shrq    $32, %rcx
subl    %ecx, %eax
shrl    %eax
addl    %ecx, %eax
shrl    $4, %eax

on x86_64

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127829 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/SelectionDAG/TargetLowering.cpp
test/CodeGen/X86/divide-by-constant.ll