implement a readme entry, compiling the code into:
authorChris Lattner <sabre@nondot.org>
Thu, 6 Dec 2007 07:33:36 +0000 (07:33 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 6 Dec 2007 07:33:36 +0000 (07:33 +0000)
commite70da20f9a7edb15e1d9bd221839e2ff26e40955
tree50e84498c999203e3bc1535825bc48ed1ced0555
parentc95ba44b30e23f028827bb6be45096b919315abb
implement a readme entry, compiling the code into:

_foo:
movl $12, %eax
andl 4(%esp), %eax
movl _array(%eax), %eax
ret

instead of:

_foo:
movl 4(%esp), %eax
shrl $2, %eax
andl $3, %eax
movl _array(,%eax,4), %eax
ret

As it turns out, this triggers all the time, in a wide variety of
situations, for example, I see diffs like this in various programs:

-       movl    8(%eax), %eax
-       shll    $2, %eax
-       andl    $1020, %eax
-       movl    (%esi,%eax), %eax
+       movzbl  8(%eax), %eax
+       movl    (%esi,%eax,4), %eax

-       shll    $2, %edx
-       andl    $1020, %edx
-       movl    (%edi,%edx), %edx
+       andl    $255, %edx
+       movl    (%edi,%edx,4), %edx

Unfortunately, I also see stuff like this, which can be fixed in the
X86 backend:

-       andl    $85, %ebx
-       addl    _bit_count(,%ebx,4), %ebp
+       shll    $2, %ebx
+       andl    $340, %ebx
+       addl    _bit_count(%ebx), %ebp

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44656 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/SelectionDAG/DAGCombiner.cpp
lib/Target/README.txt
test/CodeGen/X86/shift-combine.ll [new file with mode: 0644]