[llvm-commits] [llvm] r120932 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp test/CodeGen/X86/select.ll

Chris Lattner clattner at apple.com
Sun Dec 5 16:47:12 PST 2010


On Dec 5, 2010, at 4:36 PM, Chris Lattner wrote:
On Dec 5, 2010, at 3:32 PM, Evan Cheng wrote:
>>> but this also helps if the other value is an imm or load, because those can be folded into orq but not into cmov.
>> 
>> That may be true. I'd still call this optimization suspect. A couple of cycles of latencies means very little for modern x86. Instruction throughput is probably just as important and the extra instruction here may actually be an pessimisation.
>> 
>> Both gcc and icc just generates something like this. What are we missing? It doesn't seem like they are concerned with overflow?
>>       salq    $2, %rdi
>>       jmp     __Znam
> 
> Right, they don't handle the integer overflow case.  In this particular example, what we really want is a way to say that the select is heavily biased, so that we get a jump instead of cmov (or cmov equivalent).  We really want:
> 
>  mulq <reg>
>  jo Lfoo
>  jmp __Znam
> Lfoo:
>  mov rdi, -1
>  jmp __Znam

Along these lines, I wonder if it would be enough to just mark IR select/condbr instructions with an instruction MDNode like !highlybiased (optionally with a direction).  This could be preserved down to codegen level and used for expansion there.  This would also be a straight-forward way to model __builtin_expect.

-Chris



More information about the llvm-commits mailing list