diff options
| -rw-r--r-- | gcc/ChangeLog | 8 | ||||
| -rw-r--r-- | gcc/graphite-clast-to-gimple.c | 45 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/gcc.dg/graphite/id-pr48648.c | 21 |
4 files changed, 79 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cc9ea35..b07bed5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 2011-07-28 Sebastian Pop <sebastian.pop@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-28 Sebastian Pop <sebastian.pop@amd.com> + PR tree-optimization/49876 * sese.c (rename_uses): Do not return false on gloog_error: set the new_expr to integer_zero_node and continue code generation. diff --git a/gcc/graphite-clast-to-gimple.c b/gcc/graphite-clast-to-gimple.c index a911eb6..7bb1d23 100644 --- a/gcc/graphite-clast-to-gimple.c +++ b/gcc/graphite-clast-to-gimple.c @@ -816,6 +816,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 (); } @@ -1125,6 +1128,44 @@ 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; + + 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 (); + } + + 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. @@ -1175,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 9e9efb1..85daf9f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-07-22 Sebastian Pop <sebastian.pop@amd.com> + + PR middle-end/48648 + * gcc.dg/graphite/id-pr48648.c: New. + 2011-07-28 Jakub Jelinek <jakub@redhat.com> PR fortran/31067 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); +} |
