@@ -313,7 +313,8 @@ class ConstraintInfo {
313313 // / New variables that need to be added to the system are collected in
314314 // / \p NewVariables.
315315 ConstraintTy getConstraint (CmpInst::Predicate Pred, Value *Op0, Value *Op1,
316- SmallVectorImpl<Value *> &NewVariables) const ;
316+ SmallVectorImpl<Value *> &NewVariables,
317+ bool ForceSignedSystem = false ) const ;
317318
318319 // / Turns a comparison of the form \p Op0 \p Pred \p Op1 into a vector of
319320 // / constraints using getConstraint. Returns an empty constraint if the result
@@ -330,6 +331,14 @@ class ConstraintInfo {
330331 void transferToOtherSystem (CmpInst::Predicate Pred, Value *A, Value *B,
331332 unsigned NumIn, unsigned NumOut,
332333 SmallVectorImpl<StackEntry> &DFSInStack);
334+
335+ private:
336+ // / Adds facts into constraint system. \p ForceSignedSystem can be set when
337+ // / the \p Pred is eq/ne, and signed constraint system is used when it's
338+ // / specified.
339+ void addFactImpl (CmpInst::Predicate Pred, Value *A, Value *B, unsigned NumIn,
340+ unsigned NumOut, SmallVectorImpl<StackEntry> &DFSInStack,
341+ bool ForceSignedSystem);
333342};
334343
335344// / Represents a (Coefficient * Variable) entry after IR decomposition.
@@ -636,8 +645,13 @@ static Decomposition decompose(Value *V,
636645
637646ConstraintTy
638647ConstraintInfo::getConstraint (CmpInst::Predicate Pred, Value *Op0, Value *Op1,
639- SmallVectorImpl<Value *> &NewVariables) const {
648+ SmallVectorImpl<Value *> &NewVariables,
649+ bool ForceSignedSystem) const {
640650 assert (NewVariables.empty () && " NewVariables must be empty when passed in" );
651+ assert ((!ForceSignedSystem || Pred == CmpInst::ICMP_EQ ||
652+ Pred == CmpInst::ICMP_NE) &&
653+ " signed system can only be forced on eq/ne" );
654+
641655 bool IsEq = false ;
642656 bool IsNe = false ;
643657
@@ -652,15 +666,15 @@ ConstraintInfo::getConstraint(CmpInst::Predicate Pred, Value *Op0, Value *Op1,
652666 break ;
653667 }
654668 case CmpInst::ICMP_EQ:
655- if (match (Op1, m_Zero ())) {
669+ if (!ForceSignedSystem && match (Op1, m_Zero ())) {
656670 Pred = CmpInst::ICMP_ULE;
657671 } else {
658672 IsEq = true ;
659673 Pred = CmpInst::ICMP_ULE;
660674 }
661675 break ;
662676 case CmpInst::ICMP_NE:
663- if (match (Op1, m_Zero ())) {
677+ if (!ForceSignedSystem && match (Op1, m_Zero ())) {
664678 Pred = CmpInst::getSwappedPredicate (CmpInst::ICMP_UGT);
665679 std::swap (Op0, Op1);
666680 } else {
@@ -677,7 +691,7 @@ ConstraintInfo::getConstraint(CmpInst::Predicate Pred, Value *Op0, Value *Op1,
677691 return {};
678692
679693 SmallVector<ConditionTy, 4 > Preconditions;
680- bool IsSigned = CmpInst::isSigned (Pred);
694+ bool IsSigned = ForceSignedSystem || CmpInst::isSigned (Pred);
681695 auto &Value2Index = getValue2Index (IsSigned);
682696 auto ADec = decompose (Op0->stripPointerCastsSameRepresentation (),
683697 Preconditions, IsSigned, DL);
@@ -737,7 +751,7 @@ ConstraintInfo::getConstraint(CmpInst::Predicate Pred, Value *Op0, Value *Op1,
737751 int64_t OffsetSum;
738752 if (AddOverflow (Offset1, Offset2, OffsetSum))
739753 return {};
740- if (Pred == (IsSigned ? CmpInst::ICMP_SLT : CmpInst::ICMP_ULT) )
754+ if (Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_ULT)
741755 if (AddOverflow (OffsetSum, int64_t (-1 ), OffsetSum))
742756 return {};
743757 R[0 ] = OffsetSum;
@@ -1580,10 +1594,20 @@ static bool checkOrAndOpImpliedByOther(
15801594void ConstraintInfo::addFact (CmpInst::Predicate Pred, Value *A, Value *B,
15811595 unsigned NumIn, unsigned NumOut,
15821596 SmallVectorImpl<StackEntry> &DFSInStack) {
1597+ addFactImpl (Pred, A, B, NumIn, NumOut, DFSInStack, false );
1598+ // If the Pred is eq/ne, also add the fact to signed system.
1599+ if (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE)
1600+ addFactImpl (Pred, A, B, NumIn, NumOut, DFSInStack, true );
1601+ }
1602+
1603+ void ConstraintInfo::addFactImpl (CmpInst::Predicate Pred, Value *A, Value *B,
1604+ unsigned NumIn, unsigned NumOut,
1605+ SmallVectorImpl<StackEntry> &DFSInStack,
1606+ bool ForceSignedSystem) {
15831607 // If the constraint has a pre-condition, skip the constraint if it does not
15841608 // hold.
15851609 SmallVector<Value *> NewVariables;
1586- auto R = getConstraint (Pred, A, B, NewVariables);
1610+ auto R = getConstraint (Pred, A, B, NewVariables, ForceSignedSystem );
15871611
15881612 // TODO: Support non-equality for facts as well.
15891613 if (!R.isValid (*this ) || R.isNe ())
0 commit comments