[llvm] [NVPTX] Fix lowering of i1 SETCC (PR #115035)
Justin Fargnoli via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 14 14:29:04 PST 2024
================
@@ -11874,6 +11874,47 @@ bool TargetLowering::LegalizeSetCCCondCode(SelectionDAG &DAG, EVT VT,
return true;
}
+ // Special case: expand i1 comparisons using logical operations.
+ if (OpVT == MVT::i1) {
+ SDValue Ret;
+ switch (CCCode) {
+ default:
+ llvm_unreachable("Unknown integer setcc!");
+ case ISD::SETEQ: // X == Y --> ~(X ^ Y)
+ Ret = DAG.getNOT(dl, DAG.getNode(ISD::XOR, dl, MVT::i1, LHS, RHS),
+ MVT::i1);
+ break;
+ case ISD::SETNE: // X != Y --> (X ^ Y)
+ Ret = DAG.getNode(ISD::XOR, dl, MVT::i1, LHS, RHS);
+ break;
+ case ISD::SETGT: // X >s Y --> X == 0 & Y == 1 --> ~X & Y
+ case ISD::SETULT: // X <u Y --> X == 0 & Y == 1 --> ~X & Y
+ Ret = DAG.getNode(ISD::AND, dl, MVT::i1, RHS,
+ DAG.getNOT(dl, LHS, MVT::i1));
+ break;
+ case ISD::SETLT: // X <s Y --> X == 1 & Y == 0 --> ~Y & X
+ case ISD::SETUGT: // X >u Y --> X == 1 & Y == 0 --> ~Y & X
+ Ret = DAG.getNode(ISD::AND, dl, MVT::i1, LHS,
+ DAG.getNOT(dl, RHS, MVT::i1));
+ break;
+ case ISD::SETULE: // X <=u Y --> X == 0 | Y == 1 --> ~X | Y
+ case ISD::SETGE: // X >=s Y --> X == 0 | Y == 1 --> ~X | Y
+ Ret = DAG.getNode(ISD::OR, dl, MVT::i1, RHS,
+ DAG.getNOT(dl, LHS, MVT::i1));
+ break;
+ case ISD::SETUGE: // X >=u Y --> X == 1 | Y == 0 --> ~Y | X
+ case ISD::SETLE: // X <=s Y --> X == 1 | Y == 0 --> ~Y | X
+ Ret = DAG.getNode(ISD::OR, dl, MVT::i1, LHS,
+ DAG.getNOT(dl, RHS, MVT::i1));
+ break;
+ }
+
+ LHS = DAG.getZExtOrTrunc(Ret, dl, VT);
+ RHS = SDValue();
+ CC = SDValue();
----------------
justinfargnoli wrote:
Explained [here](https://github.com/llvm/llvm-project/blob/196d5fdff1cb7b600dcf11b5464be4fc72dba675/llvm/include/llvm/CodeGen/TargetLowering.h#L5539-L5542).
https://github.com/llvm/llvm-project/pull/115035
More information about the llvm-commits
mailing list