This is another case where instcombine demanded bits optimization created
authorEvan Cheng <evan.cheng@apple.com>
Tue, 17 Jul 2012 06:53:39 +0000 (06:53 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Tue, 17 Jul 2012 06:53:39 +0000 (06:53 +0000)
commit70e10d3fe4c5df189348f64fce56254a5a32b51c
tree23550acde05b658d6b1b3ca3594121be0c51c3c1
parent06a27cc1aae20e3a2c985dd8dadab3b4ef5d032a
This is another case where instcombine demanded bits optimization created
large immediates. Add dag combine logic to recover in case the large
immediates doesn't fit in cmp immediate operand field.

int foo(unsigned long l) {
  return (l>> 47) == 1;
}

we produce

  %shr.mask = and i64 %l, -140737488355328
  %cmp = icmp eq i64 %shr.mask, 140737488355328
  %conv = zext i1 %cmp to i32
  ret i32 %conv

which codegens to

movq    $0xffff800000000000,%rax
andq    %rdi,%rax
movq    $0x0000800000000000,%rcx
cmpq    %rcx,%rax
sete    %al
movzbl    %al,%eax
ret

TargetLowering::SimplifySetCC would transform
(X & -256) == 256 -> (X >> 8) == 1
if the immediate fails the isLegalICmpImmediate() test. For x86,
that's immediates which are not a signed 32-bit immediate.

Based on a patch by Eli Friedman.

PR10328
rdar://9758774

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160346 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/SelectionDAG/TargetLowering.cpp
lib/Target/X86/X86ISelLowering.cpp
lib/Target/X86/X86ISelLowering.h
test/CodeGen/X86/cmp.ll