From: Aditya Kumar Date: Wed, 2 Dec 2015 23:06:29 +0000 (+0000) Subject: handle missing isl_ast_expr X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=49ed2fa42911fe38392f2667fee04df0bd1191f9;p=gcc.git handle missing isl_ast_expr From ISL's documentation, isl_ast_op_zdiv_r is equal to zero iff the remainder on integer division is zero. Code generate a modulo operation for that. * graphite-isl-ast-to-gimple.c (binary_op_to_tree): Handle isl_ast_op_zdiv_r. (gcc_expression_from_isl_expr_op): Same. * gcc.dg/graphite/id-28.c: New. Co-Authored-By: Sebastian Pop From-SVN: r231212 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d6ba2e83f78..f15b2d28fec 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-12-02 Aditya Kumar + Sebastian Pop + + * graphite-isl-ast-to-gimple.c (binary_op_to_tree): Handle isl_ast_op_zdiv_r. + (gcc_expression_from_isl_expr_op): Same. + 2015-12-02 Aditya Kumar Sebastian Pop diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c index 497b200f55a..06a206209d9 100644 --- a/gcc/graphite-isl-ast-to-gimple.c +++ b/gcc/graphite-isl-ast-to-gimple.c @@ -588,6 +588,7 @@ binary_op_to_tree (tree type, __isl_take isl_ast_expr *expr, ivs_params &ip) } return fold_build2 (TRUNC_DIV_EXPR, type, tree_lhs_expr, tree_rhs_expr); + case isl_ast_op_zdiv_r: case isl_ast_op_pdiv_r: /* As ISL operates on arbitrary precision numbers, we may end up with division by 2^64 that is folded to 0. */ @@ -758,6 +759,7 @@ gcc_expression_from_isl_expr_op (tree type, __isl_take isl_ast_expr *expr, case isl_ast_op_pdiv_q: case isl_ast_op_pdiv_r: case isl_ast_op_fdiv_q: + case isl_ast_op_zdiv_r: case isl_ast_op_and: case isl_ast_op_or: case isl_ast_op_eq: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 328f1ec27e0..60e45fe2303 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-12-02 Aditya Kumar + Sebastian Pop + + * gcc.dg/graphite/id-28.c: New. + 2015-12-02 Aditya Kumar Sebastian Pop diff --git a/gcc/testsuite/gcc.dg/graphite/id-28.c b/gcc/testsuite/gcc.dg/graphite/id-28.c new file mode 100644 index 00000000000..941a1e4f543 --- /dev/null +++ b/gcc/testsuite/gcc.dg/graphite/id-28.c @@ -0,0 +1,72 @@ +/* { dg-options "-fcilkplus -floop-nest-optimize -O3" } */ + +#if HAVE_IO +#include +#endif +#include +#define NUMBER 5 + +int func1 (int *a1, int *a2) +{ + return __sec_reduce_add (a1[0:NUMBER] * a2[0:NUMBER:1]); +} + +int func2 (int *a1, int *a2) +{ + return (__sec_reduce_add (a1[0:NUMBER] * a2[0:NUMBER]) + + __sec_reduce_mul (a1[0:NUMBER] + a2[0:NUMBER])); +} + +int func3 (int *a1, int *a2) +{ + return (int) sqrt ((double)(__sec_reduce_add (a1[0:NUMBER] * a2[0:NUMBER]) + + a2[0] + a2[1] + a2[3])); +} + +int func4 (int *a1, int *a2) +{ + return a1[NUMBER-1] * (__sec_reduce_add (a1[0:NUMBER] * a2[0:NUMBER]) + a2[0] + a2[1] + a2[3])/a1[NUMBER-2]; +} +int main(void) +{ + int array[NUMBER], array2[NUMBER]; + int return_value = 0; + int ii = 0; + int argc = 1; + __asm volatile ("" : "+r" (argc)); + for (ii = 0; ii < NUMBER; ii++) + { + array[ii] = argc; /* This should calculate to 1. */ + array2[ii] = argc * argc + argc; /* This should calculate to 2. */ + } + + return_value = func1 (array, array2); +#if HAVE_IO + printf("Return_value = %d\n", return_value); +#endif + if (return_value != (2+2+2+2+2)) + return 1; + + return_value = func2 (array2, array); +#if HAVE_IO + printf("Return_value = %d\n", return_value); +#endif + if (return_value != (3*3*3*3*3) + (2+2+2+2+2)) + return 2; + + return_value = func3 (array, array2); +#if HAVE_IO + printf("Return_value = %d\n", return_value); +#endif + if (return_value != 4) + return 3; + + return_value = func4 (array, array2); +#if HAVE_IO + printf("Return_value = %d\n", return_value); +#endif + if (return_value != 16) + return 4; + + return 0; +}