From: spop Date: Tue, 25 Jan 2011 06:48:52 +0000 (+0000) Subject: Do not use a data ref with indices invalid in the loop of the close_phi. X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=fa6ed0e9c91479ca1df6edb6dfc50736b7587249 Do not use a data ref with indices invalid in the loop of the close_phi. 2011-01-25 Sebastian Pop * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@169220 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 599ee15eff7..25e2bc4e30e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2011-01-25 Sebastian Pop + * 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. + +2011-01-25 Sebastian Pop + * graphite-sese-to-poly.c (new_pbb_from_pbb): Only copy PBB_DOMAIN when it is initialized. diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite index 88556060ade..7fc8402763b 100644 --- a/gcc/ChangeLog.graphite +++ b/gcc/ChangeLog.graphite @@ -1,3 +1,12 @@ +2011-01-20 Sebastian Pop + + * 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. + 2011-01-19 Sebastian Pop * graphite-sese-to-poly.c (new_pbb_from_pbb): Only copy PBB_DOMAIN 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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a03e7d92117..1b26d4a4aac 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2011-01-25 Sebastian Pop + * gfortran.dg/graphite/id-24.f: New. + * gfortran.dg/graphite/id-25.f: New. + +2011-01-25 Sebastian Pop + * gfortran.dg/graphite/id-23.f: New. 2011-01-25 Sebastian Pop diff --git a/gcc/testsuite/gfortran.dg/graphite/id-24.f b/gcc/testsuite/gfortran.dg/graphite/id-24.f new file mode 100644 index 00000000000..20c40ee06e2 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/graphite/id-24.f @@ -0,0 +1,9 @@ + SUBROUTINE TFTRAB(A,NA) + DIMENSION A(NA,NA) + DO 160 K=1,NA + DUM = DUM + A(K,I) + 160 CONTINUE + DO 180 I=1,NA + A(I,J) = DUM + 180 CONTINUE + END diff --git a/gcc/testsuite/gfortran.dg/graphite/id-25.f b/gcc/testsuite/gfortran.dg/graphite/id-25.f new file mode 100644 index 00000000000..642ed6de7f5 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/graphite/id-25.f @@ -0,0 +1,10 @@ + SUBROUTINE TFTRAB(NA,NC,D,WRK) + DIMENSION D(NA,NC), WRK(NA) + DO 160 K=1,NA + DUM = DUM + D(K,J) + 160 CONTINUE + WRK(I) = DUM + DO 180 I=1,NA + D(I,J) = WRK(I) + 180 CONTINUE + END