diff options
| author | Nate Begeman <natebegeman@mac.com> | 2005-08-25 20:04:38 +0000 | 
|---|---|---|
| committer | Nate Begeman <natebegeman@mac.com> | 2005-08-25 20:04:38 +0000 | 
| commit | 33840c32684f655f92e205a3f5b014d2ddaa006b (patch) | |
| tree | 4eb7305fc37e6926788954a7a7b79631673e023d /llvm/lib/CodeGen | |
| parent | 65ffd8fbf4a5bf12a741760223d13a6db4d706a4 (diff) | |
| download | bcm5719-llvm-33840c32684f655f92e205a3f5b014d2ddaa006b.tar.gz bcm5719-llvm-33840c32684f655f92e205a3f5b014d2ddaa006b.zip | |
New fold for SELECT_CC
llvm-svn: 23058
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 20 | 
1 files changed, 19 insertions, 1 deletions
| diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 7a123aa9aa0..c3d1bb398e4 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -843,6 +843,7 @@ SDOperand SelectionDAG::SimplifySelectCC(SDOperand N1, SDOperand N2,                                           SDOperand N3, SDOperand N4,                                            ISD::CondCode CC) {    MVT::ValueType VT = N3.getValueType(); +  ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.Val);    ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2.Val);    ConstantSDNode *N3C = dyn_cast<ConstantSDNode>(N3.Val);    ConstantSDNode *N4C = dyn_cast<ConstantSDNode>(N4.Val); @@ -865,6 +866,23 @@ SDOperand SelectionDAG::SimplifySelectCC(SDOperand N1, SDOperand N2,      }    } +  // check to see if we're select_cc'ing a select_cc. +  // this allows us to turn: +  // select_cc set[eq,ne] (select_cc cc, lhs, rhs, 1, 0), 0, true, false -> +  // select_cc cc, lhs, rhs, true, false +  if ((N1C && N1C->isNullValue() && N2.getOpcode() == ISD::SELECT_CC) || +      (N2C && N2C->isNullValue() && N1.getOpcode() == ISD::SELECT_CC) && +      (CC == ISD::SETEQ || CC == ISD::SETNE)) { +    SDOperand SCC = N1C ? N2 : N1; +    ConstantSDNode *SCCT = dyn_cast<ConstantSDNode>(SCC.getOperand(2)); +    ConstantSDNode *SCCF = dyn_cast<ConstantSDNode>(SCC.getOperand(3)); +    if (SCCT && SCCF && SCCF->isNullValue() && SCCT->getValue() == 1ULL) { +      if (CC == ISD::SETEQ) std::swap(N3, N4); +      return getNode(ISD::SELECT_CC, N3.getValueType(), SCC.getOperand(0),  +                     SCC.getOperand(1), N3, N4, SCC.getOperand(4)); +    } +  } +          // Check to see if we can perform the "gzip trick", transforming    // select_cc setlt X, 0, A, 0 -> and (sra X, size(X)-1), A    if (N2C && N2C->isNullValue() && N4C && N4C->isNullValue() && @@ -894,7 +912,7 @@ SDOperand SelectionDAG::SimplifySelectCC(SDOperand N1, SDOperand N2,      }    } -  // Check to see if this is the equivalent of setcc X, 0 +  // Check to see if this is the equivalent of setcc    if (N4C && N4C->isNullValue() && N3C && (N3C->getValue() == 1ULL)) {      MVT::ValueType XType = N1.getValueType();      if (TLI.isOperationLegal(ISD::SETCC, TLI.getSetCCResultTy())) | 

