diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2010-07-08 11:39:10 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2010-07-08 11:39:10 +0000 |
commit | 1db071f0dae25d0c5a1af61ca71fa20d0a8e9370 (patch) | |
tree | 932a47f727c526ffbe4b42d99a819b9b3b669e83 /lib/CodeGen/RegAllocLinearScan.cpp | |
parent | 67f8a7bc26c2993854a7e9ab43af362bc4477e3f (diff) |
Teach instcombine to transform
(X >s -1) ? C1 : C2 and (X <s 0) ? C2 : C1
into ((X >>s 31) & (C2 - C1)) + C1, avoiding the conditional.
This optimization could be extended to take non-const C1 and C2 but we better
stay conservative to avoid code size bloat for now.
for
int sel(int n) {
return n >= 0 ? 60 : 100;
}
we now generate
sarl $31, %edi
andl $40, %edi
leal 60(%rdi), %eax
instead of
testl %edi, %edi
movl $60, %ecx
movl $100, %eax
cmovnsl %ecx, %eax
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@107866 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/RegAllocLinearScan.cpp')
0 files changed, 0 insertions, 0 deletions