mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-23 20:45:06 +00:00
Add a select_cc optimization for recognizing abs(int). This speeds up an
integer MPEG encoding loop by a factor of two. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22758 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e5d63829fd
commit
e1fae4a3ae
@ -1495,6 +1495,22 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
|
|||||||
return getNode(ISD::AND, AType, Shift, N3);
|
return getNode(ISD::AND, AType, Shift, N3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check to see if this is an integer abs. select_cc setl[te] X, 0, -X, X ->
|
||||||
|
// Y = sra (X, size(X)-1); xor (add (X, Y), Y)
|
||||||
|
if (N2C && N2C->isNullValue() && (CC == ISD::SETLT || CC == ISD::SETLE) &&
|
||||||
|
N1 == N4 && N3.getOpcode() == ISD::SUB && N1 == N3.getOperand(1)) {
|
||||||
|
if (ConstantSDNode *SubC = dyn_cast<ConstantSDNode>(N3.getOperand(0))) {
|
||||||
|
MVT::ValueType XType = N1.getValueType();
|
||||||
|
if (SubC->isNullValue() && MVT::isInteger(XType)) {
|
||||||
|
SDOperand Shift = getNode(ISD::SRA, XType, N1,
|
||||||
|
getConstant(MVT::getSizeInBits(XType)-1,
|
||||||
|
TLI.getShiftAmountTy()));
|
||||||
|
return getNode(ISD::XOR, XType, getNode(ISD::ADD, XType, N1, Shift),
|
||||||
|
Shift);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<SDOperand> Ops;
|
std::vector<SDOperand> Ops;
|
||||||
|
Loading…
Reference in New Issue
Block a user