@@ -13529,6 +13529,84 @@ SDValue DAGCombiner::visitSETCC(SDNode *N) {
13529
13529
SDValue N0 = N->getOperand(0), N1 = N->getOperand(1);
13530
13530
SDLoc DL(N);
13531
13531
13532
+ // Detect impossible conditions using known bits analysis.
13533
+ if (ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1)) {
13534
+ const APInt &C1 = N1C->getAPIntValue();
13535
+ KnownBits KnownRHS = KnownBits::makeConstant(C1);
13536
+
13537
+ // Bail out early if RHS is unknown (shouldn't happen for constants)
13538
+ if (KnownRHS.isUnknown())
13539
+ return SDValue();
13540
+
13541
+ std::optional<bool> KnownVal;
13542
+
13543
+ // Handle special cases first (like GlobalISel does)
13544
+ if (KnownRHS.isZero()) {
13545
+ // x >=u 0 -> always true
13546
+ // x <u 0 -> always false
13547
+ if (Cond == ISD::SETUGE)
13548
+ KnownVal = true;
13549
+ else if (Cond == ISD::SETULT)
13550
+ KnownVal = false;
13551
+ }
13552
+
13553
+ // If not handled by special cases, use ICmpInst::compare
13554
+ if (!KnownVal) {
13555
+ KnownBits KnownLHS = DAG.computeKnownBits(N0);
13556
+
13557
+ // Convert ISD::CondCode to CmpInst::Predicate
13558
+ CmpInst::Predicate Pred;
13559
+ switch (Cond) {
13560
+ case ISD::SETEQ:
13561
+ Pred = CmpInst::ICMP_EQ;
13562
+ break;
13563
+ case ISD::SETNE:
13564
+ Pred = CmpInst::ICMP_NE;
13565
+ break;
13566
+ case ISD::SETULT:
13567
+ Pred = CmpInst::ICMP_ULT;
13568
+ break;
13569
+ case ISD::SETULE:
13570
+ Pred = CmpInst::ICMP_ULE;
13571
+ break;
13572
+ case ISD::SETUGT:
13573
+ Pred = CmpInst::ICMP_UGT;
13574
+ break;
13575
+ case ISD::SETUGE:
13576
+ Pred = CmpInst::ICMP_UGE;
13577
+ break;
13578
+ case ISD::SETLT:
13579
+ Pred = CmpInst::ICMP_SLT;
13580
+ break;
13581
+ case ISD::SETLE:
13582
+ Pred = CmpInst::ICMP_SLE;
13583
+ break;
13584
+ case ISD::SETGT:
13585
+ Pred = CmpInst::ICMP_SGT;
13586
+ break;
13587
+ case ISD::SETGE:
13588
+ Pred = CmpInst::ICMP_SGE;
13589
+ break;
13590
+ default:
13591
+ return SDValue(); // Unsupported predicate
13592
+ }
13593
+
13594
+ // Use the same logic as GlobalISel: ICmpInst::compare
13595
+ KnownVal = ICmpInst::compare(KnownLHS, KnownRHS, Pred);
13596
+ }
13597
+
13598
+ // If the comparison result is known, replace with constant
13599
+ if (KnownVal) {
13600
+ if (*KnownVal) {
13601
+ // Use the target's true value for comparisons
13602
+ return DAG.getBoolConstant(true, DL, VT, VT);
13603
+ } else {
13604
+ // False is always 0
13605
+ return DAG.getConstant(0, DL, VT);
13606
+ }
13607
+ }
13608
+ }
13609
+
13532
13610
if (SDValue Combined = SimplifySetCC(VT, N0, N1, Cond, DL, !PreferSetCC)) {
13533
13611
// If we prefer to have a setcc, and we don't, we'll try our best to
13534
13612
// recreate one using rebuildSetCC.
0 commit comments