[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
Nate Begeman
natebegeman at mac.com
Wed Aug 10 19:18:27 PDT 2005
Changes in directory llvm/lib/CodeGen/SelectionDAG:
SelectionDAG.cpp updated: 1.135 -> 1.136
---
Log message:
Add a select_cc optimization for recognizing abs(int). This speeds up an
integer MPEG encoding loop by a factor of two.
---
Diffs of the changes: (+16 -0)
SelectionDAG.cpp | 16 ++++++++++++++++
1 files changed, 16 insertions(+)
Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.135 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.136
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.135 Wed Aug 10 20:12:20 2005
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Wed Aug 10 21:18:13 2005
@@ -1495,6 +1495,22 @@
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;
More information about the llvm-commits
mailing list