llvm/test/Transforms
Benjamin Kramer 1db071f0da 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
2010-07-08 11:39:10 +00:00
..
ABCD
ADCE
ArgumentPromotion
BlockPlacement
BranchFolding
CodeExtractor
CodeGenPrepare
ConstantMerge
ConstProp
DeadArgElim
DeadStoreElimination
FunctionAttrs
GlobalDCE
GlobalOpt
GVN
IndVarSimplify
Inline
InstCombine
Internalize
IPConstantProp
JumpThreading
LCSSA
LICM
LoopDeletion
LoopIndexSplit
LoopRotate
LoopSimplify
LoopStrengthReduce
LoopUnroll
LoopUnswitch
LowerInvoke
LowerSetJmp
LowerSwitch
Mem2Reg
MemCpyOpt
MergeFunc
PartialSpecialize
PruneEH
Reassociate
ScalarRepl
SCCP
SimplifyCFG
SimplifyLibCalls
Sink
SRETPromotion
SSI
StripSymbols
TailCallElim
TailDup