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

Evan Cheng evan.cheng at apple.com
Sun Dec 5 20:25:33 PST 2010


On Dec 5, 2010, at 4:47 PM, Chris Lattner wrote:

> 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.

Do we want to make it a more generic MDNode so we can use it to encode branch probability?

Evan

> 
> -Chris





More information about the llvm-commits mailing list