isl_ast_expr_from_aff: avoid extracting modulos with very large coefficients
commitd1f04b14ba623e32fb592ea5412398df4985628d
authorSven Verdoolaege <skimo@kotnet.org>
Fri, 8 May 2015 06:50:14 +0000 (8 08:50 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Tue, 23 Jun 2015 08:42:04 +0000 (23 10:42 +0200)
tree9dce8106857d20957146ea15569a13573f7115ce
parentc9fb3b769f5344738ce4abdb14bb93514b9fbf62
isl_ast_expr_from_aff: avoid extracting modulos with very large coefficients

When looking for opportunities for writing an fdiv_q in terms of a modulo,
we check the explicitly available constraints first.  These constraints
may include bounds on integer variables to the maximal value of some
integer type.  We do not want to use such constraints since the corresponding
modulo expression will include this large constant value.
With any luck, there is still another bound hidden in the constraints
that does not have such a large constant term.

For example, on the new test case, we would produce code like this

        for (int c2 = 0; c2 < -((-n + 2147483648) % 32) + 32; c2 += 1)
          for (int c3 = 0; c3 <= 31; c3 += 1)
            S_1(((-n + 2147483648) % 32) + n + c2 - 32, c1 + c3);

because the upper bound on n is explicitly available in the constraints,
while the lower bound on n has been eliminated because it is implied
by other constraints.  By rejecting the upper bound, the AST generator
is forced to look for a lower bound on n and in the end produces

        for (int c2 = 0; c2 < n % 32; c2 += 1)
          for (int c3 = 0; c3 <= 31; c3 += 1)
            S_1(-((n - 1) % 32) + n + c2 - 1, c1 + c3);

Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
isl_ast_build_expr.c
test_inputs/codegen/isolate7.c [new file with mode: 0644]
test_inputs/codegen/isolate7.st [new file with mode: 0644]