diff options
Diffstat (limited to 'gcc/tree-vect-data-refs.c')
-rw-r--r-- | gcc/tree-vect-data-refs.c | 104 |
1 files changed, 4 insertions, 100 deletions
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 7d3abcfd954..3de71fb3094 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -3245,120 +3245,24 @@ vect_check_gather_scatter (gimple *stmt, loop_vec_info loop_vinfo, tree *basep, */ bool -vect_analyze_data_refs (vec_info *vinfo, int *min_vf, unsigned *n_stmts) +vect_analyze_data_refs (vec_info *vinfo, int *min_vf) { struct loop *loop = NULL; - basic_block bb = NULL; unsigned int i; - vec<data_reference_p> datarefs; struct data_reference *dr; tree scalar_type; if (dump_enabled_p ()) dump_printf_loc (MSG_NOTE, vect_location, - "=== vect_analyze_data_refs ===\n"); + "=== vect_analyze_data_refs ===\n"); if (loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo)) - { - basic_block *bbs = LOOP_VINFO_BBS (loop_vinfo); - - loop = LOOP_VINFO_LOOP (loop_vinfo); - datarefs = LOOP_VINFO_DATAREFS (loop_vinfo); - if (!find_loop_nest (loop, &LOOP_VINFO_LOOP_NEST (loop_vinfo))) - { - if (dump_enabled_p ()) - dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "not vectorized: loop contains function calls" - " or data references that cannot be analyzed\n"); - return false; - } - - for (i = 0; i < loop->num_nodes; i++) - { - gimple_stmt_iterator gsi; - - for (gsi = gsi_start_bb (bbs[i]); !gsi_end_p (gsi); gsi_next (&gsi)) - { - gimple *stmt = gsi_stmt (gsi); - if (is_gimple_debug (stmt)) - continue; - ++*n_stmts; - if (!find_data_references_in_stmt (loop, stmt, &datarefs)) - { - if (is_gimple_call (stmt) && loop->safelen) - { - tree fndecl = gimple_call_fndecl (stmt), op; - if (fndecl != NULL_TREE) - { - struct cgraph_node *node = cgraph_node::get (fndecl); - if (node != NULL && node->simd_clones != NULL) - { - unsigned int j, n = gimple_call_num_args (stmt); - for (j = 0; j < n; j++) - { - op = gimple_call_arg (stmt, j); - if (DECL_P (op) - || (REFERENCE_CLASS_P (op) - && get_base_address (op))) - break; - } - op = gimple_call_lhs (stmt); - /* Ignore #pragma omp declare simd functions - if they don't have data references in the - call stmt itself. */ - if (j == n - && !(op - && (DECL_P (op) - || (REFERENCE_CLASS_P (op) - && get_base_address (op))))) - continue; - } - } - } - LOOP_VINFO_DATAREFS (loop_vinfo) = datarefs; - if (dump_enabled_p ()) - dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "not vectorized: loop contains function " - "calls or data references that cannot " - "be analyzed\n"); - return false; - } - } - } - - LOOP_VINFO_DATAREFS (loop_vinfo) = datarefs; - } - else - { - bb_vec_info bb_vinfo = as_a <bb_vec_info> (vinfo); - gimple_stmt_iterator gsi; - - bb = BB_VINFO_BB (bb_vinfo); - for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) - { - gimple *stmt = gsi_stmt (gsi); - if (is_gimple_debug (stmt)) - continue; - ++*n_stmts; - if (!find_data_references_in_stmt (NULL, stmt, - &BB_VINFO_DATAREFS (bb_vinfo))) - { - /* Mark the rest of the basic-block as unvectorizable. */ - for (; !gsi_end_p (gsi); gsi_next (&gsi)) - { - stmt = gsi_stmt (gsi); - STMT_VINFO_VECTORIZABLE (vinfo_for_stmt (stmt)) = false; - } - break; - } - } - - datarefs = BB_VINFO_DATAREFS (bb_vinfo); - } + loop = LOOP_VINFO_LOOP (loop_vinfo); /* Go through the data-refs, check that the analysis succeeded. Update pointer from stmt_vec_info struct to DR and vectype. */ + vec<data_reference_p> datarefs = vinfo->datarefs; FOR_EACH_VEC_ELT (datarefs, i, dr) { gimple *stmt; |