mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-26 05:00:26 +00:00
optimize the case of cond ? 42 : 41 and friends. This compiles the
example to: _test: movl 4(%esp), %eax cmpl $41, (%eax) setg %al movzbl %al, %eax orl $4294967294, %eax ret instead of: movl 4(%esp), %eax cmpl $41, (%eax) movl $4294967294, %ecx movl $4294967295, %eax cmova %ecx, %eax ret which is smaller in code size and faster. rdar://6668608 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66868 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0582ae99ba
commit
97a29a5fee
@ -8218,6 +8218,18 @@ static SDValue PerformSELECTCombine(SDNode *N, SelectionDAG &DAG,
|
||||
return DAG.getNode(ISD::SHL, DL, LHS.getValueType(), Cond,
|
||||
DAG.getConstant(ShAmt, MVT::i8));
|
||||
}
|
||||
|
||||
// Optimize Cond ? cst+1 : cst -> zext(setcc(C)+cst.
|
||||
if (RHSC->getAPIntValue()+1 == LHSC->getAPIntValue()) {
|
||||
if (NeedsCondInvert) // Invert the condition if needed.
|
||||
Cond = DAG.getNode(ISD::XOR, DL, Cond.getValueType(), Cond,
|
||||
DAG.getConstant(1, Cond.getValueType()));
|
||||
|
||||
// Zero extend the condition if needed.
|
||||
Cond = DAG.getNode(ISD::ZERO_EXTEND, DL, RHSC->getValueType(0), Cond);
|
||||
return DAG.getNode(ISD::ADD, DL, Cond.getValueType(), Cond,
|
||||
SDValue(RHSC, 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -8263,6 +8275,21 @@ static SDValue PerformCMOVCombine(SDNode *N, SelectionDAG &DAG,
|
||||
return DCI.CombineTo(N, Cond, SDValue());
|
||||
return Cond;
|
||||
}
|
||||
|
||||
// Optimize Cond ? cst+1 : cst -> zext(setcc(C)+cst.
|
||||
if (FalseC->getAPIntValue()+1 == TrueC->getAPIntValue()) {
|
||||
SDValue Cond = N->getOperand(3);
|
||||
Cond = DAG.getNode(X86ISD::SETCC, DL, MVT::i8,
|
||||
DAG.getConstant(CC, MVT::i8), Cond);
|
||||
|
||||
// Zero extend the condition if needed.
|
||||
Cond = DAG.getNode(ISD::ZERO_EXTEND, DL, FalseC->getValueType(0), Cond);
|
||||
Cond = DAG.getNode(ISD::ADD, DL, Cond.getValueType(), Cond,
|
||||
SDValue(FalseC, 0));
|
||||
if (N->getNumValues() == 2) // Dead flag value?
|
||||
return DCI.CombineTo(N, Cond, SDValue());
|
||||
return Cond;
|
||||
}
|
||||
}
|
||||
}
|
||||
return SDValue();
|
||||
|
14
test/CodeGen/X86/select-no-cmov.ll
Normal file
14
test/CodeGen/X86/select-no-cmov.ll
Normal file
@ -0,0 +1,14 @@
|
||||
; RUN: llvm-as < %s | llc | not grep cmov
|
||||
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
|
||||
target triple = "i386-apple-darwin7"
|
||||
|
||||
; Should compile to setcc | -2.
|
||||
; rdar://6668608
|
||||
define i32 @test(i32* nocapture %P) nounwind readonly {
|
||||
entry:
|
||||
%0 = load i32* %P, align 4 ; <i32> [#uses=1]
|
||||
%1 = icmp sgt i32 %0, 41 ; <i1> [#uses=1]
|
||||
%iftmp.0.0 = select i1 %1, i32 -1, i32 -2 ; <i32> [#uses=1]
|
||||
ret i32 %iftmp.0.0
|
||||
}
|
Loading…
Reference in New Issue
Block a user