From 4a961e0a8921d62a0c6ddf8c34a7597bfc3c4ecd Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Mon, 21 Nov 2011 22:41:54 +0100 Subject: [PATCH] allow boolean expressions where an affine expression is expected For a boolean expression "cond", return the affine expression "cond ? 1 : 0". Signed-off-by: Sven Verdoolaege --- scan.cc | 27 +++++++++++++++++++++++++++ scan.h | 1 + tests/piecewise2.c | 10 ++++++++++ tests/piecewise2.scop | 23 +++++++++++++++++++++++ 4 files changed, 61 insertions(+) create mode 100644 tests/piecewise2.c create mode 100644 tests/piecewise2.scop diff --git a/scan.cc b/scan.cc index 9838868..b797c80 100644 --- a/scan.cc +++ b/scan.cc @@ -459,6 +459,21 @@ static __isl_give isl_pw_aff *wrap(__isl_take isl_pw_aff *pwaff, return pwaff; } +/* Extract an affine expression from a boolean expression. + * In particular, return the expression "expr ? 1 : 0". + */ +__isl_give isl_pw_aff *PetScan::extract_implicit_affine(Expr *expr) +{ + isl_set *cond = extract_condition(expr); + isl_space *space = isl_set_get_space(cond); + isl_local_space *ls = isl_local_space_from_space(space); + isl_aff *zero = isl_aff_zero_on_domain(isl_local_space_copy(ls)); + isl_aff *one = isl_aff_zero_on_domain(ls); + one = isl_aff_add_constant_si(one, 1); + return isl_pw_aff_cond(cond, isl_pw_aff_from_aff(one), + isl_pw_aff_from_aff(zero)); +} + /* Extract an affine expression from some binary operations. * If the result of the expression is unsigned, then we wrap it * based on the size of the type. @@ -481,6 +496,16 @@ __isl_give isl_pw_aff *PetScan::extract_affine(BinaryOperator *expr) case BO_Mul: res = extract_affine_mul(expr); break; + case BO_LT: + case BO_LE: + case BO_GT: + case BO_GE: + case BO_EQ: + case BO_NE: + case BO_LAnd: + case BO_LOr: + res = extract_implicit_affine(expr); + break; default: unsupported(expr); return NULL; @@ -498,6 +523,8 @@ __isl_give isl_pw_aff *PetScan::extract_affine(UnaryOperator *expr) { if (expr->getOpcode() == UO_Minus) return isl_pw_aff_neg(extract_affine(expr->getSubExpr())); + if (expr->getOpcode() == UO_LNot) + return extract_implicit_affine(expr); unsupported(expr); return NULL; diff --git a/scan.h b/scan.h index 7a3efd3..a6610a8 100644 --- a/scan.h +++ b/scan.h @@ -159,6 +159,7 @@ private: __isl_give isl_pw_aff *extract_affine(clang::ArraySubscriptExpr *expr); __isl_give isl_pw_aff *extract_affine(clang::ConditionalOperator *expr); + __isl_give isl_pw_aff *extract_implicit_affine(clang::Expr *expr); __isl_give isl_set *extract_implicit_condition(clang::Expr *expr); __isl_give isl_set *extract_condition(clang::UnaryOperator *expr); diff --git a/tests/piecewise2.c b/tests/piecewise2.c new file mode 100644 index 0000000..7ff7b40 --- /dev/null +++ b/tests/piecewise2.c @@ -0,0 +1,10 @@ +void bar(int N, int a[N][N], int b[5][5]) +{ + int i, j; + +#pragma scop + for (i = 0; i < N; ++i) + for (j = i; j < N; ++j) + a[i][j] = a[i - (i > 0)][0]; +#pragma endscop +} diff --git a/tests/piecewise2.scop b/tests/piecewise2.scop new file mode 100644 index 0000000..bffe60a --- /dev/null +++ b/tests/piecewise2.scop @@ -0,0 +1,23 @@ +context: '[N] -> { : N >= 0 }' +arrays: +- context: '[N] -> { : N >= 0 }' + extent: '[N] -> { a[i0, i1] : i0 >= 0 and i1 >= 0 and i1 <= -1 + N }' + element_type: int +statements: +- line: 8 + domain: '[N] -> { S_0[i, j] : i >= 0 and i <= -1 + N and j >= i and j <= -1 + N + }' + schedule: '[N] -> { S_0[i, j] -> [0, i, j] }' + body: + type: binary + operation: = + arguments: + - type: access + relation: '[N] -> { S_0[i, j] -> a[i, j] }' + read: 0 + write: 1 + - type: access + relation: '[N] -> { S_0[i, j] -> a[i, 0] : i <= 0; S_0[i, j] -> a[-1 + i, 0] + : i >= 1 }' + read: 1 + write: 0 -- 2.11.4.GIT