diff --git a/llvm/include/llvm/Support/TypeSize.h b/llvm/include/llvm/Support/TypeSize.h --- a/llvm/include/llvm/Support/TypeSize.h +++ b/llvm/include/llvm/Support/TypeSize.h @@ -169,7 +169,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) { assert(UnivariateDim < Dimensions && "Dimension out of range"); } @@ -229,6 +229,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)); + } }; @@ -247,6 +259,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 }; @@ -255,7 +272,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)); } diff --git a/llvm/unittests/Support/LinearPolyBaseTest.cpp b/llvm/unittests/Support/LinearPolyBaseTest.cpp --- a/llvm/unittests/Support/LinearPolyBaseTest.cpp +++ b/llvm/unittests/Support/LinearPolyBaseTest.cpp @@ -140,6 +140,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) { @@ -153,6 +158,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) {