I've attached the patch, which adds handling of isl_ast_op_pdiv_q and
isl_ast_op_pdiv_r. It also contains a corresponding test case, which
generates the following ISL AST:
{
for (int c1 = 0; c1 < -((-k.0 + i + 4294967296) % 4294967296) +
4294967296; c1 += 1)
S_4(c1);
S_6();
}
Is it fine for trunk?
--
Cheers, Roman Gareev.
2014-07-23 Roman Gareev <[email protected]>
[gcc/]
* graphite-isl-ast-to-gimple.c:
(binary_op_to_tree): Add new cases.
(gcc_expression_from_isl_expr_op): Move isl_ast_op_pdiv_q,
isl_ast_op_pdiv_r to different cases.
[gcc/testsuite]
* gcc.dg/graphite/isl-ast-gen-blocks-3.c: New testcase.
Index: gcc/graphite-isl-ast-to-gimple.c
===================================================================
--- gcc/graphite-isl-ast-to-gimple.c (revision 212922)
+++ gcc/graphite-isl-ast-to-gimple.c (working copy)
@@ -186,6 +186,12 @@
case isl_ast_op_div:
return fold_build2 (EXACT_DIV_EXPR, type, tree_lhs_expr, tree_rhs_expr);
+ case isl_ast_op_pdiv_q:
+ return fold_build2 (TRUNC_DIV_EXPR, type, tree_lhs_expr, tree_rhs_expr);
+
+ case isl_ast_op_pdiv_r:
+ return fold_build2 (TRUNC_MOD_EXPR, type, tree_lhs_expr, tree_rhs_expr);
+
case isl_ast_op_fdiv_q:
return fold_build2 (FLOOR_DIV_EXPR, type, tree_lhs_expr, tree_rhs_expr);
@@ -299,8 +305,6 @@
case isl_ast_op_call:
case isl_ast_op_and_then:
case isl_ast_op_or_else:
- case isl_ast_op_pdiv_q:
- case isl_ast_op_pdiv_r:
case isl_ast_op_select:
gcc_unreachable ();
@@ -312,6 +316,8 @@
case isl_ast_op_sub:
case isl_ast_op_mul:
case isl_ast_op_div:
+ case isl_ast_op_pdiv_q:
+ case isl_ast_op_pdiv_r:
case isl_ast_op_fdiv_q:
case isl_ast_op_and:
case isl_ast_op_or:
Index: gcc/testsuite/gcc.dg/graphite/isl-ast-gen-blocks-3.c
===================================================================
--- gcc/testsuite/gcc.dg/graphite/isl-ast-gen-blocks-3.c (revision 0)
+++ gcc/testsuite/gcc.dg/graphite/isl-ast-gen-blocks-3.c (working copy)
@@ -0,0 +1,27 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -fgraphite-identity -fgraphite-code-generator=isl" } */
+
+int k = 50;
+static int __attribute__((noinline))
+foo ()
+{
+ int i, res;
+ for (i = k/2, res = 0; i < k; i++)
+ res += i;
+
+ return res;
+}
+
+extern void abort ();
+
+int
+main (void)
+{
+ int res = foo ();
+
+
+ if (res != 925)
+ abort ();
+
+ return 0;
+}