Extend CanEvaluateZExtd to handle and/or/xor more aggressively in the
authorChris Lattner <sabre@nondot.org>
Mon, 11 Jan 2010 04:05:13 +0000 (04:05 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 11 Jan 2010 04:05:13 +0000 (04:05 +0000)
commit7acc4b12813117774deefb54c5febb49a215aa70
treec08e8a420a122b404ec6f293aa7e3561d5d0034e
parent789162a30971c3071a6c9edff3bc32084410e9dc
Extend CanEvaluateZExtd to handle and/or/xor more aggressively in the
BitsToClear case.  This allows it to promote expressions which have an
and/or/xor after the lshr, promoting cases like test2 (from PR4216)
and test3 (random extample extracted from a spec benchmark).

clang now compiles the code in PR4216 into:

_test_bitfield:                                             ## @test_bitfield
movl %edi, %eax
orl $194, %eax
movl $4294902010, %ecx
andq %rax, %rcx
orl $32768, %edi
andq $39936, %rdi
movq %rdi, %rax
orq %rcx, %rax
ret

instead of:

_test_bitfield:                                             ## @test_bitfield
movl %edi, %eax
orl $194, %eax
movl $4294902010, %ecx
andq %rax, %rcx
shrl $8, %edi
orl $128, %edi
shlq $8, %rdi
andq $39936, %rdi
movq %rdi, %rax
orq %rcx, %rax
ret

which is still not great, but is progress.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93145 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/InstCombine/InstCombineCasts.cpp
test/Transforms/InstCombine/cast.ll