Teach DAGCombine to fold fold (sra (trunc (sr x, c1)), c2) -> (trunc (sra x, c1+c2...
authorBenjamin Kramer <benny.kra@googlemail.com>
Sun, 30 Jan 2011 16:38:43 +0000 (16:38 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sun, 30 Jan 2011 16:38:43 +0000 (16:38 +0000)
commit9b108a338d544a6baf2ff087055326e301e6815d
tree345e4c3631032d90ad172e06bc26fef3c0b3ebf3
parentbb25e2c91b79fc31103510860e1817863a674bc5
Teach DAGCombine to fold fold (sra (trunc (sr x, c1)), c2) -> (trunc (sra x, c1+c2) when c1 equals the amount of bits that are truncated off.

This happens all the time when a smul is promoted to a larger type.

On x86-64 we now compile "int test(int x) { return x/10; }" into
  movslq  %edi, %rax
  imulq $1717986919, %rax, %rax
  movq  %rax, %rcx
  shrq  $63, %rcx
  sarq  $34, %rax <- used to be "shrq $32, %rax; sarl $2, %eax"
  addl  %ecx, %eax

This fires 96 times in gcc.c on x86-64.

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