Mercurial > hg > CbC > CbC_gcc
diff gcc/graphite-scop-detection.c @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | 84e7813d76e9 |
children |
line wrap: on
line diff
--- a/gcc/graphite-scop-detection.c Thu Oct 25 07:37:49 2018 +0900 +++ b/gcc/graphite-scop-detection.c Thu Feb 13 11:34:05 2020 +0900 @@ -1,5 +1,5 @@ /* Detection of Static Control Parts (SCoP) for Graphite. - Copyright (C) 2009-2018 Free Software Foundation, Inc. + Copyright (C) 2009-2020 Free Software Foundation, Inc. Contributed by Sebastian Pop <sebastian.pop@amd.com> and Tobias Grosser <grosser@fim.uni-passau.de>. @@ -30,7 +30,6 @@ #include "backend.h" #include "cfghooks.h" #include "domwalk.h" -#include "params.h" #include "tree.h" #include "gimple.h" #include "ssa.h" @@ -555,14 +554,19 @@ tree niter; struct tree_niter_desc niter_desc; - return single_exit (loop) - && !(loop_preheader_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP) + /* We can only handle do {} while () style loops correctly. */ + edge exit = single_exit (loop); + if (!exit + || !single_pred_p (loop->latch) + || exit->src != single_pred (loop->latch) + || !empty_block_p (loop->latch)) + return false; + + return !(loop_preheader_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP) && number_of_iterations_exit (loop, single_exit (loop), &niter_desc, false) && niter_desc.control.no_overflow && (niter = number_of_latch_executions (loop)) && !chrec_contains_undetermined (niter) - && !chrec_contains_undetermined (scalar_evolution_in_region (scop, - loop, niter)) && graphite_can_represent_expr (scop, loop, niter); } @@ -892,6 +896,10 @@ return false; return graphite_can_represent_scev (scop, CHREC_LEFT (scev)); + case ADDR_EXPR: + /* We cannot encode addresses for ISL. */ + return false; + default: break; } @@ -913,7 +921,7 @@ scop_detection::graphite_can_represent_expr (sese_l scop, loop_p loop, tree expr) { - tree scev = scalar_evolution_in_region (scop, loop, expr); + tree scev = cached_scalar_evolution_in_region (scop, loop, expr); return graphite_can_represent_scev (scop, scev); } @@ -1050,7 +1058,8 @@ FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE) if (scev_analyzable_p (op, scop) && chrec_contains_undetermined - (scalar_evolution_in_region (scop, bb->loop_father, op))) + (cached_scalar_evolution_in_region (scop, + bb->loop_father, op))) { DEBUG_PRINT (dp << "[scop-detection-fail] " << "Graphite cannot code-gen stmt:\n"; @@ -1095,14 +1104,12 @@ gcc_assert (TREE_CODE (name) == SSA_NAME && INTEGRAL_TYPE_P (TREE_TYPE (name)) && ! defined_in_sese_p (name, region->region)); - int i; tree p; FOR_EACH_VEC_ELT (region->params, i, p) if (p == name) return; - i = region->params.length (); region->params.safe_push (name); } @@ -1179,10 +1186,10 @@ FOR_EACH_VEC_ELT (GBB_CONDITIONS (gbb), i, stmt) { loop_p loop = gimple_bb (stmt)->loop_father; - tree lhs = scalar_evolution_in_region (region->region, loop, - gimple_cond_lhs (stmt)); - tree rhs = scalar_evolution_in_region (region->region, loop, - gimple_cond_rhs (stmt)); + tree lhs = cached_scalar_evolution_in_region (region->region, loop, + gimple_cond_lhs (stmt)); + tree rhs = cached_scalar_evolution_in_region (region->region, loop, + gimple_cond_rhs (stmt)); gcc_assert (!chrec_contains_undetermined (lhs) && !chrec_contains_undetermined (rhs)); @@ -1407,9 +1414,13 @@ int i, j; int *all_vertices; + struct loop *nest + = find_common_loop (scop->scop_info->region.entry->dest->loop_father, + scop->scop_info->region.exit->src->loop_father); + FOR_EACH_VEC_ELT (scop->drs, i, dr1) for (j = i+1; scop->drs.iterate (j, &dr2); j++) - if (dr_may_alias_p (dr1->dr, dr2->dr, true)) + if (dr_may_alias_p (dr1->dr, dr2->dr, nest)) { /* Dependences in the same alias set need to be handled by just looking at DR_ACCESS_FNs. */ @@ -1481,8 +1492,8 @@ tree nb_iters = number_of_latch_executions (loop); if (chrec_contains_symbols (nb_iters)) { - nb_iters = scalar_evolution_in_region (region->region, - loop, nb_iters); + nb_iters = cached_scalar_evolution_in_region (region->region, + loop, nb_iters); scan_tree_for_params (region, nb_iters); } } @@ -1627,7 +1638,7 @@ continue; } - unsigned max_arrays = PARAM_VALUE (PARAM_GRAPHITE_MAX_ARRAYS_PER_SCOP); + unsigned max_arrays = param_graphite_max_arrays_per_scop; if (max_arrays > 0 && scop->drs.length () >= max_arrays) { @@ -1640,7 +1651,7 @@ } find_scop_parameters (scop); - graphite_dim_t max_dim = PARAM_VALUE (PARAM_GRAPHITE_MAX_NB_SCOP_PARAMS); + graphite_dim_t max_dim = param_graphite_max_nb_scop_params; if (max_dim > 0 && scop_nb_params (scop) > max_dim) {