@@ -6576,6 +6576,16 @@ Instruction *InstCombinerImpl::foldICmpUsingKnownBits(ICmpInst &I) {
65766576 return &I;
65776577 }
65786578
6579+ if (!isa<Constant>(Op0) && Op0Known.isConstant ())
6580+ return new ICmpInst (
6581+ Pred, ConstantExpr::getIntegerValue (Ty, Op0Known.getConstant ()), Op1);
6582+ if (!isa<Constant>(Op1) && Op1Known.isConstant ())
6583+ return new ICmpInst (
6584+ Pred, Op0, ConstantExpr::getIntegerValue (Ty, Op1Known.getConstant ()));
6585+
6586+ if (std::optional<bool > Res = ICmpInst::compare (Op0Known, Op1Known, Pred))
6587+ return replaceInstUsesWith (I, ConstantInt::getBool (I.getType (), *Res));
6588+
65796589 // Given the known and unknown bits, compute a range that the LHS could be
65806590 // in. Compute the Min, Max and RHS values based on the known bits. For the
65816591 // EQ and NE we use unsigned values.
@@ -6593,14 +6603,6 @@ Instruction *InstCombinerImpl::foldICmpUsingKnownBits(ICmpInst &I) {
65936603 Op1Max = Op1Known.getMaxValue ();
65946604 }
65956605
6596- // If Min and Max are known to be the same, then SimplifyDemandedBits figured
6597- // out that the LHS or RHS is a constant. Constant fold this now, so that
6598- // code below can assume that Min != Max.
6599- if (!isa<Constant>(Op0) && Op0Min == Op0Max)
6600- return new ICmpInst (Pred, ConstantExpr::getIntegerValue (Ty, Op0Min), Op1);
6601- if (!isa<Constant>(Op1) && Op1Min == Op1Max)
6602- return new ICmpInst (Pred, Op0, ConstantExpr::getIntegerValue (Ty, Op1Min));
6603-
66046606 // Don't break up a clamp pattern -- (min(max X, Y), Z) -- by replacing a
66056607 // min/max canonical compare with some other compare. That could lead to
66066608 // conflict with select canonicalization and infinite looping.
@@ -6682,13 +6684,9 @@ Instruction *InstCombinerImpl::foldICmpUsingKnownBits(ICmpInst &I) {
66826684 // simplify this comparison. For example, (x&4) < 8 is always true.
66836685 switch (Pred) {
66846686 default :
6685- llvm_unreachable ( " Unknown icmp opcode! " ) ;
6687+ break ;
66866688 case ICmpInst::ICMP_EQ:
66876689 case ICmpInst::ICMP_NE: {
6688- if (Op0Max.ult (Op1Min) || Op0Min.ugt (Op1Max))
6689- return replaceInstUsesWith (
6690- I, ConstantInt::getBool (I.getType (), Pred == CmpInst::ICMP_NE));
6691-
66926690 // If all bits are known zero except for one, then we know at most one bit
66936691 // is set. If the comparison is against zero, then this is a check to see if
66946692 // *that* bit is set.
@@ -6728,67 +6726,19 @@ Instruction *InstCombinerImpl::foldICmpUsingKnownBits(ICmpInst &I) {
67286726 ConstantInt::getNullValue (Op1->getType ()));
67296727 break ;
67306728 }
6731- case ICmpInst::ICMP_ULT: {
6732- if (Op0Max.ult (Op1Min)) // A <u B -> true if max(A) < min(B)
6733- return replaceInstUsesWith (I, ConstantInt::getTrue (I.getType ()));
6734- if (Op0Min.uge (Op1Max)) // A <u B -> false if min(A) >= max(B)
6735- return replaceInstUsesWith (I, ConstantInt::getFalse (I.getType ()));
6736- break ;
6737- }
6738- case ICmpInst::ICMP_UGT: {
6739- if (Op0Min.ugt (Op1Max)) // A >u B -> true if min(A) > max(B)
6740- return replaceInstUsesWith (I, ConstantInt::getTrue (I.getType ()));
6741- if (Op0Max.ule (Op1Min)) // A >u B -> false if max(A) <= max(B)
6742- return replaceInstUsesWith (I, ConstantInt::getFalse (I.getType ()));
6743- break ;
6744- }
6745- case ICmpInst::ICMP_SLT: {
6746- if (Op0Max.slt (Op1Min)) // A <s B -> true if max(A) < min(C)
6747- return replaceInstUsesWith (I, ConstantInt::getTrue (I.getType ()));
6748- if (Op0Min.sge (Op1Max)) // A <s B -> false if min(A) >= max(C)
6749- return replaceInstUsesWith (I, ConstantInt::getFalse (I.getType ()));
6750- break ;
6751- }
6752- case ICmpInst::ICMP_SGT: {
6753- if (Op0Min.sgt (Op1Max)) // A >s B -> true if min(A) > max(B)
6754- return replaceInstUsesWith (I, ConstantInt::getTrue (I.getType ()));
6755- if (Op0Max.sle (Op1Min)) // A >s B -> false if max(A) <= min(B)
6756- return replaceInstUsesWith (I, ConstantInt::getFalse (I.getType ()));
6757- break ;
6758- }
67596729 case ICmpInst::ICMP_SGE:
6760- assert (!isa<ConstantInt>(Op1) && " ICMP_SGE with ConstantInt not folded!" );
6761- if (Op0Min.sge (Op1Max)) // A >=s B -> true if min(A) >= max(B)
6762- return replaceInstUsesWith (I, ConstantInt::getTrue (I.getType ()));
6763- if (Op0Max.slt (Op1Min)) // A >=s B -> false if max(A) < min(B)
6764- return replaceInstUsesWith (I, ConstantInt::getFalse (I.getType ()));
67656730 if (Op1Min == Op0Max) // A >=s B -> A == B if max(A) == min(B)
67666731 return new ICmpInst (ICmpInst::ICMP_EQ, Op0, Op1);
67676732 break ;
67686733 case ICmpInst::ICMP_SLE:
6769- assert (!isa<ConstantInt>(Op1) && " ICMP_SLE with ConstantInt not folded!" );
6770- if (Op0Max.sle (Op1Min)) // A <=s B -> true if max(A) <= min(B)
6771- return replaceInstUsesWith (I, ConstantInt::getTrue (I.getType ()));
6772- if (Op0Min.sgt (Op1Max)) // A <=s B -> false if min(A) > max(B)
6773- return replaceInstUsesWith (I, ConstantInt::getFalse (I.getType ()));
67746734 if (Op1Max == Op0Min) // A <=s B -> A == B if min(A) == max(B)
67756735 return new ICmpInst (ICmpInst::ICMP_EQ, Op0, Op1);
67766736 break ;
67776737 case ICmpInst::ICMP_UGE:
6778- assert (!isa<ConstantInt>(Op1) && " ICMP_UGE with ConstantInt not folded!" );
6779- if (Op0Min.uge (Op1Max)) // A >=u B -> true if min(A) >= max(B)
6780- return replaceInstUsesWith (I, ConstantInt::getTrue (I.getType ()));
6781- if (Op0Max.ult (Op1Min)) // A >=u B -> false if max(A) < min(B)
6782- return replaceInstUsesWith (I, ConstantInt::getFalse (I.getType ()));
67836738 if (Op1Min == Op0Max) // A >=u B -> A == B if max(A) == min(B)
67846739 return new ICmpInst (ICmpInst::ICMP_EQ, Op0, Op1);
67856740 break ;
67866741 case ICmpInst::ICMP_ULE:
6787- assert (!isa<ConstantInt>(Op1) && " ICMP_ULE with ConstantInt not folded!" );
6788- if (Op0Max.ule (Op1Min)) // A <=u B -> true if max(A) <= min(B)
6789- return replaceInstUsesWith (I, ConstantInt::getTrue (I.getType ()));
6790- if (Op0Min.ugt (Op1Max)) // A <=u B -> false if min(A) > max(B)
6791- return replaceInstUsesWith (I, ConstantInt::getFalse (I.getType ()));
67926742 if (Op1Max == Op0Min) // A <=u B -> A == B if min(A) == max(B)
67936743 return new ICmpInst (ICmpInst::ICMP_EQ, Op0, Op1);
67946744 break ;
0 commit comments