Implement rdar://7860110 (also in target/readme.txt) narrowing
authorChris Lattner <sabre@nondot.org>
Thu, 15 Apr 2010 04:48:01 +0000 (04:48 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 15 Apr 2010 04:48:01 +0000 (04:48 +0000)
commit2392ae7d7344674dc3d946e324342515f4771b90
tree2d8213997e4ea96040beda18dcf7cffe95789eee
parentae541aad5c36cb3e4256514447d1f81e253079c7
Implement rdar://7860110 (also in target/readme.txt) narrowing
a load/or/and/store sequence into a narrower store when it is
safe.  Daniel tells me that clang will start producing this sort
of thing with bitfields, and this does  trigger a few dozen times
on 176.gcc produced by llvm-gcc even now.

This compiles code like CodeGen/X86/2009-05-28-DAGCombineCrash.ll
into:

        movl    %eax, 36(%rdi)

instead of:

        movl    $4294967295, %eax       ## imm = 0xFFFFFFFF
        andq    32(%rdi), %rax
        shlq    $32, %rcx
        addq    %rax, %rcx
        movq    %rcx, 32(%rdi)

and each of the testcases into a single store.  Each of them used
to compile into craziness like this:

_test4:
movl $65535, %eax            ## imm = 0xFFFF
andl (%rdi), %eax
shll $16, %esi
addl %eax, %esi
movl %esi, (%rdi)
ret

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