1 /* Pretty print support for value ranges.
2 Copyright (C) 2019-2022 Free Software Foundation, Inc.
3 Contributed by Aldy Hernandez <aldyh@redhat.com>.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
28 #include "tree-pretty-print.h"
29 #include "fold-const.h"
30 #include "gimple-range.h"
31 #include "value-range-pretty-print.h"
34 vrange_printer::visit (const unsupported_range
&r
) const
36 pp_string (pp
, "[unsupported_range] ");
39 pp_string (pp
, "UNDEFINED");
44 pp_string (pp
, "VARYING");
51 vrange_printer::visit (const irange
&r
) const
53 pp_string (pp
, "[irange] ");
56 pp_string (pp
, "UNDEFINED");
59 dump_generic_node (pp
, r
.type (), 0, TDF_NONE
, false);
60 pp_character (pp
, ' ');
63 pp_string (pp
, "VARYING");
66 // Handle legacy symbolics.
69 if (r
.kind () == VR_ANTI_RANGE
)
70 pp_character (pp
, '~');
71 pp_character (pp
, '[');
72 dump_generic_node (pp
, r
.min (), 0, TDF_NONE
, false);
74 dump_generic_node (pp
, r
.max (), 0, TDF_NONE
, false);
75 pp_character (pp
, ']');
76 print_irange_bitmasks (r
);
79 for (unsigned i
= 0; i
< r
.num_pairs (); ++i
)
81 pp_character (pp
, '[');
82 print_irange_bound (r
.lower_bound (i
), r
.type ());
84 print_irange_bound (r
.upper_bound (i
), r
.type ());
85 pp_character (pp
, ']');
87 print_irange_bitmasks (r
);
91 vrange_printer::print_irange_bound (const wide_int
&bound
, tree type
) const
93 wide_int type_min
= wi::min_value (TYPE_PRECISION (type
), TYPE_SIGN (type
));
94 wide_int type_max
= wi::max_value (TYPE_PRECISION (type
), TYPE_SIGN (type
));
96 if (INTEGRAL_TYPE_P (type
)
97 && !TYPE_UNSIGNED (type
)
99 && TYPE_PRECISION (type
) != 1)
100 pp_string (pp
, "-INF");
101 else if (bound
== type_max
&& TYPE_PRECISION (type
) != 1)
102 pp_string (pp
, "+INF");
104 pp_wide_int (pp
, bound
, TYPE_SIGN (type
));
108 vrange_printer::print_irange_bitmasks (const irange
&r
) const
110 wide_int nz
= r
.get_nonzero_bits ();
114 pp_string (pp
, " NONZERO ");
115 char buf
[WIDE_INT_PRINT_BUFFER_SIZE
];
123 vrange_printer::visit (const frange
&r
) const
125 tree type
= r
.type ();
127 pp_string (pp
, "[frange] ");
128 if (r
.undefined_p ())
130 pp_string (pp
, "UNDEFINED");
133 dump_generic_node (pp
, type
, 0, TDF_NONE
, false);
137 pp_string (pp
, "VARYING");
140 pp_character (pp
, '[');
141 dump_generic_node (pp
,
142 build_real (type
, r
.lower_bound ()), 0, TDF_NONE
, false);
143 pp_string (pp
, ", ");
144 dump_generic_node (pp
,
145 build_real (type
, r
.upper_bound ()), 0, TDF_NONE
, false);
146 pp_string (pp
, "] ");
148 print_frange_prop ("NAN", r
.get_nan ());
149 print_frange_prop ("SIGN", r
.get_signbit ());
152 // Print the FP properties in an frange.
155 vrange_printer::print_frange_prop (const char *str
, const fp_prop
&prop
) const
157 if (prop
.varying_p ())
162 else if (prop
.no_p ())
164 pp_character (pp
, '!');
167 pp_character (pp
, ' ');