Index: lib/CodeGen/SelectionDAG/LegalizeDAG.cpp =================================================================== --- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -1676,20 +1676,24 @@ case ISD::SETGT: case ISD::SETGE: case ISD::SETLT: - // We only support using the inverted operation, which is computed above - // and not a different manner of supporting expanding these cases. - llvm_unreachable("Don't know how to expand this condition!"); case ISD::SETNE: case ISD::SETEQ: - // Try inverting the result of the inverse condition. - InvCC = CCCode == ISD::SETEQ ? ISD::SETNE : ISD::SETEQ; + // Swapping operands was already attempted and it didn't work. + // Try inverting the condition. + InvCC = getSetCCInverse(CCCode, OpVT.isInteger()); + if (!TLI.isCondCodeLegal(InvCC, OpVT)) { + // If inverting the condition is not enough, try swapping operands + // on top of it. + InvCC = ISD::getSetCCSwappedOperands(InvCC); + std::swap(LHS, RHS); + } if (TLI.isCondCodeLegal(InvCC, OpVT)) { CC = DAG.getCondCode(InvCC); NeedInvert = true; return true; } - // If inverting the condition didn't work then we have no means to expand - // the condition. + // If all combinations of inverting the condition and swapping operands + // didn't work then we have no means to expand the condition. llvm_unreachable("Don't know how to expand this condition!"); }