mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
X86: Promote i8 cmov when both operands are coming from truncates of the same width.
X86 doesn't have i8 cmovs so isel would emit a branch. Emitting branches at this level is often not a good idea because it's too late for many optimizations to kick in. This solution doesn't add any extensions (truncs are free) and tries to avoid introducing partial register stalls by filtering direct copyfromregs. I'm seeing a ~10% speedup on reading a random .png file with libpng15 via graphicsmagick on x86_64/westmere, but YMMV depending on the microarchitecture. llvm-svn: 165868
This commit is contained in:
parent
60d696131a
commit
a348e5aa65
@ -9148,6 +9148,21 @@ SDValue X86TargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
|
||||
}
|
||||
}
|
||||
|
||||
// X86 doesn't have an i8 cmov. If both operands are the result of a truncate
|
||||
// widen the cmov and push the truncate through. This avoids introducing a new
|
||||
// branch during isel and doesn't add any extensions.
|
||||
if (Op.getValueType() == MVT::i8 &&
|
||||
Op1.getOpcode() == ISD::TRUNCATE && Op2.getOpcode() == ISD::TRUNCATE) {
|
||||
SDValue T1 = Op1.getOperand(0), T2 = Op2.getOperand(0);
|
||||
if (T1.getValueType() == T2.getValueType() &&
|
||||
// Blacklist CopyFromReg to avoid partial register stalls.
|
||||
T1.getOpcode() != ISD::CopyFromReg && T2.getOpcode()!=ISD::CopyFromReg){
|
||||
SDVTList VTs = DAG.getVTList(T1.getValueType(), MVT::Glue);
|
||||
SDValue Cmov = DAG.getNode(X86ISD::CMOV, DL, VTs, T1, T2, CC, Cond);
|
||||
return DAG.getNode(ISD::TRUNCATE, DL, Op.getValueType(), Cmov);
|
||||
}
|
||||
}
|
||||
|
||||
// X86ISD::CMOV means set the result (which is operand 1) to the RHS if
|
||||
// condition is true.
|
||||
SDVTList VTs = DAG.getVTList(Op.getValueType(), MVT::Glue);
|
||||
|
@ -344,3 +344,16 @@ entry:
|
||||
; ATOM: negw
|
||||
; ATOM: sbbw
|
||||
}
|
||||
|
||||
define i8 @test18(i32 %x, i8 zeroext %a, i8 zeroext %b) nounwind {
|
||||
%cmp = icmp slt i32 %x, 15
|
||||
%sel = select i1 %cmp, i8 %a, i8 %b
|
||||
ret i8 %sel
|
||||
; CHECK: test18:
|
||||
; CHECK: cmpl $15
|
||||
; CHECK: cmovll
|
||||
|
||||
; ATOM: test18:
|
||||
; ATOM: cmpl $15
|
||||
; ATOM: cmovll
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user