#include "tree-pass.h"
#include "tree-dump.h"
#include "timevar.h"
-#include "diagnostic.h"
+#include "tree-pretty-print.h"
+#include "gimple-pretty-print.h"
#include "toplev.h"
#include "intl.h"
#include "cfgloop.h"
gimple_assign_rhs1 (stmt),
gimple_assign_rhs2 (stmt),
strict_overflow_p);
+ case GIMPLE_TERNARY_RHS:
+ return false;
case GIMPLE_SINGLE_RHS:
return tree_single_nonnegative_warnv_p (gimple_assign_rhs1 (stmt),
strict_overflow_p);
gimple_assign_rhs1 (stmt),
gimple_assign_rhs2 (stmt),
strict_overflow_p);
+ case GIMPLE_TERNARY_RHS:
+ return false;
case GIMPLE_SINGLE_RHS:
return tree_single_nonzero_warnv_p (gimple_assign_rhs1 (stmt),
strict_overflow_p);
&& code != EXACT_DIV_EXPR
&& code != ROUND_DIV_EXPR
&& code != TRUNC_MOD_EXPR
- && code != FLOOR_MOD_EXPR
- && code != CEIL_MOD_EXPR
- && code != ROUND_MOD_EXPR
&& code != RSHIFT_EXPR
&& code != MIN_EXPR
&& code != MAX_EXPR
&& code != EXACT_DIV_EXPR
&& code != ROUND_DIV_EXPR
&& code != TRUNC_MOD_EXPR
- && code != FLOOR_MOD_EXPR
- && code != CEIL_MOD_EXPR
- && code != ROUND_MOD_EXPR
&& (vr0.type == VR_VARYING
|| vr1.type == VR_VARYING
|| vr0.type != vr1.type
}
}
}
- else if (code == TRUNC_MOD_EXPR
- || code == FLOOR_MOD_EXPR
- || code == CEIL_MOD_EXPR
- || code == ROUND_MOD_EXPR)
+ else if (code == TRUNC_MOD_EXPR)
{
bool sop = false;
- if (vr0.type == VR_ANTI_RANGE
- || vr1.type != VR_RANGE
+ if (vr1.type != VR_RANGE
|| symbolic_range_p (&vr1)
- || range_includes_zero_p (&vr1))
+ || range_includes_zero_p (&vr1)
+ || vrp_val_is_min (vr1.min))
{
set_value_range_to_varying (vr);
return;
}
type = VR_RANGE;
- max = int_const_binop (MINUS_EXPR, vr1.max, integer_one_node, 0);
- if (vrp_expr_computes_nonnegative (op0, &sop)
- && vrp_expr_computes_nonnegative (op1, &sop) && !sop)
- min = build_int_cst (TREE_TYPE (vr1.max), 0);
+ /* Compute MAX <|vr1.min|, |vr1.max|> - 1. */
+ max = fold_unary_to_constant (ABS_EXPR, TREE_TYPE (vr1.min), vr1.min);
+ if (tree_int_cst_lt (max, vr1.max))
+ max = vr1.max;
+ max = int_const_binop (MINUS_EXPR, max, integer_one_node, 0);
+ /* If the dividend is non-negative the modulus will be
+ non-negative as well. */
+ if (TYPE_UNSIGNED (TREE_TYPE (max))
+ || (vrp_expr_computes_nonnegative (op0, &sop) && !sop))
+ min = build_int_cst (TREE_TYPE (max), 0);
else
- min = fold_unary (NEGATE_EXPR, TREE_TYPE (max), max);
+ min = fold_unary_to_constant (NEGATE_EXPR, TREE_TYPE (max), max);
}
else if (code == MINUS_EXPR)
{
/* Dump value range VR to stderr. */
-void
+DEBUG_FUNCTION void
debug_value_range (value_range_t *vr)
{
dump_value_range (stderr, vr);
/* Dump all value ranges to stderr. */
-void
+DEBUG_FUNCTION void
debug_all_value_ranges (void)
{
dump_all_value_ranges (stderr);
/* Dump all the registered assertions for NAME to stderr. */
-void
+DEBUG_FUNCTION void
debug_asserts_for (tree name)
{
dump_asserts_for (stderr, name);
/* Dump all the registered assertions for all the names to stderr. */
-void
+DEBUG_FUNCTION void
debug_all_asserts (void)
{
dump_all_asserts (stderr);
single_val_range = NULL;
}
- substitute_and_fold (single_val_range, vrp_fold_stmt);
+ substitute_and_fold (single_val_range, vrp_fold_stmt, false);
if (warn_array_bounds)
check_all_array_refs ();