summaryrefslogtreecommitdiffstats
path: root/polly/include
diff options
context:
space:
mode:
authorTobias Grosser <tobias@grosser.es>2018-04-12 06:15:17 +0000
committerTobias Grosser <tobias@grosser.es>2018-04-12 06:15:17 +0000
commitbe483ae665ebd7a945334b9c7a6319c36e85806c (patch)
tree1c7252b2a518cd550acf7e76fdc126e086221505 /polly/include
parentff6c4f370205d66f0e001999a739024c9c6d5ff1 (diff)
downloadbcm5719-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.h185
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
OpenPOWER on IntegriCloud