Index: include/polly/Support/ISLOperators.h =================================================================== --- /dev/null +++ include/polly/Support/ISLOperators.h @@ -0,0 +1,168 @@ +//===------ IslOperators.h --------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Operator overloads for isl C++ objects. +// +//===----------------------------------------------------------------------===// + +#include "isl/isl-noexceptions.h" + +namespace polly { + +// Addition + +inline isl::pw_aff operator+(isl::pw_aff Left, isl::pw_aff Right) { + return Left.add(Right); +} + +inline isl::pw_aff operator+(isl::val ValLeft, isl::pw_aff Right) { + isl::pw_aff Left(Right.domain(), ValLeft); + return Left.add(Right); +} + +inline isl::pw_aff operator+(isl::pw_aff Left, isl::val ValRight) { + isl::pw_aff Right(Left.domain(), ValRight); + return Left.add(Right); +} + +inline isl::pw_aff operator+(int IntLeft, isl::pw_aff Right) { + isl::ctx Ctx = Right.get_ctx(); + isl::val ValLeft(Ctx, IntLeft); + isl::pw_aff Left(Right.domain(), ValLeft); + return Left.add(Right); +} + +inline isl::pw_aff operator+(isl::pw_aff Left, int IntRight) { + isl::ctx Ctx = Left.get_ctx(); + isl::val ValRight(Ctx, IntRight); + isl::pw_aff Right(Left.domain(), ValRight); + return Left.add(Right); +} + +// Multiplication + +inline isl::pw_aff operator*(isl::pw_aff Left, isl::pw_aff Right) { + return Left.mul(Right); +} + +inline isl::pw_aff operator*(isl::val ValLeft, isl::pw_aff Right) { + isl::pw_aff Left(Right.domain(), ValLeft); + return Left.mul(Right); +} + +inline isl::pw_aff operator*(isl::pw_aff Left, isl::val ValRight) { + isl::pw_aff Right(Left.domain(), ValRight); + return Left.mul(Right); +} + +inline isl::pw_aff operator*(int IntLeft, isl::pw_aff Right) { + isl::ctx Ctx = Right.get_ctx(); + isl::val ValLeft(Ctx, IntLeft); + isl::pw_aff Left(Right.domain(), ValLeft); + return Left.mul(Right); +} + +inline isl::pw_aff operator*(isl::pw_aff Left, int IntRight) { + isl::ctx Ctx = Left.get_ctx(); + isl::val ValRight(Ctx, IntRight); + isl::pw_aff Right(Left.domain(), ValRight); + return Left.mul(Right); +} + +// Subtraction + +inline isl::pw_aff operator-(isl::pw_aff Left, isl::pw_aff Right) { + return Left.sub(Right); +} + +inline isl::pw_aff operator-(isl::val ValLeft, isl::pw_aff Right) { + isl::pw_aff Left(Right.domain(), ValLeft); + return Left.sub(Right); +} + +inline isl::pw_aff operator-(isl::pw_aff Left, isl::val ValRight) { + isl::pw_aff Right(Left.domain(), ValRight); + return Left.sub(Right); +} + +inline isl::pw_aff operator-(int IntLeft, isl::pw_aff Right) { + isl::ctx Ctx = Right.get_ctx(); + isl::val ValLeft(Ctx, IntLeft); + isl::pw_aff Left(Right.domain(), ValLeft); + return Left.sub(Right); +} + +inline isl::pw_aff operator-(isl::pw_aff Left, int IntRight) { + isl::ctx Ctx = Left.get_ctx(); + isl::val ValRight(Ctx, IntRight); + isl::pw_aff Right(Left.domain(), ValRight); + return Left.sub(Right); +} + +// Division + +inline isl::pw_aff operator/(isl::pw_aff Left, isl::pw_aff Right) { + return Left.tdiv_q(Right); +} + +inline isl::pw_aff operator/(isl::val ValLeft, isl::pw_aff Right) { + isl::pw_aff Left(Right.domain(), ValLeft); + return Left.tdiv_q(Right); +} + +inline isl::pw_aff operator/(isl::pw_aff Left, isl::val ValRight) { + isl::pw_aff Right(Left.domain(), ValRight); + return Left.tdiv_q(Right); +} + +inline isl::pw_aff operator/(int IntLeft, isl::pw_aff Right) { + isl::ctx Ctx = Right.get_ctx(); + isl::val ValLeft(Ctx, IntLeft); + isl::pw_aff Left(Right.domain(), ValLeft); + return Left.tdiv_q(Right); +} + +inline isl::pw_aff operator/(isl::pw_aff Left, int IntRight) { + isl::ctx Ctx = Left.get_ctx(); + isl::val ValRight(Ctx, IntRight); + isl::pw_aff Right(Left.domain(), ValRight); + return Left.tdiv_q(Right); +} + +// Remainder + +inline isl::pw_aff operator%(isl::pw_aff Left, isl::pw_aff Right) { + return Left.tdiv_r(Right); +} + +inline isl::pw_aff operator%(isl::val ValLeft, isl::pw_aff Right) { + isl::pw_aff Left(Right.domain(), ValLeft); + return Left.tdiv_r(Right); +} + +inline isl::pw_aff operator%(isl::pw_aff Left, isl::val ValRight) { + isl::pw_aff Right(Left.domain(), ValRight); + return Left.tdiv_r(Right); +} + +inline isl::pw_aff operator%(int IntLeft, isl::pw_aff Right) { + isl::ctx Ctx = Right.get_ctx(); + isl::val ValLeft(Ctx, IntLeft); + isl::pw_aff Left(Right.domain(), ValLeft); + return Left.tdiv_r(Right); +} + +inline isl::pw_aff operator%(isl::pw_aff Left, int IntRight) { + isl::ctx Ctx = Left.get_ctx(); + isl::val ValRight(Ctx, IntRight); + isl::pw_aff Right(Left.domain(), ValRight); + return Left.tdiv_r(Right); +} + +} // namespace polly Index: lib/Support/SCEVAffinator.cpp =================================================================== --- lib/Support/SCEVAffinator.cpp +++ lib/Support/SCEVAffinator.cpp @@ -15,6 +15,7 @@ #include "polly/Options.h" #include "polly/ScopInfo.h" #include "polly/Support/GICHelper.h" +#include "polly/Support/ISLOperators.h" #include "polly/Support/SCEVValidator.h" #include "polly/Support/ScopHelper.h" #include "isl/aff.h" Index: unittests/Isl/IslTest.cpp =================================================================== --- unittests/Isl/IslTest.cpp +++ unittests/Isl/IslTest.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "polly/Support/GICHelper.h" +#include "polly/Support/ISLOperators.h" #include "polly/Support/ISLTools.h" #include "gtest/gtest.h" #include "isl/stream.h" @@ -75,6 +76,9 @@ return bool(LHS.eq(RHS)); } +static bool operator==(const isl::pw_aff &LHS, const isl::pw_aff &RHS) { + return bool(LHS.is_equal(RHS)); +} } // namespace noexceptions } // namespace isl @@ -282,6 +286,70 @@ isl_ctx_free(IslCtx); } +TEST(Isl, Operators) { + isl_ctx *IslCtx = isl_ctx_alloc(); + + isl::val ValOne = isl::val(IslCtx, 1); + isl::val ValTwo = isl::val(IslCtx, 2); + isl::val ValThree = isl::val(IslCtx, 3); + isl::val ValFour = isl::val(IslCtx, 4); + + isl::space Space = isl::space(IslCtx, 0, 0); + isl::local_space LS = isl::local_space(Space); + + isl::pw_aff AffOne = isl::aff(LS, ValOne); + isl::pw_aff AffTwo = isl::aff(LS, ValTwo); + isl::pw_aff AffThree = isl::aff(LS, ValThree); + isl::pw_aff AffFour = isl::aff(LS, ValFour); + + // Addition + { + EXPECT_EQ(AffOne + AffOne, AffTwo); + EXPECT_EQ(AffOne + 1, AffTwo); + EXPECT_EQ(1 + AffOne, AffTwo); + EXPECT_EQ(AffOne + ValOne, AffTwo); + EXPECT_EQ(ValOne + AffOne, AffTwo); + } + + // Multiplication + { + EXPECT_EQ(AffTwo * AffTwo, AffFour); + EXPECT_EQ(AffTwo * 2, AffFour); + EXPECT_EQ(2 * AffTwo, AffFour); + EXPECT_EQ(AffTwo * ValTwo, AffFour); + EXPECT_EQ(ValTwo * AffTwo, AffFour); + } + + // Subtraction + { + EXPECT_EQ(AffTwo - AffOne, AffOne); + EXPECT_EQ(AffTwo - 1, AffOne); + EXPECT_EQ(2 - AffOne, AffOne); + EXPECT_EQ(AffTwo - ValOne, AffOne); + EXPECT_EQ(ValTwo - AffOne, AffOne); + } + + // Division + { + EXPECT_EQ(AffFour - AffTwo, AffTwo); + EXPECT_EQ(AffFour - 2, AffTwo); + EXPECT_EQ(4 - AffTwo, AffTwo); + EXPECT_EQ(AffFour / ValTwo, AffTwo); + EXPECT_EQ(AffFour / 2, AffTwo); + } + + // Remainder + { + EXPECT_EQ(AffThree % AffTwo, AffOne); + EXPECT_EQ(AffThree % 2, AffOne); + EXPECT_EQ(3 % AffTwo, AffOne); + EXPECT_EQ(AffThree % ValTwo, AffOne); + EXPECT_EQ(ValThree % AffTwo, AffOne); + } + + isl_ctx_free(IslCtx); +} + TEST(Isl, Foreach) { std::unique_ptr Ctx(isl_ctx_alloc(), &isl_ctx_free);