Index: llvm/include/llvm/ADT/APSInt.h =================================================================== --- llvm/include/llvm/ADT/APSInt.h +++ llvm/include/llvm/ADT/APSInt.h @@ -145,24 +145,19 @@ } inline bool operator<(const APSInt& RHS) const { - assert(IsUnsigned == RHS.IsUnsigned && "Signedness mismatch!"); - return IsUnsigned ? ult(RHS) : slt(RHS); + return compareValues(*this, RHS) < 0; } inline bool operator>(const APSInt& RHS) const { - assert(IsUnsigned == RHS.IsUnsigned && "Signedness mismatch!"); - return IsUnsigned ? ugt(RHS) : sgt(RHS); + return compareValues(*this, RHS) > 0; } inline bool operator<=(const APSInt& RHS) const { - assert(IsUnsigned == RHS.IsUnsigned && "Signedness mismatch!"); - return IsUnsigned ? ule(RHS) : sle(RHS); + return compareValues(*this, RHS) <= 0; } inline bool operator>=(const APSInt& RHS) const { - assert(IsUnsigned == RHS.IsUnsigned && "Signedness mismatch!"); - return IsUnsigned ? uge(RHS) : sge(RHS); + return compareValues(*this, RHS) >= 0; } inline bool operator==(const APSInt& RHS) const { - assert(IsUnsigned == RHS.IsUnsigned && "Signedness mismatch!"); - return eq(RHS); + return compareValues(*this, RHS) == 0; } inline bool operator!=(const APSInt& RHS) const { return !((*this) == RHS); @@ -358,8 +353,7 @@ } static bool isEqual(const APSInt &LHS, const APSInt &RHS) { - return LHS.getBitWidth() == RHS.getBitWidth() && - LHS.isUnsigned() == RHS.isUnsigned() && LHS == RHS; + return LHS.getBitWidth() == RHS.getBitWidth() && LHS == RHS; } }; Index: llvm/unittests/ADT/APSIntTest.cpp =================================================================== --- llvm/unittests/ADT/APSIntTest.cpp +++ llvm/unittests/ADT/APSIntTest.cpp @@ -142,6 +142,71 @@ EXPECT_TRUE(APSInt::compareValues(U(8), S(-7).trunc(32)) > 0); } +TEST(APSIntTest, comparisonOperators) { + auto U = [](uint64_t V) { return APSInt::getUnsigned(V); }; + auto S = [](int64_t V) { return APSInt::get(V); }; + + // Bit-width matches and is-signed. + EXPECT_TRUE(S(7) < S(8)); + EXPECT_TRUE(S(8) > S(7)); + EXPECT_TRUE(S(7) == S(7)); + EXPECT_TRUE(S(-7) < S(8)); + EXPECT_TRUE(S(8) > S(-7)); + EXPECT_TRUE(S(-7) == S(-7)); + EXPECT_TRUE(S(-7) > S(-8)); + EXPECT_TRUE(S(-8) < S(-7)); + EXPECT_TRUE(S(-7) == S(-7)); + + // Bit-width matches and not is-signed. + EXPECT_TRUE(U(7) < U(8)); + EXPECT_TRUE(U(8) > U(7)); + EXPECT_TRUE(U(7) == U(7)); + + // Bit-width matches and mixed signs. + EXPECT_TRUE(U(7) < S(8)); + EXPECT_TRUE(U(8) > S(7)); + EXPECT_TRUE(U(7) == S(7)); + EXPECT_TRUE(U(8) > S(-7)); + + // Bit-width mismatch and is-signed. + EXPECT_TRUE(S(7).trunc(32) < S(8)); + EXPECT_TRUE(S(8).trunc(32) > S(7)); + EXPECT_TRUE(S(7).trunc(32) == S(7)); + EXPECT_TRUE(S(-7).trunc(32) < S(8)); + EXPECT_TRUE(S(8).trunc(32) > S(-7)); + EXPECT_TRUE(S(-7).trunc(32) == S(-7)); + EXPECT_TRUE(S(-7).trunc(32) > S(-8)); + EXPECT_TRUE(S(-8).trunc(32) < S(-7)); + EXPECT_TRUE(S(-7).trunc(32) == S(-7)); + EXPECT_TRUE(S(7) < S(8).trunc(32)); + EXPECT_TRUE(S(8) > S(7).trunc(32)); + EXPECT_TRUE(S(7) == S(7).trunc(32)); + EXPECT_TRUE(S(-7) < S(8).trunc(32)); + EXPECT_TRUE(S(8) > S(-7).trunc(32)); + EXPECT_TRUE(S(-7) == S(-7).trunc(32)); + EXPECT_TRUE(S(-7) > S(-8).trunc(32)); + EXPECT_TRUE(S(-8) < S(-7).trunc(32)); + EXPECT_TRUE(S(-7) == S(-7).trunc(32)); + + // Bit-width mismatch and not is-signed. + EXPECT_TRUE(U(7) < U(8).trunc(32)); + EXPECT_TRUE(U(8) > U(7).trunc(32)); + EXPECT_TRUE(U(7) == U(7).trunc(32)); + EXPECT_TRUE(U(7).trunc(32) < U(8)); + EXPECT_TRUE(U(8).trunc(32) > U(7)); + EXPECT_TRUE(U(7).trunc(32) == U(7)); + + // Bit-width mismatch and mixed signs. + EXPECT_TRUE(U(7).trunc(32) < S(8)); + EXPECT_TRUE(U(8).trunc(32) > S(7)); + EXPECT_TRUE(U(7).trunc(32) == S(7)); + EXPECT_TRUE(U(8).trunc(32) > S(-7)); + EXPECT_TRUE(U(7) < S(8).trunc(32)); + EXPECT_TRUE(U(8) > S(7).trunc(32)); + EXPECT_TRUE(U(7) == S(7).trunc(32)); + EXPECT_TRUE(U(8) > S(-7).trunc(32)); +} + TEST(APSIntTest, FromString) { EXPECT_EQ(APSInt("1").getExtValue(), 1); EXPECT_EQ(APSInt("-1").getExtValue(), -1);