diff options
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r-- | gcc/tree-vrp.c | 40 |
1 files changed, 18 insertions, 22 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 8a129c6d704..8d5fa66e084 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -6894,9 +6894,9 @@ remove_range_assertions (void) imm_use_iterator iter; var = ASSERT_EXPR_VAR (rhs); - gcc_assert (TREE_CODE (var) == SSA_NAME); - if (!POINTER_TYPE_P (TREE_TYPE (lhs)) + if (TREE_CODE (var) == SSA_NAME + && !POINTER_TYPE_P (TREE_TYPE (lhs)) && SSA_NAME_RANGE_INFO (lhs)) { if (is_unreachable == -1) @@ -6928,8 +6928,11 @@ remove_range_assertions (void) /* Propagate the RHS into every use of the LHS. */ FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs) - FOR_EACH_IMM_USE_ON_STMT (use_p, iter) - SET_USE (use_p, var); + { + FOR_EACH_IMM_USE_ON_STMT (use_p, iter) + SET_USE (use_p, var); + update_stmt (use_stmt); + } /* And finally, remove the copy, it is not needed. */ gsi_remove (&si, true); @@ -9093,9 +9096,7 @@ simplify_div_or_mod_using_ranges (gimple_stmt_iterator *gsi, gimple *stmt) { /* If op0 already has the range op0 % op1 has, then TRUNC_MOD_EXPR won't change anything. */ - gimple_stmt_iterator gsi = gsi_for_stmt (stmt); - gimple_assign_set_rhs_from_tree (&gsi, op0); - update_stmt (stmt); + gimple_assign_set_rhs_from_tree (gsi, op0); return true; } } @@ -9171,7 +9172,7 @@ simplify_div_or_mod_using_ranges (gimple_stmt_iterator *gsi, gimple *stmt) disjoint. Return true if we do simplify. */ static bool -simplify_min_or_max_using_ranges (gimple *stmt) +simplify_min_or_max_using_ranges (gimple_stmt_iterator *gsi, gimple *stmt) { tree op0 = gimple_assign_rhs1 (stmt); tree op1 = gimple_assign_rhs2 (stmt); @@ -9206,10 +9207,7 @@ simplify_min_or_max_using_ranges (gimple *stmt) VAL == FALSE -> OP0 > or >= op1. */ tree res = ((gimple_assign_rhs_code (stmt) == MAX_EXPR) == integer_zerop (val)) ? op0 : op1; - gimple_stmt_iterator gsi = gsi_for_stmt (stmt); - gimple_assign_set_rhs_from_tree (&gsi, res); - update_stmt (stmt); - fold_stmt (&gsi, follow_single_use_edges); + gimple_assign_set_rhs_from_tree (gsi, res); return true; } @@ -9221,7 +9219,7 @@ simplify_min_or_max_using_ranges (gimple *stmt) ABS_EXPR into a NEGATE_EXPR. */ static bool -simplify_abs_using_ranges (gimple *stmt) +simplify_abs_using_ranges (gimple_stmt_iterator *gsi, gimple *stmt) { tree op = gimple_assign_rhs1 (stmt); value_range *vr = get_value_range (op); @@ -9262,8 +9260,7 @@ simplify_abs_using_ranges (gimple *stmt) else gimple_assign_set_rhs_code (stmt, NEGATE_EXPR); update_stmt (stmt); - gimple_stmt_iterator gsi = gsi_for_stmt (stmt); - fold_stmt (&gsi, follow_single_use_edges); + fold_stmt (gsi, follow_single_use_edges); return true; } } @@ -9844,7 +9841,7 @@ simplify_switch_using_ranges (gswitch *stmt) /* Simplify an integral conversion from an SSA name in STMT. */ static bool -simplify_conversion_using_ranges (gimple *stmt) +simplify_conversion_using_ranges (gimple_stmt_iterator *gsi, gimple *stmt) { tree innerop, middleop, finaltype; gimple *def_stmt; @@ -9914,8 +9911,7 @@ simplify_conversion_using_ranges (gimple *stmt) return false; gimple_assign_set_rhs1 (stmt, innerop); - gimple_stmt_iterator gsi = gsi_for_stmt (stmt); - fold_stmt (&gsi, follow_single_use_edges); + fold_stmt (gsi, follow_single_use_edges); return true; } @@ -10218,7 +10214,7 @@ simplify_stmt_using_ranges (gimple_stmt_iterator *gsi) case ABS_EXPR: if (TREE_CODE (rhs1) == SSA_NAME && INTEGRAL_TYPE_P (TREE_TYPE (rhs1))) - return simplify_abs_using_ranges (stmt); + return simplify_abs_using_ranges (gsi, stmt); break; case BIT_AND_EXPR: @@ -10233,7 +10229,7 @@ simplify_stmt_using_ranges (gimple_stmt_iterator *gsi) CASE_CONVERT: if (TREE_CODE (rhs1) == SSA_NAME && INTEGRAL_TYPE_P (TREE_TYPE (rhs1))) - return simplify_conversion_using_ranges (stmt); + return simplify_conversion_using_ranges (gsi, stmt); break; case FLOAT_EXPR: @@ -10244,7 +10240,7 @@ simplify_stmt_using_ranges (gimple_stmt_iterator *gsi) case MIN_EXPR: case MAX_EXPR: - return simplify_min_or_max_using_ranges (stmt); + return simplify_min_or_max_using_ranges (gsi, stmt); default: break; @@ -10618,7 +10614,7 @@ vrp_finalize (bool warn_array_bounds_p) } substitute_and_fold (op_with_constant_singleton_value_range, - vrp_fold_stmt, false); + vrp_fold_stmt, true); if (warn_array_bounds && warn_array_bounds_p) check_all_array_refs (); |