aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2020-08-04 06:48:38 +0200
committerGiuliano Belinassi <giuliano.belinassi@usp.br>2020-08-17 15:07:32 -0300
commitc4a716a3b2a78bfa74e828daa60a84a5b8a9d5a9 (patch)
tree4d5bc1523109eaec6d15ba3324a285f8317f7539
parentc2c7fcc2f9603e6b8c4a84831783be5e5b261f18 (diff)
downloadgcc-c4a716a3b2a78bfa74e828daa60a84a5b8a9d5a9.zip
gcc-c4a716a3b2a78bfa74e828daa60a84a5b8a9d5a9.tar.gz
gcc-c4a716a3b2a78bfa74e828daa60a84a5b8a9d5a9.tar.bz2
Adjust gimple-ssa-sprintf.c for irange API.
gcc/ChangeLog: * gimple-ssa-sprintf.c (get_int_range): Adjust for irange API. (format_integer): Same. (handle_printf_call): Same.
-rw-r--r--gcc/gimple-ssa-sprintf.c37
1 files changed, 16 insertions, 21 deletions
diff --git a/gcc/gimple-ssa-sprintf.c b/gcc/gimple-ssa-sprintf.c
index 3d77459..70b031f 100644
--- a/gcc/gimple-ssa-sprintf.c
+++ b/gcc/gimple-ssa-sprintf.c
@@ -1070,7 +1070,7 @@ get_int_range (tree arg, HOST_WIDE_INT *pmin, HOST_WIDE_INT *pmax,
const value_range_equiv *vr
= CONST_CAST (class vr_values *, vr_values)->get_value_range (arg);
- if (range_int_cst_p (vr))
+ if (!vr->undefined_p () && !vr->varying_p () && !vr->symbolic_p ())
{
HOST_WIDE_INT type_min
= (TYPE_UNSIGNED (argtype)
@@ -1079,8 +1079,11 @@ get_int_range (tree arg, HOST_WIDE_INT *pmin, HOST_WIDE_INT *pmax,
HOST_WIDE_INT type_max = tree_to_uhwi (TYPE_MAX_VALUE (argtype));
- *pmin = TREE_INT_CST_LOW (vr->min ());
- *pmax = TREE_INT_CST_LOW (vr->max ());
+ tree type = TREE_TYPE (arg);
+ tree tmin = wide_int_to_tree (type, vr->lower_bound ());
+ tree tmax = wide_int_to_tree (type, vr->upper_bound ());
+ *pmin = TREE_INT_CST_LOW (tmin);
+ *pmax = TREE_INT_CST_LOW (tmax);
if (*pmin < *pmax)
{
@@ -1372,10 +1375,10 @@ format_integer (const directive &dir, tree arg, const vr_values *vr_values)
const value_range_equiv *vr
= CONST_CAST (class vr_values *, vr_values)->get_value_range (arg);
- if (range_int_cst_p (vr))
+ if (!vr->varying_p () && !vr->undefined_p () && !vr->symbolic_p ())
{
- argmin = vr->min ();
- argmax = vr->max ();
+ argmin = wide_int_to_tree (TREE_TYPE (arg), vr->lower_bound ());
+ argmax = wide_int_to_tree (TREE_TYPE (arg), vr->upper_bound ());
/* Set KNOWNRANGE if the argument is in a known subrange
of the directive's type and neither width nor precision
@@ -1388,11 +1391,7 @@ format_integer (const directive &dir, tree arg, const vr_values *vr_values)
res.argmin = argmin;
res.argmax = argmax;
}
- else if (vr->kind () == VR_ANTI_RANGE)
- {
- /* Handle anti-ranges if/when bug 71690 is resolved. */
- }
- else if (vr->varying_p () || vr->undefined_p ())
+ else
{
/* The argument here may be the result of promoting the actual
argument to int. Try to determine the type of the actual
@@ -4561,10 +4560,13 @@ handle_printf_call (gimple_stmt_iterator *gsi, const vr_values *vr_values)
const value_range_equiv *vr
= CONST_CAST (class vr_values *, vr_values)->get_value_range (size);
- if (range_int_cst_p (vr))
+ if (!vr->undefined_p () && !vr->symbolic_p ())
{
- unsigned HOST_WIDE_INT minsize = TREE_INT_CST_LOW (vr->min ());
- unsigned HOST_WIDE_INT maxsize = TREE_INT_CST_LOW (vr->max ());
+ tree type = TREE_TYPE (size);
+ tree tmin = wide_int_to_tree (type, vr->lower_bound ());
+ tree tmax = wide_int_to_tree (type, vr->upper_bound ());
+ unsigned HOST_WIDE_INT minsize = TREE_INT_CST_LOW (tmin);
+ unsigned HOST_WIDE_INT maxsize = TREE_INT_CST_LOW (tmax);
dstsize = warn_level < 2 ? maxsize : minsize;
if (minsize > target_int_max ())
@@ -4578,13 +4580,6 @@ handle_printf_call (gimple_stmt_iterator *gsi, const vr_values *vr_values)
if (maxsize > target_int_max ())
posunder4k = false;
}
- else if (vr->varying_p ())
- {
- /* POSIX requires snprintf to fail if DSTSIZE is greater
- than INT_MAX. Since SIZE's range is unknown, avoid
- folding. */
- posunder4k = false;
- }
/* The destination size is not constant. If the function is
bounded (e.g., snprintf) a lower bound of zero doesn't