Index: llvm/include/llvm/Support/TypeSize.h =================================================================== --- llvm/include/llvm/Support/TypeSize.h +++ llvm/include/llvm/Support/TypeSize.h @@ -177,7 +177,7 @@ ScalarTy Value; // The value at the univeriate dimension. unsigned UnivariateDim; // The univeriate dimension. - UnivariateLinearPolyBase(ScalarTy &Val, unsigned UnivariateDim) + UnivariateLinearPolyBase(ScalarTy Val, unsigned UnivariateDim) : Value(Val), UnivariateDim(UnivariateDim) {} friend LeafTy &operator+=(LeafTy &LHS, const LeafTy &RHS) { @@ -235,6 +235,23 @@ ScalarTy getValue(unsigned Dim) const { return Dim == UnivariateDim ? Value : 0; } + + // Aliases for operator+ and operator- for completion, since we also + // support add/sub with a scalar type as well. + LeafTy add(const LeafTy &RHS) { return *this + RHS; } + LeafTy sub(const LeafTy &RHS) { return *this - RHS; } + + /// Add \p RHS to the value at the univariate dimension. + LeafTy add(ScalarTy RHS) { + return static_cast( + UnivariateLinearPolyBase(Value + RHS, UnivariateDim)); + } + + /// Subtract \p RHS from the value at the univariate dimension. + LeafTy sub(ScalarTy RHS) { + return static_cast( + UnivariateLinearPolyBase(Value - RHS, UnivariateDim)); + } }; @@ -253,6 +270,11 @@ /// fixed-sized or it is scalable-sized, but it cannot be both. template class LinearPolySize : public UnivariateLinearPolyBase { + // Make the parent class a friend, so that it can access the protected + // conversion/copy-constructor for UnivariatePolyBase -> + // LinearPolySize. + friend class UnivariateLinearPolyBase; + public: using ScalarTy = typename UnivariateLinearPolyBase::ScalarTy; enum Dims : unsigned { FixedDim = 0, ScalableDim = 1 }; @@ -261,7 +283,11 @@ LinearPolySize(ScalarTy MinVal, Dims D) : UnivariateLinearPolyBase(MinVal, D) {} + LinearPolySize(const UnivariateLinearPolyBase &V) + : UnivariateLinearPolyBase(V) {} + public: + static LeafTy getFixed(ScalarTy MinVal) { return static_cast(LinearPolySize(MinVal, FixedDim)); } Index: llvm/unittests/Support/LinearPolyBaseTest.cpp =================================================================== --- llvm/unittests/Support/LinearPolyBaseTest.cpp +++ llvm/unittests/Support/LinearPolyBaseTest.cpp @@ -135,6 +135,11 @@ Univariate3D X(42, 0); X += Univariate3D(42, 0); EXPECT_EQ(X, Univariate3D(84, 0)); + + // Test 'add' method + EXPECT_EQ(Univariate3D(42, 0).add(1), Univariate3D(43, 0)); + EXPECT_EQ(Univariate3D(42, 1).add(2), Univariate3D(44, 1)); + EXPECT_EQ(Univariate3D(42, 2).add(3), Univariate3D(45, 2)); } TEST(UnivariateLinearPolyBase, Univariate3D_Sub) { @@ -148,6 +153,11 @@ Univariate3D X(84, 0); X -= Univariate3D(42, 0); EXPECT_EQ(X, Univariate3D(42, 0)); + + // Test 'sub' method + EXPECT_EQ(Univariate3D(43, 0).sub(1), Univariate3D(42, 0)); + EXPECT_EQ(Univariate3D(44, 1).sub(2), Univariate3D(42, 1)); + EXPECT_EQ(Univariate3D(45, 2).sub(3), Univariate3D(42, 2)); } TEST(UnivariateLinearPolyBase, Univariate3D_Scale) {