diff options
author | Evan Cheng <evan.cheng@apple.com> | 2009-03-31 20:42:45 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2009-03-31 20:42:45 +0000 |
commit | 826b6f0f7c5595061050f39041531af13d332e91 (patch) | |
tree | bd43edaf265d25418c0c82e93cfa56029b12b628 /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | 4e81c3ccac4ebd78142743442edca454f1144b6c (diff) | |
download | bcm5719-llvm-826b6f0f7c5595061050f39041531af13d332e91.tar.gz bcm5719-llvm-826b6f0f7c5595061050f39041531af13d332e91.zip |
Throttle back "fold select into operand" transformation. InstCombine should not generate selects of two constants unless they are selects of 0 and 1.
e.g.
define i32 @t1(i32 %c, i32 %x) nounwind {
%t1 = icmp eq i32 %c, 0
%t2 = lshr i32 %x, 18
%t3 = select i1 %t1, i32 %t2, i32 %x
ret i32 %t3
}
was turned into
define i32 @t2(i32 %c, i32 %x) nounwind {
%t1 = icmp eq i32 %c, 0
%t2 = select i1 %t1, i32 18, i32 0
%t3 = lshr i32 %x, %t2
ret i32 %t3
}
For most targets, that means materializing two constants and then a select. e.g. On x86-64
movl %esi, %eax
shrl $18, %eax
testl %edi, %edi
cmovne %esi, %eax
ret
=>
xorl %eax, %eax
testl %edi, %edi
movl $18, %ecx
cmovne %eax, %ecx
movl %esi, %eax
shrl %cl, %eax
ret
Also, the optimizer and codegen can reason about shl / and / add, etc. by a constant. This optimization will hinder optimizations using ComputeMaskedBits.
llvm-svn: 68142
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
0 files changed, 0 insertions, 0 deletions