Fix PR48648: Handle CLAST assignments.
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. 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. * gcc.dg/graphite/id-pr48648.c: New. From-SVN: r176901
This commit is contained in:
parent
60cf26cce2
commit
0c43dbaf55
|
@ -1,3 +1,11 @@
|
|||
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
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue