diff options
author | Sebastian Pop <sebastian.pop@amd.com> | 2011-01-25 06:48:52 +0000 |
---|---|---|
committer | Sebastian Pop <spop@gcc.gnu.org> | 2011-01-25 06:48:52 +0000 |
commit | 7c48ea6910b815e35b5f927d993564476ddaee85 (patch) | |
tree | 45762997365834e0a76445cabd4f640ee70b81b1 /gcc/graphite-sese-to-poly.c | |
parent | 38013f25bc66d8595de8359dd30a0a0e3e0713af (diff) | |
download | gcc-7c48ea6910b815e35b5f927d993564476ddaee85.tar.gz |
Do not use a data ref with indices invalid in the loop of the close_phi.
2011-01-25 Sebastian Pop <sebastian.pop@amd.com>
* graphite-sese-to-poly.c (dr_indices_valid_in_loop): New.
(close_phi_written_to_memory): Call for_each_index with
dr_indices_valid_in_loop.
* gfortran.dg/graphite/id-24.f: New.
* gfortran.dg/graphite/id-25.f: New.
From-SVN: r169220
Diffstat (limited to 'gcc/graphite-sese-to-poly.c')
-rw-r--r-- | gcc/graphite-sese-to-poly.c | 64 |
1 files changed, 56 insertions, 8 deletions
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c index c6b43858887..11a73b3f083 100644 --- a/gcc/graphite-sese-to-poly.c +++ b/gcc/graphite-sese-to-poly.c @@ -2999,6 +2999,35 @@ remove_phi (gimple phi) remove_phi_node (&gsi, false); } +/* Helper function for for_each_index. For each INDEX of the data + reference REF, returns true when its indices are valid in the loop + nest LOOP passed in as DATA. */ + +static bool +dr_indices_valid_in_loop (tree ref ATTRIBUTE_UNUSED, tree *index, void *data) +{ + loop_p loop; + basic_block header, def_bb; + gimple stmt; + + if (TREE_CODE (*index) != SSA_NAME) + return true; + + loop = *((loop_p *) data); + header = loop->header; + stmt = SSA_NAME_DEF_STMT (*index); + + if (!stmt) + return true; + + def_bb = gimple_bb (stmt); + + if (!def_bb) + return true; + + return dominated_by_p (CDI_DOMINATORS, header, def_bb); +} + /* When the result of a CLOSE_PHI is written to a memory location, return a pointer to that memory reference, otherwise return NULL_TREE. */ @@ -3007,21 +3036,40 @@ static tree close_phi_written_to_memory (gimple close_phi) { imm_use_iterator imm_iter; - tree res, def = gimple_phi_result (close_phi); use_operand_p use_p; gimple stmt; + tree res, def = gimple_phi_result (close_phi); FOR_EACH_IMM_USE_FAST (use_p, imm_iter, def) if ((stmt = USE_STMT (use_p)) && gimple_code (stmt) == GIMPLE_ASSIGN - && (res = gimple_assign_lhs (stmt)) - && (TREE_CODE (res) == ARRAY_REF - || TREE_CODE (res) == MEM_REF - || TREE_CODE (res) == VAR_DECL - || TREE_CODE (res) == PARM_DECL - || TREE_CODE (res) == RESULT_DECL)) - return res; + && (res = gimple_assign_lhs (stmt))) + { + switch (TREE_CODE (res)) + { + case VAR_DECL: + case PARM_DECL: + case RESULT_DECL: + return res; + + case ARRAY_REF: + case MEM_REF: + { + tree arg = gimple_phi_arg_def (close_phi, 0); + loop_p nest = loop_containing_stmt (SSA_NAME_DEF_STMT (arg)); + + /* FIXME: this restriction is for id-{24,25}.f and + could be handled by duplicating the computation of + array indices before the loop of the close_phi. */ + if (for_each_index (&res, dr_indices_valid_in_loop, &nest)) + return res; + } + /* Fallthru. */ + default: + continue; + } + } return NULL_TREE; } |