diff options
author | Owen Anderson <resistor@mac.com> | 2010-09-21 20:42:50 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2010-09-21 20:42:50 +0000 |
commit | 5e65dfbb970870142dbcea166ba5344f5a9317e2 (patch) | |
tree | d2f48fd1c2e2fe792a41bfba4a851cb198fdefeb /llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | |
parent | dd83548fea98f25ea24a6966bc17d29d9926269f (diff) | |
download | bcm5719-llvm-5e65dfbb970870142dbcea166ba5344f5a9317e2.tar.gz bcm5719-llvm-5e65dfbb970870142dbcea166ba5344f5a9317e2.zip |
Reimplement r114460 in target-independent DAGCombine rather than target-dependent, by using
the predicate to discover the number of sign bits. Enhance X86's target lowering to provide
a useful response to this query.
llvm-svn: 114473
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index c71b3c0cad1..1bd1e00fcd0 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -1424,6 +1424,20 @@ SDValue DAGCombiner::visitADD(SDNode *N) { N0.getOperand(0).getOperand(1), N0.getOperand(1))); + if (N1.getOpcode() == ISD::AND) { + SDValue AndOp0 = N1.getOperand(0); + ConstantSDNode *AndOp1 = dyn_cast<ConstantSDNode>(N1->getOperand(1)); + unsigned NumSignBits = DAG.ComputeNumSignBits(AndOp0); + unsigned DestBits = VT.getScalarType().getSizeInBits(); + + // (add z, (and (sbbl x, x), 1)) -> (sub z, (sbbl x, x)) + // and similar xforms where the inner op is either ~0 or 0. + if (NumSignBits == DestBits && AndOp1 && AndOp1->isOne()) { + DebugLoc DL = N->getDebugLoc(); + return DAG.getNode(ISD::SUB, DL, VT, N->getOperand(0), AndOp0); + } + } + return SDValue(); } |