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,18 @@ ScalarTy getValue(unsigned Dim) const { return Dim == UnivariateDim ? Value : 0; } + + /// Add \p RHS to the value at the univariate dimension. + LeafTy getWithIncrement(ScalarTy RHS) { + return static_cast( + UnivariateLinearPolyBase(Value + RHS, UnivariateDim)); + } + + /// Subtract \p RHS from the value at the univariate dimension. + LeafTy getWithDecrement(ScalarTy RHS) { + return static_cast( + UnivariateLinearPolyBase(Value - RHS, UnivariateDim)); + } }; @@ -253,6 +265,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 +278,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 'getWithIncrement' method + EXPECT_EQ(Univariate3D(42, 0).getWithIncrement(1), Univariate3D(43, 0)); + EXPECT_EQ(Univariate3D(42, 1).getWithIncrement(2), Univariate3D(44, 1)); + EXPECT_EQ(Univariate3D(42, 2).getWithIncrement(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 'getWithDecrement' method + EXPECT_EQ(Univariate3D(43, 0).getWithDecrement(1), Univariate3D(42, 0)); + EXPECT_EQ(Univariate3D(44, 1).getWithDecrement(2), Univariate3D(42, 1)); + EXPECT_EQ(Univariate3D(45, 2).getWithDecrement(3), Univariate3D(42, 2)); } TEST(UnivariateLinearPolyBase, Univariate3D_Scale) {