On Sat, Jul 23, 2011 at 1:01 AM, Sebastian Pop <seb...@gmail.com> wrote: > The CLAST produced by CLooG-ISL contains an assignment and GCC chokes > on it. The exact CLAST contains an assignment followed by an if: > > scat_1 = max(0,ceild(T_4-7,8)); > if (scat_1 <= min(1,floord(T_4-1,8))) { > S7(scat_1); > } > > This is equivalent to a loop that iterates only once, and so CLooG > generates an assignment followed by an if instead of a loop. This is > an important optimization that was improved in ISL, that allows > if-conversion: imagine GCC having to figure out that a loop like the > following actually iterates only once, and can be converted to an if: > > for (scat_1 = max(0,ceild(T_4-7,8)); scat_1 <= min(1,floord(T_4-1,8)); > scat_1++) > S7(scat_1); > > This patch implements the translation of CLAST assignments. > Bootstrapped and tested on amd64-linux.
Ok if Tobias is fine with it. Thanks, Richard. > Sebastian > > 2011-07-22 Sebastian Pop <sebastian....@amd.com> > > PR middle-end/48648 > * graphite-clast-to-gimple.c (clast_get_body_of_loop): Handle > CLAST assignments. > (translate_clast): Same. > (translate_clast_assignment): New. > > * gcc.dg/graphite/id-pr48648.c: New. > --- > gcc/ChangeLog | 8 ++++ > gcc/graphite-clast-to-gimple.c | 49 > ++++++++++++++++++++++++++++ > gcc/testsuite/ChangeLog | 5 +++ > gcc/testsuite/gcc.dg/graphite/id-pr48648.c | 21 ++++++++++++ > 4 files changed, 83 insertions(+), 0 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/graphite/id-pr48648.c > > diff --git a/gcc/ChangeLog b/gcc/ChangeLog > index 9cfa21b..303c9c9 100644 > --- a/gcc/ChangeLog > +++ b/gcc/ChangeLog > @@ -1,3 +1,11 @@ > +2011-07-22 Sebastian Pop <sebastian....@amd.com> > + > + PR middle-end/48648 > + * graphite-clast-to-gimple.c (clast_get_body_of_loop): Handle > + CLAST assignments. > + (translate_clast): Same. > + (translate_clast_assignment): New. > + > 2011-07-21 Sebastian Pop <sebastian....@amd.com> > > PR middle-end/47654 > diff --git a/gcc/graphite-clast-to-gimple.c b/gcc/graphite-clast-to-gimple.c > index ddf6d3d..a4668d3 100644 > --- a/gcc/graphite-clast-to-gimple.c > +++ b/gcc/graphite-clast-to-gimple.c > @@ -812,6 +812,9 @@ clast_get_body_of_loop (struct clast_stmt *stmt) > if (CLAST_STMT_IS_A (stmt, stmt_block)) > return clast_get_body_of_loop (((struct clast_block *) stmt)->body); > > + if (CLAST_STMT_IS_A (stmt, stmt_ass)) > + return clast_get_body_of_loop (stmt->next); > + > gcc_unreachable (); > } > > @@ -1121,6 +1124,48 @@ translate_clast_for (loop_p context_loop, struct > clast_for *stmt, edge next_e, > return last_e; > } > > +/* Translates a clast assignment STMT to gimple. > + > + - NEXT_E is the edge where new generated code should be attached. > + - BB_PBB_MAPPING is is a basic_block and it's related poly_bb_p mapping. > */ > + > +static edge > +translate_clast_assignment (struct clast_assignment *stmt, edge next_e, > + int level, ivs_params_p ip) > +{ > + gimple_seq stmts; > + mpz_t v1, v2; > + tree type, new_name, var; > + edge res = single_succ_edge (split_edge (next_e)); > + struct clast_expr *expr = (struct clast_expr *) stmt->RHS; > + struct clast_user_stmt *body > + = clast_get_body_of_loop ((struct clast_stmt *) stmt); > + poly_bb_p pbb = (poly_bb_p) cloog_statement_usr (body->statement); > + > + mpz_init (v1); > + mpz_init (v2); > + type = type_for_clast_expr (expr, ip, v1, v2); > + var = create_tmp_var (type, "graphite_var"); > + new_name = force_gimple_operand (clast_to_gcc_expression (type, expr, ip), > + &stmts, true, var); > + add_referenced_var (var); > + if (stmts) > + { > + gsi_insert_seq_on_edge (next_e, stmts); > + gsi_commit_edge_inserts (); > + } > + > + compute_bounds_for_level (pbb, level, v1, v2); > + save_clast_name_index (ip->newivs_index, stmt->LHS, > + VEC_length (tree, *(ip->newivs)), level, v1, v2); > + VEC_safe_push (tree, heap, *(ip->newivs), new_name); > + > + mpz_clear (v1); > + mpz_clear (v2); > + > + return res; > +} > + > /* Translates a clast guard statement STMT to gimple. > > - NEXT_E is the edge where new generated code should be attached. > @@ -1171,6 +1216,10 @@ translate_clast (loop_p context_loop, struct > clast_stmt *stmt, edge next_e, > else if (CLAST_STMT_IS_A (stmt, stmt_block)) > next_e = translate_clast (context_loop, ((struct clast_block *) > stmt)->body, > next_e, bb_pbb_mapping, level, ip); > + > + else if (CLAST_STMT_IS_A (stmt, stmt_ass)) > + next_e = translate_clast_assignment ((struct clast_assignment *) stmt, > + next_e, level, ip); > else > gcc_unreachable(); > > diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog > index a63b647..bfdbcfb 100644 > --- a/gcc/testsuite/ChangeLog > +++ b/gcc/testsuite/ChangeLog > @@ -1,3 +1,8 @@ > +2011-07-22 Sebastian Pop <sebastian....@amd.com> > + > + PR middle-end/48648 > + * gcc.dg/graphite/id-pr48648.c: New. > + > 2011-07-21 Sebastian Pop <sebastian....@amd.com> > > PR middle-end/47654 > diff --git a/gcc/testsuite/gcc.dg/graphite/id-pr48648.c > b/gcc/testsuite/gcc.dg/graphite/id-pr48648.c > new file mode 100644 > index 0000000..ff58ec2 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/graphite/id-pr48648.c > @@ -0,0 +1,21 @@ > +/* { dg-options "-O -fgraphite-identity" } */ > + > +void *foo(const void *a); > + > +void bug48648() > +{ > + unsigned char a[2]; > + long b; > + int i; > + > + for(i = 0; i < 2; i++) { > + if (b <= 0) > + a[i] = 0; > + else if (b >= 8) > + a[i] = 0; > + else > + a[i] = 0; > + b -= 8; > + } > + foo(&a); > +} > -- > 1.7.4.1 > >