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 <gareevro...@gmail.com> [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; +}