diff options
author | Tobias Grosser <tobias@grosser.es> | 2018-04-12 06:15:17 +0000 |
---|---|---|
committer | Tobias Grosser <tobias@grosser.es> | 2018-04-12 06:15:17 +0000 |
commit | be483ae665ebd7a945334b9c7a6319c36e85806c (patch) | |
tree | 1c7252b2a518cd550acf7e76fdc126e086221505 /polly/include | |
parent | ff6c4f370205d66f0e001999a739024c9c6d5ff1 (diff) | |
download | bcm5719-llvm-be483ae665ebd7a945334b9c7a6319c36e85806c.tar.gz bcm5719-llvm-be483ae665ebd7a945334b9c7a6319c36e85806c.zip |
Add isl operator overloads for isl::pw_aff (Try II)
Piecewise affine expressions have directly corresponding mathematical
operators. Introduce these operators as overloads as this makes writing
code with isl::pw_aff expressions more directly readable.
We can now write:
A = B + C instead of A = B.add(C)
Reviewers: Meinersbur, bollu, sebpop
Reviewed By: Meinersbur
Subscribers: philip.pfaffe, pollydev, llvm-commits
Differential Revision: https://reviews.llvm.org/D45534
llvm-svn: 329880
Diffstat (limited to 'polly/include')
-rw-r--r-- | polly/include/polly/Support/ISLOperators.h | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/polly/include/polly/Support/ISLOperators.h b/polly/include/polly/Support/ISLOperators.h new file mode 100644 index 00000000000..640777d03b8 --- /dev/null +++ b/polly/include/polly/Support/ISLOperators.h @@ -0,0 +1,185 @@ +//===------ 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. +// +//===----------------------------------------------------------------------===// + +#ifndef POLLY_ISLOPERATORS_H +#define POLLY_ISLOPERATORS_H + +#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+(long 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, long 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*(long 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, long 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-(long 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, long IntRight) { + isl::ctx Ctx = Left.get_ctx(); + isl::val ValRight(Ctx, IntRight); + isl::pw_aff Right(Left.domain(), ValRight); + return Left.sub(Right); +} +/// @} + +/// Division +/// +/// This division rounds towards zero. This follows the semantics of C/C++. +/// +/// @{ +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/(long 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, long 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 +/// +/// This is the remainder of a division which rounds towards zero. This follows +/// the semantics of C/C++. +/// +/// @{ +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%(long 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, long 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 + +#endif // POLLY_ISLOPERATORS_H |