Index: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -1623,6 +1623,7 @@ MVT OpVT = LHS.getSimpleValueType(); ISD::CondCode CCCode = cast(CC)->get(); NeedInvert = false; + bool NeedSwap = false; switch (TLI.getCondCodeAction(CCCode, OpVT)) { default: llvm_unreachable("Unknown condition code action!"); case TargetLowering::Legal: @@ -1635,6 +1636,22 @@ CC = DAG.getCondCode(InvCC); return true; } + // Swapping operands 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); + NeedSwap = true; + } + if (TLI.isCondCodeLegal(InvCC, OpVT)) { + CC = DAG.getCondCode(InvCC); + NeedInvert = true; + if (NeedSwap) + std::swap(LHS, RHS); + return true; + } + ISD::CondCode CC1 = ISD::SETCC_INVALID, CC2 = ISD::SETCC_INVALID; unsigned Opc = 0; switch (CCCode) { @@ -1676,20 +1693,10 @@ 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; - 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!"); }