diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 16 | 
2 files changed, 19 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index a2ea1aa537b..440f56edfe8 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -1652,8 +1652,8 @@ void SelectionDAGLegalize::ExpandDYNAMIC_STACKALLOC(SDNode* Node,  /// If the SETCC has been legalized using the inverse condcode, then LHS and  /// RHS will be unchanged, CC will set to the inverted condcode, and NeedInvert  /// will be set to true. The caller must invert the result of the SETCC with -/// SelectionDAG::getNOT() or take equivalent action to swap the effect of a -/// true/false result. +/// SelectionDAG::getLogicalNOT() or take equivalent action to swap the effect +/// of a true/false result.  ///  /// \returns true if the SetCC has been legalized, false if it hasn't.  bool SelectionDAGLegalize::LegalizeSetCCCondCode(EVT VT, @@ -3876,7 +3876,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {        // If we expanded the SETCC by inverting the condition code, then wrap        // the existing SETCC in a NOT to restore the intended condition.        if (NeedInvert) -        Tmp1 = DAG.getNOT(dl, Tmp1, Tmp1->getValueType(0)); +        Tmp1 = DAG.getLogicalNOT(dl, Tmp1, Tmp1->getValueType(0));        Results.push_back(Tmp1);        break; diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 46213a106f3..4bf147730bf 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -992,6 +992,22 @@ SDValue SelectionDAG::getNOT(SDLoc DL, SDValue Val, EVT VT) {    return getNode(ISD::XOR, DL, VT, Val, NegOne);  } +SDValue SelectionDAG::getLogicalNOT(SDLoc DL, SDValue Val, EVT VT) { +  EVT EltVT = VT.getScalarType(); +  SDValue TrueValue; +  switch (TLI->getBooleanContents(VT.isVector())) { +    case TargetLowering::ZeroOrOneBooleanContent: +    case TargetLowering::UndefinedBooleanContent: +      TrueValue = getConstant(1, VT); +      break; +    case TargetLowering::ZeroOrNegativeOneBooleanContent: +      TrueValue = getConstant(APInt::getAllOnesValue(EltVT.getSizeInBits()), +                              VT); +      break; +  } +  return getNode(ISD::XOR, DL, VT, Val, TrueValue); +} +  SDValue SelectionDAG::getConstant(uint64_t Val, EVT VT, bool isT, bool isO) {    EVT EltVT = VT.getScalarType();    assert((EltVT.getSizeInBits() >= 64 ||  | 

