diff options
Diffstat (limited to 'gcc/gimple-range.cc')
-rw-r--r-- | gcc/gimple-range.cc | 64 |
1 files changed, 40 insertions, 24 deletions
diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc index 0a99787..12da168 100644 --- a/gcc/gimple-range.cc +++ b/gcc/gimple-range.cc @@ -71,7 +71,7 @@ gimple_ranger::~gimple_ranger () } bool -gimple_ranger::range_of_expr (irange &r, tree expr, gimple *stmt) +gimple_ranger::range_of_expr (vrange &r, tree expr, gimple *stmt) { unsigned idx; if (!gimple_range_ssa_p (expr)) @@ -93,7 +93,7 @@ gimple_ranger::range_of_expr (irange &r, tree expr, gimple *stmt) // If there is no statement, just get the global value. if (!stmt) { - int_range_max tmp; + Value_Range tmp (TREE_TYPE (expr)); m_cache.get_global_range (r, expr); // Pick up implied context information from the on-entry cache // if current_bb is set. Do not attempt any new calculations. @@ -137,9 +137,9 @@ gimple_ranger::range_of_expr (irange &r, tree expr, gimple *stmt) // Return the range of NAME on entry to block BB in R. void -gimple_ranger::range_on_entry (irange &r, basic_block bb, tree name) +gimple_ranger::range_on_entry (vrange &r, basic_block bb, tree name) { - int_range_max entry_range; + Value_Range entry_range (TREE_TYPE (name)); gcc_checking_assert (gimple_range_ssa_p (name)); unsigned idx; @@ -164,7 +164,7 @@ gimple_ranger::range_on_entry (irange &r, basic_block bb, tree name) // Return false if no range can be calculated. void -gimple_ranger::range_on_exit (irange &r, basic_block bb, tree name) +gimple_ranger::range_on_exit (vrange &r, basic_block bb, tree name) { // on-exit from the exit block? gcc_checking_assert (bb != EXIT_BLOCK_PTR_FOR_FN (cfun)); @@ -198,10 +198,10 @@ gimple_ranger::range_on_exit (irange &r, basic_block bb, tree name) // Calculate a range for NAME on edge E and return it in R. bool -gimple_ranger::range_on_edge (irange &r, edge e, tree name) +gimple_ranger::range_on_edge (vrange &r, edge e, tree name) { - int_range_max edge_range; - gcc_checking_assert (irange::supports_type_p (TREE_TYPE (name))); + Value_Range edge_range (TREE_TYPE (name)); + gcc_checking_assert (vrange::supports_type_p (TREE_TYPE (name))); // Do not process values along abnormal edges. if (e->flags & EDGE_ABNORMAL) @@ -249,7 +249,7 @@ gimple_ranger::range_on_edge (irange &r, edge e, tree name) // fold_range wrapper for range_of_stmt to use as an internal client. bool -gimple_ranger::fold_range_internal (irange &r, gimple *s, tree name) +gimple_ranger::fold_range_internal (vrange &r, gimple *s, tree name) { fold_using_range f; fur_depend src (s, &(gori ()), this); @@ -263,7 +263,7 @@ gimple_ranger::fold_range_internal (irange &r, gimple *s, tree name) // avoided. If a range cannot be calculated, return false and UNDEFINED. bool -gimple_ranger::range_of_stmt (irange &r, gimple *s, tree name) +gimple_ranger::range_of_stmt (vrange &r, gimple *s, tree name) { bool res; r.set_undefined (); @@ -313,7 +313,7 @@ gimple_ranger::range_of_stmt (irange &r, gimple *s, tree name) prefill_stmt_dependencies (name); // Calculate a new value. - int_range_max tmp; + Value_Range tmp (TREE_TYPE (name)); fold_range_internal (tmp, s, name); // Combine the new value with the old value. This is required because @@ -334,7 +334,7 @@ gimple_ranger::range_of_stmt (irange &r, gimple *s, tree name) // stack if so. R is a scratch range. inline void -gimple_ranger::prefill_name (irange &r, tree name) +gimple_ranger::prefill_name (vrange &r, tree name) { if (!gimple_range_ssa_p (name)) return; @@ -357,7 +357,6 @@ gimple_ranger::prefill_stmt_dependencies (tree ssa) if (SSA_NAME_IS_DEFAULT_DEF (ssa)) return; - int_range_max r; unsigned idx; gimple *stmt = SSA_NAME_DEF_STMT (ssa); gcc_checking_assert (stmt && gimple_bb (stmt)); @@ -388,9 +387,10 @@ gimple_ranger::prefill_stmt_dependencies (tree ssa) { // Fold and save the value for NAME. stmt = SSA_NAME_DEF_STMT (name); + Value_Range r (TREE_TYPE (name)); fold_range_internal (r, stmt, name); // Make sure we don't lose any current global info. - int_range_max tmp; + Value_Range tmp (TREE_TYPE (name)); m_cache.get_global_range (tmp, name); r.intersect (tmp); m_cache.set_global_range (name, r); @@ -414,6 +414,7 @@ gimple_ranger::prefill_stmt_dependencies (tree ssa) gphi *phi = dyn_cast <gphi *> (stmt); if (phi) { + Value_Range r (TREE_TYPE (gimple_phi_result (phi))); for (unsigned x = 0; x < gimple_phi_num_args (phi); x++) prefill_name (r, gimple_phi_arg_def (phi, x)); } @@ -421,6 +422,7 @@ gimple_ranger::prefill_stmt_dependencies (tree ssa) { gcc_checking_assert (range_op_handler (stmt)); tree op = gimple_range_operand2 (stmt); + Value_Range r (TREE_TYPE (name)); if (op) prefill_name (r, op); op = gimple_range_operand1 (stmt); @@ -429,7 +431,10 @@ gimple_ranger::prefill_stmt_dependencies (tree ssa) } } if (idx) - tracer.trailer (idx, "ROS ", false, ssa, r); + { + unsupported_range r; + tracer.trailer (idx, "ROS ", false, ssa, r); + } } @@ -487,8 +492,10 @@ gimple_ranger::export_global_ranges () bool print_header = true; for (unsigned x = 1; x < num_ssa_names; x++) { - int_range_max r; tree name = ssa_name (x); + if (!name) + continue; + Value_Range r (TREE_TYPE (name)); if (name && !SSA_NAME_IN_FREE_LIST (name) && gimple_range_ssa_p (name) && m_cache.get_global_range (r, name) @@ -507,13 +514,17 @@ gimple_ranger::export_global_ranges () print_header = false; } - value_range vr = r; + if (!irange::supports_type_p (TREE_TYPE (name))) + continue; + + vrange &v = r; + value_range vr = as_a <irange> (v); print_generic_expr (dump_file, name , TDF_SLIM); fprintf (dump_file, " : "); vr.dump (dump_file); fprintf (dump_file, "\n"); int_range_max same = vr; - if (same != r) + if (same != as_a <irange> (v)) { fprintf (dump_file, " irange : "); r.dump (dump_file); @@ -531,7 +542,6 @@ gimple_ranger::dump_bb (FILE *f, basic_block bb) unsigned x; edge_iterator ei; edge e; - int_range_max range, tmp_range; fprintf (f, "\n=========== BB %d ============\n", bb->index); m_cache.dump_bb (f, bb); @@ -541,9 +551,11 @@ gimple_ranger::dump_bb (FILE *f, basic_block bb) for (x = 1; x < num_ssa_names; x++) { tree name = ssa_name (x); - if (gimple_range_ssa_p (name) && SSA_NAME_DEF_STMT (name) && - gimple_bb (SSA_NAME_DEF_STMT (name)) == bb && - m_cache.get_global_range (range, name)) + if (!gimple_range_ssa_p (name) || !SSA_NAME_DEF_STMT (name)) + continue; + Value_Range range (TREE_TYPE (name)); + if (gimple_bb (SSA_NAME_DEF_STMT (name)) == bb + && m_cache.get_global_range (range, name)) { if (!range.varying_p ()) { @@ -562,10 +574,14 @@ gimple_ranger::dump_bb (FILE *f, basic_block bb) for (x = 1; x < num_ssa_names; x++) { tree name = gimple_range_ssa_p (ssa_name (x)); - if (name && gori ().has_edge_range_p (name, e) - && m_cache.range_on_edge (range, e, name)) + if (!name || !gori ().has_edge_range_p (name, e)) + continue; + + Value_Range range (TREE_TYPE (name)); + if (m_cache.range_on_edge (range, e, name)) { gimple *s = SSA_NAME_DEF_STMT (name); + Value_Range tmp_range (TREE_TYPE (name)); // Only print the range if this is the def block, or // the on entry cache for either end of the edge is // set. |