1 1.1 mrg /* Support routines for value ranges. 2 1.1.1.2 mrg Copyright (C) 2019-2022 Free Software Foundation, Inc. 3 1.1.1.2 mrg Major hacks by Aldy Hernandez <aldyh (at) redhat.com> and 4 1.1.1.2 mrg Andrew MacLeod <amacleod (at) redhat.com>. 5 1.1 mrg 6 1.1 mrg This file is part of GCC. 7 1.1 mrg 8 1.1 mrg GCC is free software; you can redistribute it and/or modify 9 1.1 mrg it under the terms of the GNU General Public License as published by 10 1.1 mrg the Free Software Foundation; either version 3, or (at your option) 11 1.1 mrg any later version. 12 1.1 mrg 13 1.1 mrg GCC is distributed in the hope that it will be useful, 14 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of 15 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 1.1 mrg GNU General Public License for more details. 17 1.1 mrg 18 1.1 mrg You should have received a copy of the GNU General Public License 19 1.1 mrg along with GCC; see the file COPYING3. If not see 20 1.1 mrg <http://www.gnu.org/licenses/>. */ 21 1.1 mrg 22 1.1 mrg #include "config.h" 23 1.1 mrg #include "system.h" 24 1.1 mrg #include "coretypes.h" 25 1.1 mrg #include "backend.h" 26 1.1 mrg #include "tree.h" 27 1.1 mrg #include "gimple.h" 28 1.1 mrg #include "ssa.h" 29 1.1 mrg #include "tree-pretty-print.h" 30 1.1 mrg #include "fold-const.h" 31 1.1.1.2 mrg #include "gimple-range.h" 32 1.1 mrg 33 1.1.1.2 mrg // Here we copy between any two irange's. The ranges can be legacy or 34 1.1.1.2 mrg // multi-ranges, and copying between any combination works correctly. 35 1.1 mrg 36 1.1.1.2 mrg irange & 37 1.1.1.2 mrg irange::operator= (const irange &src) 38 1.1 mrg { 39 1.1.1.2 mrg if (legacy_mode_p ()) 40 1.1.1.2 mrg { 41 1.1.1.2 mrg copy_to_legacy (src); 42 1.1.1.2 mrg return *this; 43 1.1.1.2 mrg } 44 1.1.1.2 mrg if (src.legacy_mode_p ()) 45 1.1.1.2 mrg { 46 1.1.1.2 mrg copy_legacy_to_multi_range (src); 47 1.1.1.2 mrg return *this; 48 1.1.1.2 mrg } 49 1.1 mrg 50 1.1.1.2 mrg unsigned x; 51 1.1.1.2 mrg unsigned lim = src.m_num_ranges; 52 1.1.1.2 mrg if (lim > m_max_ranges) 53 1.1.1.2 mrg lim = m_max_ranges; 54 1.1.1.2 mrg 55 1.1.1.2 mrg for (x = 0; x < lim * 2; ++x) 56 1.1.1.2 mrg m_base[x] = src.m_base[x]; 57 1.1.1.2 mrg 58 1.1.1.2 mrg // If the range didn't fit, the last range should cover the rest. 59 1.1.1.2 mrg if (lim != src.m_num_ranges) 60 1.1.1.2 mrg m_base[x - 1] = src.m_base[src.m_num_ranges * 2 - 1]; 61 1.1.1.2 mrg 62 1.1.1.2 mrg m_num_ranges = lim; 63 1.1.1.2 mrg m_kind = src.m_kind; 64 1.1.1.2 mrg return *this; 65 1.1 mrg } 66 1.1 mrg 67 1.1.1.2 mrg // Return TRUE if range is a multi-range that can be represented as a 68 1.1.1.2 mrg // VR_ANTI_RANGE. 69 1.1.1.2 mrg 70 1.1.1.2 mrg bool 71 1.1.1.2 mrg irange::maybe_anti_range () const 72 1.1 mrg { 73 1.1.1.2 mrg tree ttype = type (); 74 1.1.1.2 mrg unsigned int precision = TYPE_PRECISION (ttype); 75 1.1.1.2 mrg signop sign = TYPE_SIGN (ttype); 76 1.1.1.2 mrg return (num_pairs () > 1 77 1.1.1.2 mrg && precision > 1 78 1.1.1.2 mrg && lower_bound () == wi::min_value (precision, sign) 79 1.1.1.2 mrg && upper_bound () == wi::max_value (precision, sign)); 80 1.1 mrg } 81 1.1 mrg 82 1.1 mrg void 83 1.1.1.2 mrg irange::copy_legacy_to_multi_range (const irange &src) 84 1.1 mrg { 85 1.1.1.2 mrg gcc_checking_assert (src.legacy_mode_p ()); 86 1.1.1.2 mrg gcc_checking_assert (!legacy_mode_p ()); 87 1.1.1.2 mrg if (src.undefined_p ()) 88 1.1.1.2 mrg set_undefined (); 89 1.1.1.2 mrg else if (src.varying_p ()) 90 1.1.1.2 mrg set_varying (src.type ()); 91 1.1.1.2 mrg else 92 1.1 mrg { 93 1.1.1.2 mrg if (range_has_numeric_bounds_p (&src)) 94 1.1.1.2 mrg set (src.min (), src.max (), src.kind ()); 95 1.1.1.2 mrg else 96 1.1.1.2 mrg { 97 1.1.1.2 mrg value_range cst (src); 98 1.1.1.2 mrg cst.normalize_symbolics (); 99 1.1.1.2 mrg gcc_checking_assert (cst.varying_p () || cst.kind () == VR_RANGE); 100 1.1.1.2 mrg set (cst.min (), cst.max ()); 101 1.1.1.2 mrg } 102 1.1 mrg } 103 1.1 mrg } 104 1.1 mrg 105 1.1.1.2 mrg // Copy any type of irange into a legacy. 106 1.1 mrg 107 1.1 mrg void 108 1.1.1.2 mrg irange::copy_to_legacy (const irange &src) 109 1.1 mrg { 110 1.1.1.2 mrg gcc_checking_assert (legacy_mode_p ()); 111 1.1.1.2 mrg // Handle legacy to legacy and other things that are easy to copy. 112 1.1.1.2 mrg if (src.legacy_mode_p () || src.varying_p () || src.undefined_p ()) 113 1.1.1.2 mrg { 114 1.1.1.2 mrg m_num_ranges = src.m_num_ranges; 115 1.1.1.2 mrg m_base[0] = src.m_base[0]; 116 1.1.1.2 mrg m_base[1] = src.m_base[1]; 117 1.1.1.2 mrg m_kind = src.m_kind; 118 1.1 mrg return; 119 1.1 mrg } 120 1.1.1.2 mrg // Copy multi-range to legacy. 121 1.1.1.2 mrg if (src.maybe_anti_range ()) 122 1.1 mrg { 123 1.1.1.2 mrg int_range<3> r (src); 124 1.1.1.2 mrg r.invert (); 125 1.1.1.2 mrg // Use tree variants to save on tree -> wi -> tree conversions. 126 1.1.1.2 mrg set (r.tree_lower_bound (0), r.tree_upper_bound (0), VR_ANTI_RANGE); 127 1.1 mrg } 128 1.1.1.2 mrg else 129 1.1.1.2 mrg set (src.tree_lower_bound (), src.tree_upper_bound ()); 130 1.1.1.2 mrg } 131 1.1 mrg 132 1.1.1.2 mrg // Swap MIN/MAX if they are out of order and adjust KIND appropriately. 133 1.1 mrg 134 1.1.1.2 mrg static void 135 1.1.1.2 mrg swap_out_of_order_endpoints (tree &min, tree &max, value_range_kind &kind) 136 1.1.1.2 mrg { 137 1.1.1.2 mrg gcc_checking_assert (kind != VR_UNDEFINED); 138 1.1.1.2 mrg if (kind == VR_VARYING) 139 1.1.1.2 mrg return; 140 1.1 mrg /* Wrong order for min and max, to swap them and the VR type we need 141 1.1 mrg to adjust them. */ 142 1.1 mrg if (tree_int_cst_lt (max, min)) 143 1.1 mrg { 144 1.1 mrg tree one, tmp; 145 1.1 mrg 146 1.1 mrg /* For one bit precision if max < min, then the swapped 147 1.1 mrg range covers all values, so for VR_RANGE it is varying and 148 1.1 mrg for VR_ANTI_RANGE empty range, so drop to varying as well. */ 149 1.1 mrg if (TYPE_PRECISION (TREE_TYPE (min)) == 1) 150 1.1 mrg { 151 1.1.1.2 mrg kind = VR_VARYING; 152 1.1 mrg return; 153 1.1 mrg } 154 1.1 mrg 155 1.1 mrg one = build_int_cst (TREE_TYPE (min), 1); 156 1.1 mrg tmp = int_const_binop (PLUS_EXPR, max, one); 157 1.1 mrg max = int_const_binop (MINUS_EXPR, min, one); 158 1.1 mrg min = tmp; 159 1.1 mrg 160 1.1 mrg /* There's one corner case, if we had [C+1, C] before we now have 161 1.1 mrg that again. But this represents an empty value range, so drop 162 1.1 mrg to varying in this case. */ 163 1.1 mrg if (tree_int_cst_lt (max, min)) 164 1.1 mrg { 165 1.1.1.2 mrg kind = VR_VARYING; 166 1.1 mrg return; 167 1.1 mrg } 168 1.1 mrg kind = kind == VR_RANGE ? VR_ANTI_RANGE : VR_RANGE; 169 1.1 mrg } 170 1.1.1.2 mrg } 171 1.1.1.2 mrg 172 1.1.1.2 mrg void 173 1.1.1.2 mrg irange::irange_set (tree min, tree max) 174 1.1.1.2 mrg { 175 1.1.1.2 mrg gcc_checking_assert (!POLY_INT_CST_P (min)); 176 1.1.1.2 mrg gcc_checking_assert (!POLY_INT_CST_P (max)); 177 1.1.1.2 mrg 178 1.1.1.2 mrg m_base[0] = min; 179 1.1.1.2 mrg m_base[1] = max; 180 1.1.1.2 mrg m_num_ranges = 1; 181 1.1.1.2 mrg m_kind = VR_RANGE; 182 1.1.1.2 mrg normalize_kind (); 183 1.1.1.2 mrg 184 1.1.1.2 mrg if (flag_checking) 185 1.1.1.2 mrg verify_range (); 186 1.1.1.2 mrg } 187 1.1.1.2 mrg 188 1.1.1.2 mrg void 189 1.1.1.2 mrg irange::irange_set_1bit_anti_range (tree min, tree max) 190 1.1.1.2 mrg { 191 1.1.1.2 mrg tree type = TREE_TYPE (min); 192 1.1.1.2 mrg gcc_checking_assert (TYPE_PRECISION (type) == 1); 193 1.1.1.2 mrg 194 1.1.1.2 mrg if (operand_equal_p (min, max)) 195 1.1.1.2 mrg { 196 1.1.1.2 mrg // Since these are 1-bit quantities, they can only be [MIN,MIN] 197 1.1.1.2 mrg // or [MAX,MAX]. 198 1.1.1.2 mrg if (vrp_val_is_min (min)) 199 1.1.1.2 mrg min = max = vrp_val_max (type); 200 1.1.1.2 mrg else 201 1.1.1.2 mrg min = max = vrp_val_min (type); 202 1.1.1.2 mrg set (min, max); 203 1.1.1.2 mrg } 204 1.1.1.2 mrg else 205 1.1.1.2 mrg { 206 1.1.1.2 mrg // The only alternative is [MIN,MAX], which is the empty range. 207 1.1.1.2 mrg gcc_checking_assert (vrp_val_is_min (min)); 208 1.1.1.2 mrg gcc_checking_assert (vrp_val_is_max (max)); 209 1.1.1.2 mrg set_undefined (); 210 1.1.1.2 mrg } 211 1.1.1.2 mrg if (flag_checking) 212 1.1.1.2 mrg verify_range (); 213 1.1.1.2 mrg } 214 1.1.1.2 mrg 215 1.1.1.2 mrg void 216 1.1.1.2 mrg irange::irange_set_anti_range (tree min, tree max) 217 1.1.1.2 mrg { 218 1.1.1.2 mrg gcc_checking_assert (!POLY_INT_CST_P (min)); 219 1.1.1.2 mrg gcc_checking_assert (!POLY_INT_CST_P (max)); 220 1.1.1.2 mrg 221 1.1.1.2 mrg if (TYPE_PRECISION (TREE_TYPE (min)) == 1) 222 1.1.1.2 mrg { 223 1.1.1.2 mrg irange_set_1bit_anti_range (min, max); 224 1.1.1.2 mrg return; 225 1.1.1.2 mrg } 226 1.1 mrg 227 1.1.1.2 mrg // set an anti-range 228 1.1 mrg tree type = TREE_TYPE (min); 229 1.1.1.2 mrg signop sign = TYPE_SIGN (type); 230 1.1.1.2 mrg int_range<2> type_range (type); 231 1.1.1.2 mrg // Calculate INVERSE([I,J]) as [-MIN, I-1][J+1, +MAX]. 232 1.1.1.2 mrg m_num_ranges = 0; 233 1.1.1.2 mrg wi::overflow_type ovf; 234 1.1.1.2 mrg 235 1.1.1.2 mrg wide_int w_min = wi::to_wide (min); 236 1.1.1.2 mrg if (wi::ne_p (w_min, type_range.lower_bound ())) 237 1.1.1.2 mrg { 238 1.1.1.2 mrg wide_int lim1 = wi::sub (w_min, 1, sign, &ovf); 239 1.1.1.2 mrg gcc_checking_assert (ovf != wi::OVF_OVERFLOW); 240 1.1.1.2 mrg m_base[0] = type_range.tree_lower_bound (0); 241 1.1.1.2 mrg m_base[1] = wide_int_to_tree (type, lim1); 242 1.1.1.2 mrg m_num_ranges = 1; 243 1.1.1.2 mrg } 244 1.1.1.2 mrg wide_int w_max = wi::to_wide (max); 245 1.1.1.2 mrg if (wi::ne_p (w_max, type_range.upper_bound ())) 246 1.1.1.2 mrg { 247 1.1.1.2 mrg wide_int lim2 = wi::add (w_max, 1, sign, &ovf); 248 1.1.1.2 mrg gcc_checking_assert (ovf != wi::OVF_OVERFLOW); 249 1.1.1.2 mrg m_base[m_num_ranges * 2] = wide_int_to_tree (type, lim2); 250 1.1.1.2 mrg m_base[m_num_ranges * 2 + 1] = type_range.tree_upper_bound (0); 251 1.1.1.2 mrg ++m_num_ranges; 252 1.1.1.2 mrg } 253 1.1.1.2 mrg 254 1.1.1.2 mrg m_kind = VR_RANGE; 255 1.1.1.2 mrg normalize_kind (); 256 1.1.1.2 mrg 257 1.1.1.2 mrg if (flag_checking) 258 1.1.1.2 mrg verify_range (); 259 1.1.1.2 mrg } 260 1.1.1.2 mrg 261 1.1.1.2 mrg /* Set value range to the canonical form of {VRTYPE, MIN, MAX, EQUIV}. 262 1.1.1.2 mrg This means adjusting VRTYPE, MIN and MAX representing the case of a 263 1.1.1.2 mrg wrapping range with MAX < MIN covering [MIN, type_max] U [type_min, MAX] 264 1.1.1.2 mrg as anti-rage ~[MAX+1, MIN-1]. Likewise for wrapping anti-ranges. 265 1.1.1.2 mrg In corner cases where MAX+1 or MIN-1 wraps this will fall back 266 1.1.1.2 mrg to varying. 267 1.1.1.2 mrg This routine exists to ease canonicalization in the case where we 268 1.1.1.2 mrg extract ranges from var + CST op limit. */ 269 1.1.1.2 mrg 270 1.1.1.2 mrg void 271 1.1.1.2 mrg irange::set (tree min, tree max, value_range_kind kind) 272 1.1.1.2 mrg { 273 1.1.1.2 mrg if (kind != VR_UNDEFINED) 274 1.1.1.2 mrg { 275 1.1.1.2 mrg if (TREE_OVERFLOW_P (min)) 276 1.1.1.2 mrg min = drop_tree_overflow (min); 277 1.1.1.2 mrg if (TREE_OVERFLOW_P (max)) 278 1.1.1.2 mrg max = drop_tree_overflow (max); 279 1.1.1.2 mrg } 280 1.1.1.2 mrg 281 1.1.1.2 mrg if (!legacy_mode_p ()) 282 1.1.1.2 mrg { 283 1.1.1.2 mrg if (kind == VR_RANGE) 284 1.1.1.2 mrg irange_set (min, max); 285 1.1.1.2 mrg else 286 1.1.1.2 mrg { 287 1.1.1.2 mrg gcc_checking_assert (kind == VR_ANTI_RANGE); 288 1.1.1.2 mrg irange_set_anti_range (min, max); 289 1.1.1.2 mrg } 290 1.1.1.2 mrg return; 291 1.1.1.2 mrg } 292 1.1.1.2 mrg if (kind == VR_UNDEFINED) 293 1.1.1.2 mrg { 294 1.1.1.2 mrg set_undefined (); 295 1.1.1.2 mrg return; 296 1.1.1.2 mrg } 297 1.1.1.2 mrg 298 1.1.1.2 mrg if (kind == VR_VARYING 299 1.1.1.2 mrg || POLY_INT_CST_P (min) 300 1.1.1.2 mrg || POLY_INT_CST_P (max)) 301 1.1.1.2 mrg { 302 1.1.1.2 mrg set_varying (TREE_TYPE (min)); 303 1.1.1.2 mrg return; 304 1.1.1.2 mrg } 305 1.1.1.2 mrg 306 1.1.1.2 mrg // Nothing to canonicalize for symbolic ranges. 307 1.1.1.2 mrg if (TREE_CODE (min) != INTEGER_CST 308 1.1.1.2 mrg || TREE_CODE (max) != INTEGER_CST) 309 1.1.1.2 mrg { 310 1.1.1.2 mrg m_kind = kind; 311 1.1.1.2 mrg m_base[0] = min; 312 1.1.1.2 mrg m_base[1] = max; 313 1.1.1.2 mrg m_num_ranges = 1; 314 1.1.1.2 mrg return; 315 1.1.1.2 mrg } 316 1.1 mrg 317 1.1.1.2 mrg swap_out_of_order_endpoints (min, max, kind); 318 1.1.1.2 mrg if (kind == VR_VARYING) 319 1.1.1.2 mrg { 320 1.1.1.2 mrg set_varying (TREE_TYPE (min)); 321 1.1.1.2 mrg return; 322 1.1.1.2 mrg } 323 1.1.1.2 mrg 324 1.1.1.2 mrg // Anti-ranges that can be represented as ranges should be so. 325 1.1 mrg if (kind == VR_ANTI_RANGE) 326 1.1 mrg { 327 1.1 mrg bool is_min = vrp_val_is_min (min); 328 1.1 mrg bool is_max = vrp_val_is_max (max); 329 1.1 mrg 330 1.1 mrg if (is_min && is_max) 331 1.1 mrg { 332 1.1.1.2 mrg // Fall through. This will either be normalized as 333 1.1.1.2 mrg // VR_UNDEFINED if the anti-range spans the entire 334 1.1.1.2 mrg // precision, or it will remain an VR_ANTI_RANGE in the case 335 1.1.1.2 mrg // of an -fstrict-enum where [MIN,MAX] is less than the span 336 1.1.1.2 mrg // of underlying precision. 337 1.1 mrg } 338 1.1.1.2 mrg else if (TYPE_PRECISION (TREE_TYPE (min)) == 1) 339 1.1 mrg { 340 1.1.1.2 mrg irange_set_1bit_anti_range (min, max); 341 1.1.1.2 mrg return; 342 1.1 mrg } 343 1.1 mrg else if (is_min) 344 1.1 mrg { 345 1.1 mrg tree one = build_int_cst (TREE_TYPE (max), 1); 346 1.1 mrg min = int_const_binop (PLUS_EXPR, max, one); 347 1.1 mrg max = vrp_val_max (TREE_TYPE (max)); 348 1.1 mrg kind = VR_RANGE; 349 1.1 mrg } 350 1.1 mrg else if (is_max) 351 1.1 mrg { 352 1.1 mrg tree one = build_int_cst (TREE_TYPE (min), 1); 353 1.1 mrg max = int_const_binop (MINUS_EXPR, min, one); 354 1.1 mrg min = vrp_val_min (TREE_TYPE (min)); 355 1.1 mrg kind = VR_RANGE; 356 1.1 mrg } 357 1.1 mrg } 358 1.1 mrg 359 1.1 mrg m_kind = kind; 360 1.1.1.2 mrg m_base[0] = min; 361 1.1.1.2 mrg m_base[1] = max; 362 1.1.1.2 mrg m_num_ranges = 1; 363 1.1.1.2 mrg normalize_kind (); 364 1.1 mrg if (flag_checking) 365 1.1.1.2 mrg verify_range (); 366 1.1 mrg } 367 1.1 mrg 368 1.1.1.2 mrg // Check the validity of the range. 369 1.1 mrg 370 1.1 mrg void 371 1.1.1.2 mrg irange::verify_range () 372 1.1 mrg { 373 1.1.1.2 mrg if (m_kind == VR_UNDEFINED) 374 1.1 mrg { 375 1.1.1.2 mrg gcc_checking_assert (m_num_ranges == 0); 376 1.1.1.2 mrg return; 377 1.1 mrg } 378 1.1.1.2 mrg if (m_kind == VR_VARYING) 379 1.1 mrg { 380 1.1.1.2 mrg gcc_checking_assert (m_num_ranges == 1); 381 1.1.1.2 mrg gcc_checking_assert (varying_compatible_p ()); 382 1.1.1.2 mrg return; 383 1.1 mrg } 384 1.1.1.2 mrg if (!legacy_mode_p ()) 385 1.1.1.2 mrg { 386 1.1.1.2 mrg gcc_checking_assert (m_num_ranges != 0); 387 1.1.1.2 mrg gcc_checking_assert (!varying_compatible_p ()); 388 1.1.1.2 mrg for (unsigned i = 0; i < m_num_ranges; ++i) 389 1.1.1.2 mrg { 390 1.1.1.2 mrg tree lb = tree_lower_bound (i); 391 1.1.1.2 mrg tree ub = tree_upper_bound (i); 392 1.1.1.2 mrg int c = compare_values (lb, ub); 393 1.1.1.2 mrg gcc_checking_assert (c == 0 || c == -1); 394 1.1.1.2 mrg } 395 1.1.1.2 mrg return; 396 1.1.1.2 mrg } 397 1.1.1.2 mrg if (m_kind == VR_RANGE || m_kind == VR_ANTI_RANGE) 398 1.1 mrg { 399 1.1.1.2 mrg gcc_checking_assert (m_num_ranges == 1); 400 1.1.1.2 mrg int cmp = compare_values (tree_lower_bound (0), tree_upper_bound (0)); 401 1.1.1.2 mrg gcc_checking_assert (cmp == 0 || cmp == -1 || cmp == -2); 402 1.1 mrg } 403 1.1 mrg } 404 1.1 mrg 405 1.1.1.2 mrg // Return the lower bound for a sub-range. PAIR is the sub-range in 406 1.1.1.2 mrg // question. 407 1.1 mrg 408 1.1 mrg wide_int 409 1.1.1.2 mrg irange::legacy_lower_bound (unsigned pair) const 410 1.1 mrg { 411 1.1.1.2 mrg gcc_checking_assert (legacy_mode_p ()); 412 1.1 mrg if (symbolic_p ()) 413 1.1 mrg { 414 1.1 mrg value_range numeric_range (*this); 415 1.1 mrg numeric_range.normalize_symbolics (); 416 1.1.1.2 mrg return numeric_range.legacy_lower_bound (pair); 417 1.1 mrg } 418 1.1.1.2 mrg gcc_checking_assert (m_num_ranges > 0); 419 1.1 mrg gcc_checking_assert (pair + 1 <= num_pairs ()); 420 1.1 mrg if (m_kind == VR_ANTI_RANGE) 421 1.1 mrg { 422 1.1.1.2 mrg tree typ = type (), t; 423 1.1.1.2 mrg if (pair == 1 || vrp_val_is_min (min ())) 424 1.1.1.2 mrg t = wide_int_to_tree (typ, wi::to_wide (max ()) + 1); 425 1.1 mrg else 426 1.1 mrg t = vrp_val_min (typ); 427 1.1.1.2 mrg return wi::to_wide (t); 428 1.1 mrg } 429 1.1.1.2 mrg return wi::to_wide (tree_lower_bound (pair)); 430 1.1 mrg } 431 1.1 mrg 432 1.1.1.2 mrg // Return the upper bound for a sub-range. PAIR is the sub-range in 433 1.1.1.2 mrg // question. 434 1.1 mrg 435 1.1 mrg wide_int 436 1.1.1.2 mrg irange::legacy_upper_bound (unsigned pair) const 437 1.1 mrg { 438 1.1.1.2 mrg gcc_checking_assert (legacy_mode_p ()); 439 1.1 mrg if (symbolic_p ()) 440 1.1 mrg { 441 1.1 mrg value_range numeric_range (*this); 442 1.1 mrg numeric_range.normalize_symbolics (); 443 1.1.1.2 mrg return numeric_range.legacy_upper_bound (pair); 444 1.1 mrg } 445 1.1.1.2 mrg gcc_checking_assert (m_num_ranges > 0); 446 1.1 mrg gcc_checking_assert (pair + 1 <= num_pairs ()); 447 1.1 mrg if (m_kind == VR_ANTI_RANGE) 448 1.1 mrg { 449 1.1.1.2 mrg tree typ = type (), t; 450 1.1.1.2 mrg if (pair == 1 || vrp_val_is_min (min ())) 451 1.1 mrg t = vrp_val_max (typ); 452 1.1 mrg else 453 1.1.1.2 mrg t = wide_int_to_tree (typ, wi::to_wide (min ()) - 1); 454 1.1.1.2 mrg return wi::to_wide (t); 455 1.1 mrg } 456 1.1.1.2 mrg return wi::to_wide (tree_upper_bound (pair)); 457 1.1 mrg } 458 1.1 mrg 459 1.1 mrg bool 460 1.1.1.2 mrg irange::legacy_equal_p (const irange &other) const 461 1.1 mrg { 462 1.1.1.2 mrg gcc_checking_assert (legacy_mode_p () && other.legacy_mode_p ()); 463 1.1 mrg 464 1.1.1.2 mrg if (m_kind != other.m_kind) 465 1.1.1.2 mrg return false; 466 1.1.1.2 mrg if (m_kind == VR_UNDEFINED) 467 1.1.1.2 mrg return true; 468 1.1.1.2 mrg if (m_kind == VR_VARYING) 469 1.1.1.2 mrg return range_compatible_p (type (), other.type ()); 470 1.1.1.2 mrg return (vrp_operand_equal_p (tree_lower_bound (0), 471 1.1.1.2 mrg other.tree_lower_bound (0)) 472 1.1.1.2 mrg && vrp_operand_equal_p (tree_upper_bound (0), 473 1.1.1.2 mrg other.tree_upper_bound (0))); 474 1.1 mrg } 475 1.1 mrg 476 1.1 mrg bool 477 1.1.1.2 mrg irange::equal_p (const irange &other) const 478 1.1 mrg { 479 1.1.1.2 mrg if (legacy_mode_p ()) 480 1.1.1.2 mrg { 481 1.1.1.2 mrg if (other.legacy_mode_p ()) 482 1.1.1.2 mrg return legacy_equal_p (other); 483 1.1.1.2 mrg value_range tmp (other); 484 1.1.1.2 mrg return legacy_equal_p (tmp); 485 1.1.1.2 mrg } 486 1.1.1.2 mrg if (other.legacy_mode_p ()) 487 1.1.1.2 mrg { 488 1.1.1.2 mrg value_range tmp2 (*this); 489 1.1.1.2 mrg return tmp2.legacy_equal_p (other); 490 1.1.1.2 mrg } 491 1.1.1.2 mrg 492 1.1.1.2 mrg if (m_num_ranges != other.m_num_ranges) 493 1.1.1.2 mrg return false; 494 1.1.1.2 mrg 495 1.1.1.2 mrg for (unsigned i = 0; i < m_num_ranges; ++i) 496 1.1.1.2 mrg { 497 1.1.1.2 mrg tree lb = tree_lower_bound (i); 498 1.1.1.2 mrg tree ub = tree_upper_bound (i); 499 1.1.1.2 mrg tree lb_other = other.tree_lower_bound (i); 500 1.1.1.2 mrg tree ub_other = other.tree_upper_bound (i); 501 1.1.1.2 mrg if (!operand_equal_p (lb, lb_other, 0) 502 1.1.1.2 mrg || !operand_equal_p (ub, ub_other, 0)) 503 1.1.1.2 mrg return false; 504 1.1.1.2 mrg } 505 1.1.1.2 mrg return true; 506 1.1 mrg } 507 1.1 mrg 508 1.1 mrg /* Return TRUE if this is a symbolic range. */ 509 1.1 mrg 510 1.1 mrg bool 511 1.1.1.2 mrg irange::symbolic_p () const 512 1.1 mrg { 513 1.1.1.2 mrg return (m_num_ranges > 0 514 1.1.1.2 mrg && (!is_gimple_min_invariant (min ()) 515 1.1.1.2 mrg || !is_gimple_min_invariant (max ()))); 516 1.1 mrg } 517 1.1 mrg 518 1.1.1.2 mrg /* Return TRUE if this is a constant range. */ 519 1.1 mrg 520 1.1 mrg bool 521 1.1.1.2 mrg irange::constant_p () const 522 1.1 mrg { 523 1.1.1.2 mrg return (m_num_ranges > 0 524 1.1.1.2 mrg && TREE_CODE (min ()) == INTEGER_CST 525 1.1.1.2 mrg && TREE_CODE (max ()) == INTEGER_CST); 526 1.1 mrg } 527 1.1 mrg 528 1.1.1.2 mrg /* If range is a singleton, place it in RESULT and return TRUE. 529 1.1.1.2 mrg Note: A singleton can be any gimple invariant, not just constants. 530 1.1.1.2 mrg So, [&x, &x] counts as a singleton. */ 531 1.1.1.2 mrg 532 1.1 mrg bool 533 1.1.1.2 mrg irange::singleton_p (tree *result) const 534 1.1 mrg { 535 1.1.1.2 mrg if (!legacy_mode_p ()) 536 1.1.1.2 mrg { 537 1.1.1.2 mrg if (num_pairs () == 1 && (wi::to_wide (tree_lower_bound ()) 538 1.1.1.2 mrg == wi::to_wide (tree_upper_bound ()))) 539 1.1.1.2 mrg { 540 1.1.1.2 mrg if (result) 541 1.1.1.2 mrg *result = tree_lower_bound (); 542 1.1.1.2 mrg return true; 543 1.1.1.2 mrg } 544 1.1.1.2 mrg return false; 545 1.1.1.2 mrg } 546 1.1 mrg if (m_kind == VR_ANTI_RANGE) 547 1.1 mrg { 548 1.1 mrg if (nonzero_p ()) 549 1.1 mrg { 550 1.1 mrg if (TYPE_PRECISION (type ()) == 1) 551 1.1 mrg { 552 1.1 mrg if (result) 553 1.1.1.2 mrg *result = max (); 554 1.1 mrg return true; 555 1.1 mrg } 556 1.1 mrg return false; 557 1.1 mrg } 558 1.1 mrg if (num_pairs () == 1) 559 1.1 mrg { 560 1.1 mrg value_range vr0, vr1; 561 1.1.1.2 mrg ranges_from_anti_range ((const value_range *) this, &vr0, &vr1); 562 1.1 mrg return vr0.singleton_p (result); 563 1.1 mrg } 564 1.1 mrg } 565 1.1.1.2 mrg // Catches non-numeric extremes as well. 566 1.1 mrg if (m_kind == VR_RANGE 567 1.1 mrg && vrp_operand_equal_p (min (), max ()) 568 1.1 mrg && is_gimple_min_invariant (min ())) 569 1.1 mrg { 570 1.1 mrg if (result) 571 1.1 mrg *result = min (); 572 1.1 mrg return true; 573 1.1 mrg } 574 1.1 mrg return false; 575 1.1 mrg } 576 1.1 mrg 577 1.1 mrg /* Return 1 if VAL is inside value range. 578 1.1.1.2 mrg 0 if VAL is not inside value range. 579 1.1 mrg -2 if we cannot tell either way. 580 1.1 mrg 581 1.1 mrg Benchmark compile/20001226-1.c compilation time after changing this 582 1.1 mrg function. */ 583 1.1 mrg 584 1.1 mrg int 585 1.1.1.2 mrg irange::value_inside_range (tree val) const 586 1.1 mrg { 587 1.1 mrg if (varying_p ()) 588 1.1 mrg return 1; 589 1.1 mrg 590 1.1 mrg if (undefined_p ()) 591 1.1 mrg return 0; 592 1.1 mrg 593 1.1.1.2 mrg if (!legacy_mode_p () && TREE_CODE (val) == INTEGER_CST) 594 1.1.1.2 mrg return contains_p (val); 595 1.1.1.2 mrg 596 1.1.1.2 mrg int cmp1 = operand_less_p (val, min ()); 597 1.1 mrg if (cmp1 == -2) 598 1.1 mrg return -2; 599 1.1 mrg if (cmp1 == 1) 600 1.1 mrg return m_kind != VR_RANGE; 601 1.1 mrg 602 1.1.1.2 mrg int cmp2 = operand_less_p (max (), val); 603 1.1 mrg if (cmp2 == -2) 604 1.1 mrg return -2; 605 1.1 mrg 606 1.1 mrg if (m_kind == VR_RANGE) 607 1.1 mrg return !cmp2; 608 1.1 mrg else 609 1.1 mrg return !!cmp2; 610 1.1 mrg } 611 1.1 mrg 612 1.1 mrg /* Return TRUE if it is possible that range contains VAL. */ 613 1.1 mrg 614 1.1 mrg bool 615 1.1.1.2 mrg irange::may_contain_p (tree val) const 616 1.1 mrg { 617 1.1 mrg return value_inside_range (val) != 0; 618 1.1 mrg } 619 1.1 mrg 620 1.1 mrg /* Return TRUE if range contains INTEGER_CST. */ 621 1.1.1.2 mrg /* Return 1 if VAL is inside value range. 622 1.1.1.2 mrg 0 if VAL is not inside value range. 623 1.1.1.2 mrg 624 1.1.1.2 mrg Benchmark compile/20001226-1.c compilation time after changing this 625 1.1.1.2 mrg function. */ 626 1.1.1.2 mrg 627 1.1 mrg 628 1.1 mrg bool 629 1.1.1.2 mrg irange::contains_p (tree cst) const 630 1.1 mrg { 631 1.1.1.2 mrg if (undefined_p ()) 632 1.1.1.2 mrg return false; 633 1.1.1.2 mrg 634 1.1.1.2 mrg if (legacy_mode_p ()) 635 1.1 mrg { 636 1.1.1.2 mrg gcc_checking_assert (TREE_CODE (cst) == INTEGER_CST); 637 1.1.1.2 mrg if (symbolic_p ()) 638 1.1.1.2 mrg { 639 1.1.1.2 mrg value_range numeric_range (*this); 640 1.1.1.2 mrg numeric_range.normalize_symbolics (); 641 1.1.1.2 mrg return numeric_range.contains_p (cst); 642 1.1.1.2 mrg } 643 1.1.1.2 mrg return value_inside_range (cst) == 1; 644 1.1.1.2 mrg } 645 1.1.1.2 mrg 646 1.1.1.2 mrg gcc_checking_assert (TREE_CODE (cst) == INTEGER_CST); 647 1.1.1.2 mrg signop sign = TYPE_SIGN (TREE_TYPE (cst)); 648 1.1.1.2 mrg wide_int v = wi::to_wide (cst); 649 1.1.1.2 mrg for (unsigned r = 0; r < m_num_ranges; ++r) 650 1.1.1.2 mrg { 651 1.1.1.2 mrg if (wi::lt_p (v, lower_bound (r), sign)) 652 1.1.1.2 mrg return false; 653 1.1.1.2 mrg if (wi::le_p (v, upper_bound (r), sign)) 654 1.1.1.2 mrg return true; 655 1.1 mrg } 656 1.1.1.2 mrg 657 1.1.1.2 mrg return false; 658 1.1 mrg } 659 1.1 mrg 660 1.1.1.2 mrg 661 1.1 mrg /* Normalize addresses into constants. */ 662 1.1 mrg 663 1.1 mrg void 664 1.1.1.2 mrg irange::normalize_addresses () 665 1.1 mrg { 666 1.1 mrg if (undefined_p ()) 667 1.1 mrg return; 668 1.1 mrg 669 1.1 mrg if (!POINTER_TYPE_P (type ()) || range_has_numeric_bounds_p (this)) 670 1.1 mrg return; 671 1.1 mrg 672 1.1 mrg if (!range_includes_zero_p (this)) 673 1.1 mrg { 674 1.1.1.2 mrg gcc_checking_assert (TREE_CODE (min ()) == ADDR_EXPR 675 1.1.1.2 mrg || TREE_CODE (max ()) == ADDR_EXPR); 676 1.1 mrg set_nonzero (type ()); 677 1.1 mrg return; 678 1.1 mrg } 679 1.1 mrg set_varying (type ()); 680 1.1 mrg } 681 1.1 mrg 682 1.1 mrg /* Normalize symbolics and addresses into constants. */ 683 1.1 mrg 684 1.1 mrg void 685 1.1.1.2 mrg irange::normalize_symbolics () 686 1.1 mrg { 687 1.1 mrg if (varying_p () || undefined_p ()) 688 1.1 mrg return; 689 1.1 mrg 690 1.1 mrg tree ttype = type (); 691 1.1 mrg bool min_symbolic = !is_gimple_min_invariant (min ()); 692 1.1 mrg bool max_symbolic = !is_gimple_min_invariant (max ()); 693 1.1 mrg if (!min_symbolic && !max_symbolic) 694 1.1 mrg { 695 1.1 mrg normalize_addresses (); 696 1.1 mrg return; 697 1.1 mrg } 698 1.1 mrg 699 1.1 mrg // [SYM, SYM] -> VARYING 700 1.1 mrg if (min_symbolic && max_symbolic) 701 1.1 mrg { 702 1.1 mrg set_varying (ttype); 703 1.1 mrg return; 704 1.1 mrg } 705 1.1 mrg if (kind () == VR_RANGE) 706 1.1 mrg { 707 1.1 mrg // [SYM, NUM] -> [-MIN, NUM] 708 1.1 mrg if (min_symbolic) 709 1.1 mrg { 710 1.1 mrg set (vrp_val_min (ttype), max ()); 711 1.1 mrg return; 712 1.1 mrg } 713 1.1 mrg // [NUM, SYM] -> [NUM, +MAX] 714 1.1 mrg set (min (), vrp_val_max (ttype)); 715 1.1 mrg return; 716 1.1 mrg } 717 1.1 mrg gcc_checking_assert (kind () == VR_ANTI_RANGE); 718 1.1 mrg // ~[SYM, NUM] -> [NUM + 1, +MAX] 719 1.1 mrg if (min_symbolic) 720 1.1 mrg { 721 1.1 mrg if (!vrp_val_is_max (max ())) 722 1.1 mrg { 723 1.1 mrg tree n = wide_int_to_tree (ttype, wi::to_wide (max ()) + 1); 724 1.1 mrg set (n, vrp_val_max (ttype)); 725 1.1 mrg return; 726 1.1 mrg } 727 1.1 mrg set_varying (ttype); 728 1.1 mrg return; 729 1.1 mrg } 730 1.1 mrg // ~[NUM, SYM] -> [-MIN, NUM - 1] 731 1.1 mrg if (!vrp_val_is_min (min ())) 732 1.1 mrg { 733 1.1 mrg tree n = wide_int_to_tree (ttype, wi::to_wide (min ()) - 1); 734 1.1 mrg set (vrp_val_min (ttype), n); 735 1.1 mrg return; 736 1.1 mrg } 737 1.1 mrg set_varying (ttype); 738 1.1 mrg } 739 1.1 mrg 740 1.1 mrg /* Intersect the two value-ranges { *VR0TYPE, *VR0MIN, *VR0MAX } and 741 1.1 mrg { VR1TYPE, VR0MIN, VR0MAX } and store the result 742 1.1 mrg in { *VR0TYPE, *VR0MIN, *VR0MAX }. This may not be the smallest 743 1.1 mrg possible such range. The resulting range is not canonicalized. */ 744 1.1 mrg 745 1.1 mrg static void 746 1.1 mrg intersect_ranges (enum value_range_kind *vr0type, 747 1.1 mrg tree *vr0min, tree *vr0max, 748 1.1 mrg enum value_range_kind vr1type, 749 1.1 mrg tree vr1min, tree vr1max) 750 1.1 mrg { 751 1.1 mrg bool mineq = vrp_operand_equal_p (*vr0min, vr1min); 752 1.1 mrg bool maxeq = vrp_operand_equal_p (*vr0max, vr1max); 753 1.1 mrg 754 1.1 mrg /* [] is vr0, () is vr1 in the following classification comments. */ 755 1.1 mrg if (mineq && maxeq) 756 1.1 mrg { 757 1.1 mrg /* [( )] */ 758 1.1 mrg if (*vr0type == vr1type) 759 1.1 mrg /* Nothing to do for equal ranges. */ 760 1.1 mrg ; 761 1.1 mrg else if ((*vr0type == VR_RANGE 762 1.1 mrg && vr1type == VR_ANTI_RANGE) 763 1.1 mrg || (*vr0type == VR_ANTI_RANGE 764 1.1 mrg && vr1type == VR_RANGE)) 765 1.1 mrg { 766 1.1 mrg /* For anti-range with range intersection the result is empty. */ 767 1.1 mrg *vr0type = VR_UNDEFINED; 768 1.1 mrg *vr0min = NULL_TREE; 769 1.1 mrg *vr0max = NULL_TREE; 770 1.1 mrg } 771 1.1 mrg else 772 1.1 mrg gcc_unreachable (); 773 1.1 mrg } 774 1.1 mrg else if (operand_less_p (*vr0max, vr1min) == 1 775 1.1 mrg || operand_less_p (vr1max, *vr0min) == 1) 776 1.1 mrg { 777 1.1 mrg /* [ ] ( ) or ( ) [ ] 778 1.1 mrg If the ranges have an empty intersection, the result of the 779 1.1 mrg intersect operation is the range for intersecting an 780 1.1 mrg anti-range with a range or empty when intersecting two ranges. */ 781 1.1 mrg if (*vr0type == VR_RANGE 782 1.1 mrg && vr1type == VR_ANTI_RANGE) 783 1.1 mrg ; 784 1.1 mrg else if (*vr0type == VR_ANTI_RANGE 785 1.1 mrg && vr1type == VR_RANGE) 786 1.1 mrg { 787 1.1 mrg *vr0type = vr1type; 788 1.1 mrg *vr0min = vr1min; 789 1.1 mrg *vr0max = vr1max; 790 1.1 mrg } 791 1.1 mrg else if (*vr0type == VR_RANGE 792 1.1 mrg && vr1type == VR_RANGE) 793 1.1 mrg { 794 1.1 mrg *vr0type = VR_UNDEFINED; 795 1.1 mrg *vr0min = NULL_TREE; 796 1.1 mrg *vr0max = NULL_TREE; 797 1.1 mrg } 798 1.1 mrg else if (*vr0type == VR_ANTI_RANGE 799 1.1 mrg && vr1type == VR_ANTI_RANGE) 800 1.1 mrg { 801 1.1 mrg /* If the anti-ranges are adjacent to each other merge them. */ 802 1.1 mrg if (TREE_CODE (*vr0max) == INTEGER_CST 803 1.1 mrg && TREE_CODE (vr1min) == INTEGER_CST 804 1.1 mrg && operand_less_p (*vr0max, vr1min) == 1 805 1.1 mrg && integer_onep (int_const_binop (MINUS_EXPR, 806 1.1 mrg vr1min, *vr0max))) 807 1.1 mrg *vr0max = vr1max; 808 1.1 mrg else if (TREE_CODE (vr1max) == INTEGER_CST 809 1.1 mrg && TREE_CODE (*vr0min) == INTEGER_CST 810 1.1 mrg && operand_less_p (vr1max, *vr0min) == 1 811 1.1 mrg && integer_onep (int_const_binop (MINUS_EXPR, 812 1.1 mrg *vr0min, vr1max))) 813 1.1 mrg *vr0min = vr1min; 814 1.1 mrg /* Else arbitrarily take VR0. */ 815 1.1 mrg } 816 1.1 mrg } 817 1.1 mrg else if ((maxeq || operand_less_p (vr1max, *vr0max) == 1) 818 1.1 mrg && (mineq || operand_less_p (*vr0min, vr1min) == 1)) 819 1.1 mrg { 820 1.1 mrg /* [ ( ) ] or [( ) ] or [ ( )] */ 821 1.1 mrg if (*vr0type == VR_RANGE 822 1.1 mrg && vr1type == VR_RANGE) 823 1.1 mrg { 824 1.1 mrg /* If both are ranges the result is the inner one. */ 825 1.1 mrg *vr0type = vr1type; 826 1.1 mrg *vr0min = vr1min; 827 1.1 mrg *vr0max = vr1max; 828 1.1 mrg } 829 1.1 mrg else if (*vr0type == VR_RANGE 830 1.1 mrg && vr1type == VR_ANTI_RANGE) 831 1.1 mrg { 832 1.1 mrg /* Choose the right gap if the left one is empty. */ 833 1.1 mrg if (mineq) 834 1.1 mrg { 835 1.1 mrg if (TREE_CODE (vr1max) != INTEGER_CST) 836 1.1 mrg *vr0min = vr1max; 837 1.1 mrg else if (TYPE_PRECISION (TREE_TYPE (vr1max)) == 1 838 1.1 mrg && !TYPE_UNSIGNED (TREE_TYPE (vr1max))) 839 1.1 mrg *vr0min 840 1.1 mrg = int_const_binop (MINUS_EXPR, vr1max, 841 1.1 mrg build_int_cst (TREE_TYPE (vr1max), -1)); 842 1.1 mrg else 843 1.1 mrg *vr0min 844 1.1 mrg = int_const_binop (PLUS_EXPR, vr1max, 845 1.1 mrg build_int_cst (TREE_TYPE (vr1max), 1)); 846 1.1 mrg } 847 1.1 mrg /* Choose the left gap if the right one is empty. */ 848 1.1 mrg else if (maxeq) 849 1.1 mrg { 850 1.1 mrg if (TREE_CODE (vr1min) != INTEGER_CST) 851 1.1 mrg *vr0max = vr1min; 852 1.1 mrg else if (TYPE_PRECISION (TREE_TYPE (vr1min)) == 1 853 1.1 mrg && !TYPE_UNSIGNED (TREE_TYPE (vr1min))) 854 1.1 mrg *vr0max 855 1.1 mrg = int_const_binop (PLUS_EXPR, vr1min, 856 1.1 mrg build_int_cst (TREE_TYPE (vr1min), -1)); 857 1.1 mrg else 858 1.1 mrg *vr0max 859 1.1 mrg = int_const_binop (MINUS_EXPR, vr1min, 860 1.1 mrg build_int_cst (TREE_TYPE (vr1min), 1)); 861 1.1 mrg } 862 1.1 mrg /* Choose the anti-range if the range is effectively varying. */ 863 1.1 mrg else if (vrp_val_is_min (*vr0min) 864 1.1 mrg && vrp_val_is_max (*vr0max)) 865 1.1 mrg { 866 1.1 mrg *vr0type = vr1type; 867 1.1 mrg *vr0min = vr1min; 868 1.1 mrg *vr0max = vr1max; 869 1.1 mrg } 870 1.1 mrg /* Else choose the range. */ 871 1.1 mrg } 872 1.1 mrg else if (*vr0type == VR_ANTI_RANGE 873 1.1 mrg && vr1type == VR_ANTI_RANGE) 874 1.1 mrg /* If both are anti-ranges the result is the outer one. */ 875 1.1 mrg ; 876 1.1 mrg else if (*vr0type == VR_ANTI_RANGE 877 1.1 mrg && vr1type == VR_RANGE) 878 1.1 mrg { 879 1.1 mrg /* The intersection is empty. */ 880 1.1 mrg *vr0type = VR_UNDEFINED; 881 1.1 mrg *vr0min = NULL_TREE; 882 1.1 mrg *vr0max = NULL_TREE; 883 1.1 mrg } 884 1.1 mrg else 885 1.1 mrg gcc_unreachable (); 886 1.1 mrg } 887 1.1 mrg else if ((maxeq || operand_less_p (*vr0max, vr1max) == 1) 888 1.1 mrg && (mineq || operand_less_p (vr1min, *vr0min) == 1)) 889 1.1 mrg { 890 1.1 mrg /* ( [ ] ) or ([ ] ) or ( [ ]) */ 891 1.1 mrg if (*vr0type == VR_RANGE 892 1.1 mrg && vr1type == VR_RANGE) 893 1.1 mrg /* Choose the inner range. */ 894 1.1 mrg ; 895 1.1 mrg else if (*vr0type == VR_ANTI_RANGE 896 1.1 mrg && vr1type == VR_RANGE) 897 1.1 mrg { 898 1.1 mrg /* Choose the right gap if the left is empty. */ 899 1.1 mrg if (mineq) 900 1.1 mrg { 901 1.1 mrg *vr0type = VR_RANGE; 902 1.1 mrg if (TREE_CODE (*vr0max) != INTEGER_CST) 903 1.1 mrg *vr0min = *vr0max; 904 1.1 mrg else if (TYPE_PRECISION (TREE_TYPE (*vr0max)) == 1 905 1.1 mrg && !TYPE_UNSIGNED (TREE_TYPE (*vr0max))) 906 1.1 mrg *vr0min 907 1.1 mrg = int_const_binop (MINUS_EXPR, *vr0max, 908 1.1 mrg build_int_cst (TREE_TYPE (*vr0max), -1)); 909 1.1 mrg else 910 1.1 mrg *vr0min 911 1.1 mrg = int_const_binop (PLUS_EXPR, *vr0max, 912 1.1 mrg build_int_cst (TREE_TYPE (*vr0max), 1)); 913 1.1 mrg *vr0max = vr1max; 914 1.1 mrg } 915 1.1 mrg /* Choose the left gap if the right is empty. */ 916 1.1 mrg else if (maxeq) 917 1.1 mrg { 918 1.1 mrg *vr0type = VR_RANGE; 919 1.1 mrg if (TREE_CODE (*vr0min) != INTEGER_CST) 920 1.1 mrg *vr0max = *vr0min; 921 1.1 mrg else if (TYPE_PRECISION (TREE_TYPE (*vr0min)) == 1 922 1.1 mrg && !TYPE_UNSIGNED (TREE_TYPE (*vr0min))) 923 1.1 mrg *vr0max 924 1.1 mrg = int_const_binop (PLUS_EXPR, *vr0min, 925 1.1 mrg build_int_cst (TREE_TYPE (*vr0min), -1)); 926 1.1 mrg else 927 1.1 mrg *vr0max 928 1.1 mrg = int_const_binop (MINUS_EXPR, *vr0min, 929 1.1 mrg build_int_cst (TREE_TYPE (*vr0min), 1)); 930 1.1 mrg *vr0min = vr1min; 931 1.1 mrg } 932 1.1 mrg /* Choose the anti-range if the range is effectively varying. */ 933 1.1 mrg else if (vrp_val_is_min (vr1min) 934 1.1 mrg && vrp_val_is_max (vr1max)) 935 1.1 mrg ; 936 1.1 mrg /* Choose the anti-range if it is ~[0,0], that range is special 937 1.1 mrg enough to special case when vr1's range is relatively wide. 938 1.1 mrg At least for types bigger than int - this covers pointers 939 1.1 mrg and arguments to functions like ctz. */ 940 1.1 mrg else if (*vr0min == *vr0max 941 1.1 mrg && integer_zerop (*vr0min) 942 1.1 mrg && ((TYPE_PRECISION (TREE_TYPE (*vr0min)) 943 1.1 mrg >= TYPE_PRECISION (integer_type_node)) 944 1.1 mrg || POINTER_TYPE_P (TREE_TYPE (*vr0min))) 945 1.1 mrg && TREE_CODE (vr1max) == INTEGER_CST 946 1.1 mrg && TREE_CODE (vr1min) == INTEGER_CST 947 1.1 mrg && (wi::clz (wi::to_wide (vr1max) - wi::to_wide (vr1min)) 948 1.1 mrg < TYPE_PRECISION (TREE_TYPE (*vr0min)) / 2)) 949 1.1 mrg ; 950 1.1 mrg /* Else choose the range. */ 951 1.1 mrg else 952 1.1 mrg { 953 1.1 mrg *vr0type = vr1type; 954 1.1 mrg *vr0min = vr1min; 955 1.1 mrg *vr0max = vr1max; 956 1.1 mrg } 957 1.1 mrg } 958 1.1 mrg else if (*vr0type == VR_ANTI_RANGE 959 1.1 mrg && vr1type == VR_ANTI_RANGE) 960 1.1 mrg { 961 1.1 mrg /* If both are anti-ranges the result is the outer one. */ 962 1.1 mrg *vr0type = vr1type; 963 1.1 mrg *vr0min = vr1min; 964 1.1 mrg *vr0max = vr1max; 965 1.1 mrg } 966 1.1 mrg else if (vr1type == VR_ANTI_RANGE 967 1.1 mrg && *vr0type == VR_RANGE) 968 1.1 mrg { 969 1.1 mrg /* The intersection is empty. */ 970 1.1 mrg *vr0type = VR_UNDEFINED; 971 1.1 mrg *vr0min = NULL_TREE; 972 1.1 mrg *vr0max = NULL_TREE; 973 1.1 mrg } 974 1.1 mrg else 975 1.1 mrg gcc_unreachable (); 976 1.1 mrg } 977 1.1 mrg else if ((operand_less_p (vr1min, *vr0max) == 1 978 1.1 mrg || operand_equal_p (vr1min, *vr0max, 0)) 979 1.1 mrg && operand_less_p (*vr0min, vr1min) == 1 980 1.1 mrg && operand_less_p (*vr0max, vr1max) == 1) 981 1.1 mrg { 982 1.1 mrg /* [ ( ] ) or [ ]( ) */ 983 1.1 mrg if (*vr0type == VR_ANTI_RANGE 984 1.1 mrg && vr1type == VR_ANTI_RANGE) 985 1.1 mrg *vr0max = vr1max; 986 1.1 mrg else if (*vr0type == VR_RANGE 987 1.1 mrg && vr1type == VR_RANGE) 988 1.1 mrg *vr0min = vr1min; 989 1.1 mrg else if (*vr0type == VR_RANGE 990 1.1 mrg && vr1type == VR_ANTI_RANGE) 991 1.1 mrg { 992 1.1 mrg if (TREE_CODE (vr1min) == INTEGER_CST) 993 1.1 mrg *vr0max = int_const_binop (MINUS_EXPR, vr1min, 994 1.1 mrg build_int_cst (TREE_TYPE (vr1min), 1)); 995 1.1 mrg else 996 1.1 mrg *vr0max = vr1min; 997 1.1 mrg } 998 1.1 mrg else if (*vr0type == VR_ANTI_RANGE 999 1.1 mrg && vr1type == VR_RANGE) 1000 1.1 mrg { 1001 1.1 mrg *vr0type = VR_RANGE; 1002 1.1 mrg if (TREE_CODE (*vr0max) == INTEGER_CST) 1003 1.1 mrg *vr0min = int_const_binop (PLUS_EXPR, *vr0max, 1004 1.1 mrg build_int_cst (TREE_TYPE (*vr0max), 1)); 1005 1.1 mrg else 1006 1.1 mrg *vr0min = *vr0max; 1007 1.1 mrg *vr0max = vr1max; 1008 1.1 mrg } 1009 1.1 mrg else 1010 1.1 mrg gcc_unreachable (); 1011 1.1 mrg } 1012 1.1 mrg else if ((operand_less_p (*vr0min, vr1max) == 1 1013 1.1 mrg || operand_equal_p (*vr0min, vr1max, 0)) 1014 1.1 mrg && operand_less_p (vr1min, *vr0min) == 1 1015 1.1 mrg && operand_less_p (vr1max, *vr0max) == 1) 1016 1.1 mrg { 1017 1.1 mrg /* ( [ ) ] or ( )[ ] */ 1018 1.1 mrg if (*vr0type == VR_ANTI_RANGE 1019 1.1 mrg && vr1type == VR_ANTI_RANGE) 1020 1.1 mrg *vr0min = vr1min; 1021 1.1 mrg else if (*vr0type == VR_RANGE 1022 1.1 mrg && vr1type == VR_RANGE) 1023 1.1 mrg *vr0max = vr1max; 1024 1.1 mrg else if (*vr0type == VR_RANGE 1025 1.1 mrg && vr1type == VR_ANTI_RANGE) 1026 1.1 mrg { 1027 1.1 mrg if (TREE_CODE (vr1max) == INTEGER_CST) 1028 1.1 mrg *vr0min = int_const_binop (PLUS_EXPR, vr1max, 1029 1.1 mrg build_int_cst (TREE_TYPE (vr1max), 1)); 1030 1.1 mrg else 1031 1.1 mrg *vr0min = vr1max; 1032 1.1 mrg } 1033 1.1 mrg else if (*vr0type == VR_ANTI_RANGE 1034 1.1 mrg && vr1type == VR_RANGE) 1035 1.1 mrg { 1036 1.1 mrg *vr0type = VR_RANGE; 1037 1.1 mrg if (TREE_CODE (*vr0min) == INTEGER_CST) 1038 1.1 mrg *vr0max = int_const_binop (MINUS_EXPR, *vr0min, 1039 1.1 mrg build_int_cst (TREE_TYPE (*vr0min), 1)); 1040 1.1 mrg else 1041 1.1 mrg *vr0max = *vr0min; 1042 1.1 mrg *vr0min = vr1min; 1043 1.1 mrg } 1044 1.1 mrg else 1045 1.1 mrg gcc_unreachable (); 1046 1.1 mrg } 1047 1.1 mrg 1048 1.1 mrg /* If we know the intersection is empty, there's no need to 1049 1.1 mrg conservatively add anything else to the set. */ 1050 1.1 mrg if (*vr0type == VR_UNDEFINED) 1051 1.1 mrg return; 1052 1.1 mrg 1053 1.1 mrg /* As a fallback simply use { *VRTYPE, *VR0MIN, *VR0MAX } as 1054 1.1 mrg result for the intersection. That's always a conservative 1055 1.1 mrg correct estimate unless VR1 is a constant singleton range 1056 1.1 mrg in which case we choose that. */ 1057 1.1 mrg if (vr1type == VR_RANGE 1058 1.1 mrg && is_gimple_min_invariant (vr1min) 1059 1.1 mrg && vrp_operand_equal_p (vr1min, vr1max)) 1060 1.1 mrg { 1061 1.1 mrg *vr0type = vr1type; 1062 1.1 mrg *vr0min = vr1min; 1063 1.1 mrg *vr0max = vr1max; 1064 1.1 mrg } 1065 1.1 mrg } 1066 1.1 mrg 1067 1.1 mrg /* Helper for the intersection operation for value ranges. Given two 1068 1.1.1.2 mrg ranges VR0 and VR1, set VR0 to the intersection of both ranges. 1069 1.1.1.2 mrg This may not be the smallest possible such range. */ 1070 1.1 mrg 1071 1.1.1.2 mrg void 1072 1.1.1.2 mrg irange::legacy_intersect (irange *vr0, const irange *vr1) 1073 1.1 mrg { 1074 1.1.1.2 mrg gcc_checking_assert (vr0->legacy_mode_p ()); 1075 1.1.1.2 mrg gcc_checking_assert (vr1->legacy_mode_p ()); 1076 1.1 mrg /* If either range is VR_VARYING the other one wins. */ 1077 1.1 mrg if (vr1->varying_p ()) 1078 1.1.1.2 mrg return; 1079 1.1 mrg if (vr0->varying_p ()) 1080 1.1.1.2 mrg { 1081 1.1.1.2 mrg vr0->set (vr1->min (), vr1->max (), vr1->kind ()); 1082 1.1.1.2 mrg return; 1083 1.1.1.2 mrg } 1084 1.1 mrg 1085 1.1 mrg /* When either range is VR_UNDEFINED the resulting range is 1086 1.1 mrg VR_UNDEFINED, too. */ 1087 1.1 mrg if (vr0->undefined_p ()) 1088 1.1.1.2 mrg return; 1089 1.1 mrg if (vr1->undefined_p ()) 1090 1.1.1.2 mrg { 1091 1.1.1.2 mrg vr0->set_undefined (); 1092 1.1.1.2 mrg return; 1093 1.1.1.2 mrg } 1094 1.1 mrg 1095 1.1 mrg value_range_kind vr0kind = vr0->kind (); 1096 1.1 mrg tree vr0min = vr0->min (); 1097 1.1 mrg tree vr0max = vr0->max (); 1098 1.1.1.2 mrg 1099 1.1 mrg intersect_ranges (&vr0kind, &vr0min, &vr0max, 1100 1.1 mrg vr1->kind (), vr1->min (), vr1->max ()); 1101 1.1.1.2 mrg 1102 1.1 mrg /* Make sure to canonicalize the result though as the inversion of a 1103 1.1.1.2 mrg VR_RANGE can still be a VR_RANGE. */ 1104 1.1 mrg if (vr0kind == VR_UNDEFINED) 1105 1.1.1.2 mrg vr0->set_undefined (); 1106 1.1 mrg else if (vr0kind == VR_VARYING) 1107 1.1.1.2 mrg { 1108 1.1.1.2 mrg /* If we failed, use the original VR0. */ 1109 1.1.1.2 mrg return; 1110 1.1.1.2 mrg } 1111 1.1 mrg else 1112 1.1.1.2 mrg vr0->set (vr0min, vr0max, vr0kind); 1113 1.1 mrg } 1114 1.1 mrg 1115 1.1 mrg /* Union the two value-ranges { *VR0TYPE, *VR0MIN, *VR0MAX } and 1116 1.1 mrg { VR1TYPE, VR0MIN, VR0MAX } and store the result 1117 1.1 mrg in { *VR0TYPE, *VR0MIN, *VR0MAX }. This may not be the smallest 1118 1.1 mrg possible such range. The resulting range is not canonicalized. */ 1119 1.1 mrg 1120 1.1 mrg static void 1121 1.1 mrg union_ranges (enum value_range_kind *vr0type, 1122 1.1 mrg tree *vr0min, tree *vr0max, 1123 1.1 mrg enum value_range_kind vr1type, 1124 1.1 mrg tree vr1min, tree vr1max) 1125 1.1 mrg { 1126 1.1 mrg int cmpmin = compare_values (*vr0min, vr1min); 1127 1.1 mrg int cmpmax = compare_values (*vr0max, vr1max); 1128 1.1 mrg bool mineq = cmpmin == 0; 1129 1.1 mrg bool maxeq = cmpmax == 0; 1130 1.1 mrg 1131 1.1 mrg /* [] is vr0, () is vr1 in the following classification comments. */ 1132 1.1 mrg if (mineq && maxeq) 1133 1.1 mrg { 1134 1.1 mrg /* [( )] */ 1135 1.1 mrg if (*vr0type == vr1type) 1136 1.1 mrg /* Nothing to do for equal ranges. */ 1137 1.1 mrg ; 1138 1.1 mrg else if ((*vr0type == VR_RANGE 1139 1.1 mrg && vr1type == VR_ANTI_RANGE) 1140 1.1 mrg || (*vr0type == VR_ANTI_RANGE 1141 1.1 mrg && vr1type == VR_RANGE)) 1142 1.1 mrg { 1143 1.1 mrg /* For anti-range with range union the result is varying. */ 1144 1.1 mrg goto give_up; 1145 1.1 mrg } 1146 1.1 mrg else 1147 1.1 mrg gcc_unreachable (); 1148 1.1 mrg } 1149 1.1 mrg else if (operand_less_p (*vr0max, vr1min) == 1 1150 1.1 mrg || operand_less_p (vr1max, *vr0min) == 1) 1151 1.1 mrg { 1152 1.1 mrg /* [ ] ( ) or ( ) [ ] 1153 1.1 mrg If the ranges have an empty intersection, result of the union 1154 1.1 mrg operation is the anti-range or if both are anti-ranges 1155 1.1 mrg it covers all. */ 1156 1.1 mrg if (*vr0type == VR_ANTI_RANGE 1157 1.1 mrg && vr1type == VR_ANTI_RANGE) 1158 1.1 mrg goto give_up; 1159 1.1 mrg else if (*vr0type == VR_ANTI_RANGE 1160 1.1 mrg && vr1type == VR_RANGE) 1161 1.1 mrg ; 1162 1.1 mrg else if (*vr0type == VR_RANGE 1163 1.1 mrg && vr1type == VR_ANTI_RANGE) 1164 1.1 mrg { 1165 1.1 mrg *vr0type = vr1type; 1166 1.1 mrg *vr0min = vr1min; 1167 1.1 mrg *vr0max = vr1max; 1168 1.1 mrg } 1169 1.1 mrg else if (*vr0type == VR_RANGE 1170 1.1 mrg && vr1type == VR_RANGE) 1171 1.1 mrg { 1172 1.1 mrg /* The result is the convex hull of both ranges. */ 1173 1.1 mrg if (operand_less_p (*vr0max, vr1min) == 1) 1174 1.1 mrg { 1175 1.1 mrg /* If the result can be an anti-range, create one. */ 1176 1.1 mrg if (TREE_CODE (*vr0max) == INTEGER_CST 1177 1.1 mrg && TREE_CODE (vr1min) == INTEGER_CST 1178 1.1 mrg && vrp_val_is_min (*vr0min) 1179 1.1 mrg && vrp_val_is_max (vr1max)) 1180 1.1 mrg { 1181 1.1 mrg tree min = int_const_binop (PLUS_EXPR, 1182 1.1 mrg *vr0max, 1183 1.1 mrg build_int_cst (TREE_TYPE (*vr0max), 1)); 1184 1.1 mrg tree max = int_const_binop (MINUS_EXPR, 1185 1.1 mrg vr1min, 1186 1.1 mrg build_int_cst (TREE_TYPE (vr1min), 1)); 1187 1.1 mrg if (!operand_less_p (max, min)) 1188 1.1 mrg { 1189 1.1 mrg *vr0type = VR_ANTI_RANGE; 1190 1.1 mrg *vr0min = min; 1191 1.1 mrg *vr0max = max; 1192 1.1 mrg } 1193 1.1 mrg else 1194 1.1 mrg *vr0max = vr1max; 1195 1.1 mrg } 1196 1.1 mrg else 1197 1.1 mrg *vr0max = vr1max; 1198 1.1 mrg } 1199 1.1 mrg else 1200 1.1 mrg { 1201 1.1 mrg /* If the result can be an anti-range, create one. */ 1202 1.1 mrg if (TREE_CODE (vr1max) == INTEGER_CST 1203 1.1 mrg && TREE_CODE (*vr0min) == INTEGER_CST 1204 1.1 mrg && vrp_val_is_min (vr1min) 1205 1.1 mrg && vrp_val_is_max (*vr0max)) 1206 1.1 mrg { 1207 1.1 mrg tree min = int_const_binop (PLUS_EXPR, 1208 1.1 mrg vr1max, 1209 1.1 mrg build_int_cst (TREE_TYPE (vr1max), 1)); 1210 1.1 mrg tree max = int_const_binop (MINUS_EXPR, 1211 1.1 mrg *vr0min, 1212 1.1 mrg build_int_cst (TREE_TYPE (*vr0min), 1)); 1213 1.1 mrg if (!operand_less_p (max, min)) 1214 1.1 mrg { 1215 1.1 mrg *vr0type = VR_ANTI_RANGE; 1216 1.1 mrg *vr0min = min; 1217 1.1 mrg *vr0max = max; 1218 1.1 mrg } 1219 1.1 mrg else 1220 1.1 mrg *vr0min = vr1min; 1221 1.1 mrg } 1222 1.1 mrg else 1223 1.1 mrg *vr0min = vr1min; 1224 1.1 mrg } 1225 1.1 mrg } 1226 1.1 mrg else 1227 1.1 mrg gcc_unreachable (); 1228 1.1 mrg } 1229 1.1 mrg else if ((maxeq || cmpmax == 1) 1230 1.1 mrg && (mineq || cmpmin == -1)) 1231 1.1 mrg { 1232 1.1 mrg /* [ ( ) ] or [( ) ] or [ ( )] */ 1233 1.1 mrg if (*vr0type == VR_RANGE 1234 1.1 mrg && vr1type == VR_RANGE) 1235 1.1 mrg ; 1236 1.1 mrg else if (*vr0type == VR_ANTI_RANGE 1237 1.1 mrg && vr1type == VR_ANTI_RANGE) 1238 1.1 mrg { 1239 1.1 mrg *vr0type = vr1type; 1240 1.1 mrg *vr0min = vr1min; 1241 1.1 mrg *vr0max = vr1max; 1242 1.1 mrg } 1243 1.1 mrg else if (*vr0type == VR_ANTI_RANGE 1244 1.1 mrg && vr1type == VR_RANGE) 1245 1.1 mrg { 1246 1.1 mrg /* Arbitrarily choose the right or left gap. */ 1247 1.1 mrg if (!mineq && TREE_CODE (vr1min) == INTEGER_CST) 1248 1.1 mrg *vr0max = int_const_binop (MINUS_EXPR, vr1min, 1249 1.1 mrg build_int_cst (TREE_TYPE (vr1min), 1)); 1250 1.1 mrg else if (!maxeq && TREE_CODE (vr1max) == INTEGER_CST) 1251 1.1 mrg *vr0min = int_const_binop (PLUS_EXPR, vr1max, 1252 1.1 mrg build_int_cst (TREE_TYPE (vr1max), 1)); 1253 1.1 mrg else 1254 1.1 mrg goto give_up; 1255 1.1 mrg } 1256 1.1 mrg else if (*vr0type == VR_RANGE 1257 1.1 mrg && vr1type == VR_ANTI_RANGE) 1258 1.1 mrg /* The result covers everything. */ 1259 1.1 mrg goto give_up; 1260 1.1 mrg else 1261 1.1 mrg gcc_unreachable (); 1262 1.1 mrg } 1263 1.1 mrg else if ((maxeq || cmpmax == -1) 1264 1.1 mrg && (mineq || cmpmin == 1)) 1265 1.1 mrg { 1266 1.1 mrg /* ( [ ] ) or ([ ] ) or ( [ ]) */ 1267 1.1 mrg if (*vr0type == VR_RANGE 1268 1.1 mrg && vr1type == VR_RANGE) 1269 1.1 mrg { 1270 1.1 mrg *vr0type = vr1type; 1271 1.1 mrg *vr0min = vr1min; 1272 1.1 mrg *vr0max = vr1max; 1273 1.1 mrg } 1274 1.1 mrg else if (*vr0type == VR_ANTI_RANGE 1275 1.1 mrg && vr1type == VR_ANTI_RANGE) 1276 1.1 mrg ; 1277 1.1 mrg else if (*vr0type == VR_RANGE 1278 1.1 mrg && vr1type == VR_ANTI_RANGE) 1279 1.1 mrg { 1280 1.1 mrg *vr0type = VR_ANTI_RANGE; 1281 1.1 mrg if (!mineq && TREE_CODE (*vr0min) == INTEGER_CST) 1282 1.1 mrg { 1283 1.1 mrg *vr0max = int_const_binop (MINUS_EXPR, *vr0min, 1284 1.1 mrg build_int_cst (TREE_TYPE (*vr0min), 1)); 1285 1.1 mrg *vr0min = vr1min; 1286 1.1 mrg } 1287 1.1 mrg else if (!maxeq && TREE_CODE (*vr0max) == INTEGER_CST) 1288 1.1 mrg { 1289 1.1 mrg *vr0min = int_const_binop (PLUS_EXPR, *vr0max, 1290 1.1 mrg build_int_cst (TREE_TYPE (*vr0max), 1)); 1291 1.1 mrg *vr0max = vr1max; 1292 1.1 mrg } 1293 1.1 mrg else 1294 1.1 mrg goto give_up; 1295 1.1 mrg } 1296 1.1 mrg else if (*vr0type == VR_ANTI_RANGE 1297 1.1 mrg && vr1type == VR_RANGE) 1298 1.1 mrg /* The result covers everything. */ 1299 1.1 mrg goto give_up; 1300 1.1 mrg else 1301 1.1 mrg gcc_unreachable (); 1302 1.1 mrg } 1303 1.1 mrg else if (cmpmin == -1 1304 1.1 mrg && cmpmax == -1 1305 1.1 mrg && (operand_less_p (vr1min, *vr0max) == 1 1306 1.1 mrg || operand_equal_p (vr1min, *vr0max, 0))) 1307 1.1 mrg { 1308 1.1 mrg /* [ ( ] ) or [ ]( ) */ 1309 1.1 mrg if (*vr0type == VR_RANGE 1310 1.1 mrg && vr1type == VR_RANGE) 1311 1.1 mrg *vr0max = vr1max; 1312 1.1 mrg else if (*vr0type == VR_ANTI_RANGE 1313 1.1 mrg && vr1type == VR_ANTI_RANGE) 1314 1.1 mrg *vr0min = vr1min; 1315 1.1 mrg else if (*vr0type == VR_ANTI_RANGE 1316 1.1 mrg && vr1type == VR_RANGE) 1317 1.1 mrg { 1318 1.1 mrg if (TREE_CODE (vr1min) == INTEGER_CST) 1319 1.1 mrg *vr0max = int_const_binop (MINUS_EXPR, vr1min, 1320 1.1 mrg build_int_cst (TREE_TYPE (vr1min), 1)); 1321 1.1 mrg else 1322 1.1 mrg goto give_up; 1323 1.1 mrg } 1324 1.1 mrg else if (*vr0type == VR_RANGE 1325 1.1 mrg && vr1type == VR_ANTI_RANGE) 1326 1.1 mrg { 1327 1.1 mrg if (TREE_CODE (*vr0max) == INTEGER_CST) 1328 1.1 mrg { 1329 1.1 mrg *vr0type = vr1type; 1330 1.1 mrg *vr0min = int_const_binop (PLUS_EXPR, *vr0max, 1331 1.1 mrg build_int_cst (TREE_TYPE (*vr0max), 1)); 1332 1.1 mrg *vr0max = vr1max; 1333 1.1 mrg } 1334 1.1 mrg else 1335 1.1 mrg goto give_up; 1336 1.1 mrg } 1337 1.1 mrg else 1338 1.1 mrg gcc_unreachable (); 1339 1.1 mrg } 1340 1.1 mrg else if (cmpmin == 1 1341 1.1 mrg && cmpmax == 1 1342 1.1 mrg && (operand_less_p (*vr0min, vr1max) == 1 1343 1.1 mrg || operand_equal_p (*vr0min, vr1max, 0))) 1344 1.1 mrg { 1345 1.1 mrg /* ( [ ) ] or ( )[ ] */ 1346 1.1 mrg if (*vr0type == VR_RANGE 1347 1.1 mrg && vr1type == VR_RANGE) 1348 1.1 mrg *vr0min = vr1min; 1349 1.1 mrg else if (*vr0type == VR_ANTI_RANGE 1350 1.1 mrg && vr1type == VR_ANTI_RANGE) 1351 1.1 mrg *vr0max = vr1max; 1352 1.1 mrg else if (*vr0type == VR_ANTI_RANGE 1353 1.1 mrg && vr1type == VR_RANGE) 1354 1.1 mrg { 1355 1.1 mrg if (TREE_CODE (vr1max) == INTEGER_CST) 1356 1.1 mrg *vr0min = int_const_binop (PLUS_EXPR, vr1max, 1357 1.1 mrg build_int_cst (TREE_TYPE (vr1max), 1)); 1358 1.1 mrg else 1359 1.1 mrg goto give_up; 1360 1.1 mrg } 1361 1.1 mrg else if (*vr0type == VR_RANGE 1362 1.1 mrg && vr1type == VR_ANTI_RANGE) 1363 1.1 mrg { 1364 1.1 mrg if (TREE_CODE (*vr0min) == INTEGER_CST) 1365 1.1 mrg { 1366 1.1 mrg *vr0type = vr1type; 1367 1.1 mrg *vr0max = int_const_binop (MINUS_EXPR, *vr0min, 1368 1.1 mrg build_int_cst (TREE_TYPE (*vr0min), 1)); 1369 1.1 mrg *vr0min = vr1min; 1370 1.1 mrg } 1371 1.1 mrg else 1372 1.1 mrg goto give_up; 1373 1.1 mrg } 1374 1.1 mrg else 1375 1.1 mrg gcc_unreachable (); 1376 1.1 mrg } 1377 1.1 mrg else 1378 1.1 mrg goto give_up; 1379 1.1 mrg 1380 1.1 mrg return; 1381 1.1 mrg 1382 1.1 mrg give_up: 1383 1.1 mrg *vr0type = VR_VARYING; 1384 1.1 mrg *vr0min = NULL_TREE; 1385 1.1 mrg *vr0max = NULL_TREE; 1386 1.1 mrg } 1387 1.1 mrg 1388 1.1.1.2 mrg /* Helper for meet operation for value ranges. Given two ranges VR0 1389 1.1.1.2 mrg and VR1, set VR0 to the union of both ranges. This may not be the 1390 1.1 mrg smallest possible such range. */ 1391 1.1 mrg 1392 1.1.1.2 mrg void 1393 1.1.1.2 mrg irange::legacy_union (irange *vr0, const irange *vr1) 1394 1.1 mrg { 1395 1.1.1.2 mrg gcc_checking_assert (vr0->legacy_mode_p ()); 1396 1.1.1.2 mrg gcc_checking_assert (vr1->legacy_mode_p ()); 1397 1.1.1.2 mrg 1398 1.1 mrg /* VR0 has the resulting range if VR1 is undefined or VR0 is varying. */ 1399 1.1 mrg if (vr1->undefined_p () 1400 1.1 mrg || vr0->varying_p ()) 1401 1.1.1.2 mrg return; 1402 1.1 mrg 1403 1.1 mrg /* VR1 has the resulting range if VR0 is undefined or VR1 is varying. */ 1404 1.1.1.2 mrg if (vr0->undefined_p ()) 1405 1.1.1.2 mrg { 1406 1.1.1.2 mrg vr0->set (vr1->min (), vr1->max (), vr1->kind ()); 1407 1.1.1.2 mrg return; 1408 1.1.1.2 mrg } 1409 1.1.1.2 mrg 1410 1.1.1.2 mrg if (vr1->varying_p ()) 1411 1.1.1.2 mrg { 1412 1.1.1.2 mrg vr0->set_varying (vr1->type ()); 1413 1.1.1.2 mrg return; 1414 1.1.1.2 mrg } 1415 1.1 mrg 1416 1.1 mrg value_range_kind vr0kind = vr0->kind (); 1417 1.1 mrg tree vr0min = vr0->min (); 1418 1.1 mrg tree vr0max = vr0->max (); 1419 1.1.1.2 mrg 1420 1.1 mrg union_ranges (&vr0kind, &vr0min, &vr0max, 1421 1.1 mrg vr1->kind (), vr1->min (), vr1->max ()); 1422 1.1 mrg 1423 1.1 mrg if (vr0kind == VR_UNDEFINED) 1424 1.1.1.2 mrg vr0->set_undefined (); 1425 1.1 mrg else if (vr0kind == VR_VARYING) 1426 1.1 mrg { 1427 1.1.1.2 mrg /* Failed to find an efficient meet. Before giving up and 1428 1.1.1.2 mrg setting the result to VARYING, see if we can at least derive 1429 1.1.1.2 mrg a non-zero range. */ 1430 1.1.1.2 mrg if (range_includes_zero_p (vr0) == 0 1431 1.1.1.2 mrg && range_includes_zero_p (vr1) == 0) 1432 1.1.1.2 mrg vr0->set_nonzero (vr0->type ()); 1433 1.1.1.2 mrg else 1434 1.1.1.2 mrg vr0->set_varying (vr0->type ()); 1435 1.1 mrg } 1436 1.1.1.2 mrg else 1437 1.1.1.2 mrg vr0->set (vr0min, vr0max, vr0kind); 1438 1.1 mrg } 1439 1.1 mrg 1440 1.1 mrg /* Meet operation for value ranges. Given two value ranges VR0 and 1441 1.1 mrg VR1, store in VR0 a range that contains both VR0 and VR1. This 1442 1.1 mrg may not be the smallest possible such range. */ 1443 1.1 mrg 1444 1.1 mrg void 1445 1.1.1.2 mrg irange::union_ (const irange *other) 1446 1.1 mrg { 1447 1.1.1.2 mrg if (legacy_mode_p ()) 1448 1.1 mrg { 1449 1.1.1.2 mrg if (!other->legacy_mode_p ()) 1450 1.1.1.2 mrg { 1451 1.1.1.2 mrg int_range<1> tmp = *other; 1452 1.1.1.2 mrg legacy_union (this, &tmp); 1453 1.1.1.2 mrg return; 1454 1.1.1.2 mrg } 1455 1.1.1.2 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1456 1.1.1.2 mrg { 1457 1.1.1.2 mrg fprintf (dump_file, "Meeting\n "); 1458 1.1.1.2 mrg dump_value_range (dump_file, this); 1459 1.1.1.2 mrg fprintf (dump_file, "\nand\n "); 1460 1.1.1.2 mrg dump_value_range (dump_file, other); 1461 1.1.1.2 mrg fprintf (dump_file, "\n"); 1462 1.1.1.2 mrg } 1463 1.1 mrg 1464 1.1.1.2 mrg legacy_union (this, other); 1465 1.1 mrg 1466 1.1.1.2 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1467 1.1.1.2 mrg { 1468 1.1.1.2 mrg fprintf (dump_file, "to\n "); 1469 1.1.1.2 mrg dump_value_range (dump_file, this); 1470 1.1.1.2 mrg fprintf (dump_file, "\n"); 1471 1.1.1.2 mrg } 1472 1.1.1.2 mrg return; 1473 1.1.1.2 mrg } 1474 1.1.1.2 mrg 1475 1.1.1.2 mrg if (other->legacy_mode_p ()) 1476 1.1 mrg { 1477 1.1.1.2 mrg int_range<2> wider = *other; 1478 1.1.1.2 mrg irange_union (wider); 1479 1.1 mrg } 1480 1.1.1.2 mrg else 1481 1.1.1.2 mrg irange_union (*other); 1482 1.1 mrg } 1483 1.1 mrg 1484 1.1 mrg void 1485 1.1.1.2 mrg irange::intersect (const irange *other) 1486 1.1 mrg { 1487 1.1.1.2 mrg if (legacy_mode_p ()) 1488 1.1.1.2 mrg { 1489 1.1.1.2 mrg if (!other->legacy_mode_p ()) 1490 1.1.1.2 mrg { 1491 1.1.1.2 mrg int_range<1> tmp = *other; 1492 1.1.1.2 mrg legacy_intersect (this, &tmp); 1493 1.1.1.2 mrg return; 1494 1.1.1.2 mrg } 1495 1.1.1.2 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1496 1.1.1.2 mrg { 1497 1.1.1.2 mrg fprintf (dump_file, "Intersecting\n "); 1498 1.1.1.2 mrg dump_value_range (dump_file, this); 1499 1.1.1.2 mrg fprintf (dump_file, "\nand\n "); 1500 1.1.1.2 mrg dump_value_range (dump_file, other); 1501 1.1.1.2 mrg fprintf (dump_file, "\n"); 1502 1.1.1.2 mrg } 1503 1.1.1.2 mrg 1504 1.1.1.2 mrg legacy_intersect (this, other); 1505 1.1.1.2 mrg 1506 1.1.1.2 mrg if (dump_file && (dump_flags & TDF_DETAILS)) 1507 1.1.1.2 mrg { 1508 1.1.1.2 mrg fprintf (dump_file, "to\n "); 1509 1.1.1.2 mrg dump_value_range (dump_file, this); 1510 1.1.1.2 mrg fprintf (dump_file, "\n"); 1511 1.1.1.2 mrg } 1512 1.1.1.2 mrg return; 1513 1.1.1.2 mrg } 1514 1.1.1.2 mrg 1515 1.1.1.2 mrg if (other->legacy_mode_p ()) 1516 1.1.1.2 mrg { 1517 1.1.1.2 mrg int_range<2> wider; 1518 1.1.1.2 mrg wider = *other; 1519 1.1.1.2 mrg irange_intersect (wider); 1520 1.1.1.2 mrg } 1521 1.1.1.2 mrg else 1522 1.1.1.2 mrg irange_intersect (*other); 1523 1.1 mrg } 1524 1.1 mrg 1525 1.1.1.2 mrg // union_ for multi-ranges. 1526 1.1.1.2 mrg 1527 1.1 mrg void 1528 1.1.1.2 mrg irange::irange_union (const irange &r) 1529 1.1 mrg { 1530 1.1.1.2 mrg gcc_checking_assert (!legacy_mode_p () && !r.legacy_mode_p ()); 1531 1.1.1.2 mrg 1532 1.1.1.2 mrg if (r.undefined_p () || varying_p ()) 1533 1.1.1.2 mrg return; 1534 1.1.1.2 mrg 1535 1.1.1.2 mrg if (undefined_p () || r.varying_p ()) 1536 1.1.1.2 mrg { 1537 1.1.1.2 mrg operator= (r); 1538 1.1.1.2 mrg return; 1539 1.1.1.2 mrg } 1540 1.1.1.2 mrg 1541 1.1.1.2 mrg // Do not worry about merging and such by reserving twice as many 1542 1.1.1.2 mrg // pairs as needed, and then simply sort the 2 ranges into this 1543 1.1.1.2 mrg // intermediate form. 1544 1.1.1.2 mrg // 1545 1.1.1.2 mrg // The intermediate result will have the property that the beginning 1546 1.1.1.2 mrg // of each range is <= the beginning of the next range. There may 1547 1.1.1.2 mrg // be overlapping ranges at this point. I.e. this would be valid 1548 1.1.1.2 mrg // [-20, 10], [-10, 0], [0, 20], [40, 90] as it satisfies this 1549 1.1.1.2 mrg // contraint : -20 < -10 < 0 < 40. When the range is rebuilt into r, 1550 1.1.1.2 mrg // the merge is performed. 1551 1.1.1.2 mrg // 1552 1.1.1.2 mrg // [Xi,Yi]..[Xn,Yn] U [Xj,Yj]..[Xm,Ym] --> [Xk,Yk]..[Xp,Yp] 1553 1.1.1.2 mrg auto_vec<tree, 20> res (m_num_ranges * 2 + r.m_num_ranges * 2); 1554 1.1.1.2 mrg unsigned i = 0, j = 0, k = 0; 1555 1.1.1.2 mrg 1556 1.1.1.2 mrg while (i < m_num_ranges * 2 && j < r.m_num_ranges * 2) 1557 1.1.1.2 mrg { 1558 1.1.1.2 mrg // lower of Xi and Xj is the lowest point. 1559 1.1.1.2 mrg if (wi::to_widest (m_base[i]) <= wi::to_widest (r.m_base[j])) 1560 1.1.1.2 mrg { 1561 1.1.1.2 mrg res.quick_push (m_base[i]); 1562 1.1.1.2 mrg res.quick_push (m_base[i + 1]); 1563 1.1.1.2 mrg k += 2; 1564 1.1.1.2 mrg i += 2; 1565 1.1.1.2 mrg } 1566 1.1.1.2 mrg else 1567 1.1.1.2 mrg { 1568 1.1.1.2 mrg res.quick_push (r.m_base[j]); 1569 1.1.1.2 mrg res.quick_push (r.m_base[j + 1]); 1570 1.1.1.2 mrg k += 2; 1571 1.1.1.2 mrg j += 2; 1572 1.1.1.2 mrg } 1573 1.1.1.2 mrg } 1574 1.1.1.2 mrg for ( ; i < m_num_ranges * 2; i += 2) 1575 1.1.1.2 mrg { 1576 1.1.1.2 mrg res.quick_push (m_base[i]); 1577 1.1.1.2 mrg res.quick_push (m_base[i + 1]); 1578 1.1.1.2 mrg k += 2; 1579 1.1.1.2 mrg } 1580 1.1.1.2 mrg for ( ; j < r.m_num_ranges * 2; j += 2) 1581 1.1 mrg { 1582 1.1.1.2 mrg res.quick_push (r.m_base[j]); 1583 1.1.1.2 mrg res.quick_push (r.m_base[j + 1]); 1584 1.1.1.2 mrg k += 2; 1585 1.1 mrg } 1586 1.1 mrg 1587 1.1.1.2 mrg // Now normalize the vector removing any overlaps. 1588 1.1.1.2 mrg i = 2; 1589 1.1.1.2 mrg for (j = 2; j < k ; j += 2) 1590 1.1.1.2 mrg { 1591 1.1.1.2 mrg // Current upper+1 is >= lower bound next pair, then we merge ranges. 1592 1.1.1.2 mrg if (wi::to_widest (res[i - 1]) + 1 >= wi::to_widest (res[j])) 1593 1.1.1.2 mrg { 1594 1.1.1.2 mrg // New upper bounds is greater of current or the next one. 1595 1.1.1.2 mrg if (wi::to_widest (res[j + 1]) > wi::to_widest (res[i - 1])) 1596 1.1.1.2 mrg res[i - 1] = res[j + 1]; 1597 1.1.1.2 mrg } 1598 1.1.1.2 mrg else 1599 1.1.1.2 mrg { 1600 1.1.1.2 mrg // This is a new distinct range, but no point in copying it 1601 1.1.1.2 mrg // if it is already in the right place. 1602 1.1.1.2 mrg if (i != j) 1603 1.1.1.2 mrg { 1604 1.1.1.2 mrg res[i++] = res[j]; 1605 1.1.1.2 mrg res[i++] = res[j + 1]; 1606 1.1.1.2 mrg } 1607 1.1.1.2 mrg else 1608 1.1.1.2 mrg i += 2; 1609 1.1.1.2 mrg } 1610 1.1.1.2 mrg } 1611 1.1 mrg 1612 1.1.1.2 mrg // At this point, the vector should have i ranges, none overlapping. 1613 1.1.1.2 mrg // Now it simply needs to be copied, and if there are too many 1614 1.1.1.2 mrg // ranges, merge some. We wont do any analysis as to what the 1615 1.1.1.2 mrg // "best" merges are, simply combine the final ranges into one. 1616 1.1.1.2 mrg if (i > m_max_ranges * 2) 1617 1.1 mrg { 1618 1.1.1.2 mrg res[m_max_ranges * 2 - 1] = res[i - 1]; 1619 1.1.1.2 mrg i = m_max_ranges * 2; 1620 1.1 mrg } 1621 1.1 mrg 1622 1.1.1.2 mrg for (j = 0; j < i ; j++) 1623 1.1.1.2 mrg m_base[j] = res [j]; 1624 1.1.1.2 mrg m_num_ranges = i / 2; 1625 1.1 mrg 1626 1.1.1.2 mrg m_kind = VR_RANGE; 1627 1.1.1.2 mrg normalize_kind (); 1628 1.1.1.2 mrg 1629 1.1.1.2 mrg if (flag_checking) 1630 1.1.1.2 mrg verify_range (); 1631 1.1 mrg } 1632 1.1 mrg 1633 1.1.1.2 mrg // intersect for multi-ranges. 1634 1.1 mrg 1635 1.1 mrg void 1636 1.1.1.2 mrg irange::irange_intersect (const irange &r) 1637 1.1 mrg { 1638 1.1.1.2 mrg gcc_checking_assert (!legacy_mode_p () && !r.legacy_mode_p ()); 1639 1.1.1.2 mrg gcc_checking_assert (undefined_p () || r.undefined_p () 1640 1.1.1.2 mrg || range_compatible_p (type (), r.type ())); 1641 1.1.1.2 mrg 1642 1.1.1.2 mrg if (undefined_p () || r.varying_p ()) 1643 1.1.1.2 mrg return; 1644 1.1.1.2 mrg if (r.undefined_p ()) 1645 1.1.1.2 mrg { 1646 1.1.1.2 mrg set_undefined (); 1647 1.1.1.2 mrg return; 1648 1.1.1.2 mrg } 1649 1.1.1.2 mrg if (varying_p ()) 1650 1.1.1.2 mrg { 1651 1.1.1.2 mrg operator= (r); 1652 1.1.1.2 mrg return; 1653 1.1.1.2 mrg } 1654 1.1.1.2 mrg 1655 1.1.1.2 mrg if (r.num_pairs () == 1) 1656 1.1.1.2 mrg { 1657 1.1.1.2 mrg // R cannot be undefined, use more efficent pair routine. 1658 1.1.1.2 mrg intersect (r.lower_bound(), r.upper_bound ()); 1659 1.1.1.2 mrg return; 1660 1.1.1.2 mrg } 1661 1.1.1.2 mrg 1662 1.1.1.2 mrg signop sign = TYPE_SIGN (TREE_TYPE(m_base[0])); 1663 1.1.1.2 mrg unsigned bld_pair = 0; 1664 1.1.1.2 mrg unsigned bld_lim = m_max_ranges; 1665 1.1.1.2 mrg int_range_max r2 (*this); 1666 1.1.1.2 mrg unsigned r2_lim = r2.num_pairs (); 1667 1.1.1.2 mrg unsigned i2 = 0; 1668 1.1.1.2 mrg for (unsigned i = 0; i < r.num_pairs (); ) 1669 1.1.1.2 mrg { 1670 1.1.1.2 mrg // If r1's upper is < r2's lower, we can skip r1's pair. 1671 1.1.1.2 mrg tree ru = r.m_base[i * 2 + 1]; 1672 1.1.1.2 mrg tree r2l = r2.m_base[i2 * 2]; 1673 1.1.1.2 mrg if (wi::lt_p (wi::to_wide (ru), wi::to_wide (r2l), sign)) 1674 1.1.1.2 mrg { 1675 1.1.1.2 mrg i++; 1676 1.1.1.2 mrg continue; 1677 1.1.1.2 mrg } 1678 1.1.1.2 mrg // Likewise, skip r2's pair if its excluded. 1679 1.1.1.2 mrg tree r2u = r2.m_base[i2 * 2 + 1]; 1680 1.1.1.2 mrg tree rl = r.m_base[i * 2]; 1681 1.1.1.2 mrg if (wi::lt_p (wi::to_wide (r2u), wi::to_wide (rl), sign)) 1682 1.1.1.2 mrg { 1683 1.1.1.2 mrg i2++; 1684 1.1.1.2 mrg if (i2 < r2_lim) 1685 1.1.1.2 mrg continue; 1686 1.1.1.2 mrg // No more r2, break. 1687 1.1.1.2 mrg break; 1688 1.1.1.2 mrg } 1689 1.1.1.2 mrg 1690 1.1.1.2 mrg // Must be some overlap. Find the highest of the lower bounds, 1691 1.1.1.2 mrg // and set it, unless the build limits lower bounds is already 1692 1.1.1.2 mrg // set. 1693 1.1.1.2 mrg if (bld_pair < bld_lim) 1694 1.1.1.2 mrg { 1695 1.1.1.2 mrg if (wi::ge_p (wi::to_wide (rl), wi::to_wide (r2l), sign)) 1696 1.1.1.2 mrg m_base[bld_pair * 2] = rl; 1697 1.1.1.2 mrg else 1698 1.1.1.2 mrg m_base[bld_pair * 2] = r2l; 1699 1.1.1.2 mrg } 1700 1.1.1.2 mrg else 1701 1.1.1.2 mrg // Decrease and set a new upper. 1702 1.1.1.2 mrg bld_pair--; 1703 1.1.1.2 mrg 1704 1.1.1.2 mrg // ...and choose the lower of the upper bounds. 1705 1.1.1.2 mrg if (wi::le_p (wi::to_wide (ru), wi::to_wide (r2u), sign)) 1706 1.1.1.2 mrg { 1707 1.1.1.2 mrg m_base[bld_pair * 2 + 1] = ru; 1708 1.1.1.2 mrg bld_pair++; 1709 1.1.1.2 mrg // Move past the r1 pair and keep trying. 1710 1.1.1.2 mrg i++; 1711 1.1.1.2 mrg continue; 1712 1.1.1.2 mrg } 1713 1.1.1.2 mrg else 1714 1.1.1.2 mrg { 1715 1.1.1.2 mrg m_base[bld_pair * 2 + 1] = r2u; 1716 1.1.1.2 mrg bld_pair++; 1717 1.1.1.2 mrg i2++; 1718 1.1.1.2 mrg if (i2 < r2_lim) 1719 1.1.1.2 mrg continue; 1720 1.1.1.2 mrg // No more r2, break. 1721 1.1.1.2 mrg break; 1722 1.1.1.2 mrg } 1723 1.1.1.2 mrg // r2 has the higher lower bound. 1724 1.1.1.2 mrg } 1725 1.1.1.2 mrg 1726 1.1.1.2 mrg // At the exit of this loop, it is one of 2 things: 1727 1.1.1.2 mrg // ran out of r1, or r2, but either means we are done. 1728 1.1.1.2 mrg m_num_ranges = bld_pair; 1729 1.1.1.2 mrg 1730 1.1.1.2 mrg m_kind = VR_RANGE; 1731 1.1.1.2 mrg normalize_kind (); 1732 1.1.1.2 mrg 1733 1.1.1.2 mrg if (flag_checking) 1734 1.1.1.2 mrg verify_range (); 1735 1.1 mrg } 1736 1.1 mrg 1737 1.1.1.2 mrg // Multirange intersect for a specified wide_int [lb, ub] range. 1738 1.1.1.2 mrg 1739 1.1 mrg void 1740 1.1.1.2 mrg irange::intersect (const wide_int& lb, const wide_int& ub) 1741 1.1 mrg { 1742 1.1.1.2 mrg // Undefined remains undefined. 1743 1.1 mrg if (undefined_p ()) 1744 1.1.1.2 mrg return; 1745 1.1.1.2 mrg 1746 1.1.1.2 mrg if (legacy_mode_p ()) 1747 1.1 mrg { 1748 1.1.1.2 mrg intersect (int_range<1> (type (), lb, ub)); 1749 1.1.1.2 mrg return; 1750 1.1.1.2 mrg } 1751 1.1 mrg 1752 1.1.1.2 mrg tree range_type = type(); 1753 1.1.1.2 mrg signop sign = TYPE_SIGN (range_type); 1754 1.1 mrg 1755 1.1.1.2 mrg gcc_checking_assert (TYPE_PRECISION (range_type) == wi::get_precision (lb)); 1756 1.1.1.2 mrg gcc_checking_assert (TYPE_PRECISION (range_type) == wi::get_precision (ub)); 1757 1.1 mrg 1758 1.1.1.2 mrg unsigned bld_index = 0; 1759 1.1.1.2 mrg unsigned pair_lim = num_pairs (); 1760 1.1.1.2 mrg for (unsigned i = 0; i < pair_lim; i++) 1761 1.1.1.2 mrg { 1762 1.1.1.2 mrg tree pairl = m_base[i * 2]; 1763 1.1.1.2 mrg tree pairu = m_base[i * 2 + 1]; 1764 1.1.1.2 mrg // Once UB is less than a pairs lower bound, we're done. 1765 1.1.1.2 mrg if (wi::lt_p (ub, wi::to_wide (pairl), sign)) 1766 1.1.1.2 mrg break; 1767 1.1.1.2 mrg // if LB is greater than this pairs upper, this pair is excluded. 1768 1.1.1.2 mrg if (wi::lt_p (wi::to_wide (pairu), lb, sign)) 1769 1.1.1.2 mrg continue; 1770 1.1.1.2 mrg 1771 1.1.1.2 mrg // Must be some overlap. Find the highest of the lower bounds, 1772 1.1.1.2 mrg // and set it 1773 1.1.1.2 mrg if (wi::gt_p (lb, wi::to_wide (pairl), sign)) 1774 1.1.1.2 mrg m_base[bld_index * 2] = wide_int_to_tree (range_type, lb); 1775 1.1 mrg else 1776 1.1.1.2 mrg m_base[bld_index * 2] = pairl; 1777 1.1 mrg 1778 1.1.1.2 mrg // ...and choose the lower of the upper bounds and if the base pair 1779 1.1.1.2 mrg // has the lower upper bound, need to check next pair too. 1780 1.1.1.2 mrg if (wi::lt_p (ub, wi::to_wide (pairu), sign)) 1781 1.1.1.2 mrg { 1782 1.1.1.2 mrg m_base[bld_index++ * 2 + 1] = wide_int_to_tree (range_type, ub); 1783 1.1.1.2 mrg break; 1784 1.1.1.2 mrg } 1785 1.1.1.2 mrg else 1786 1.1.1.2 mrg m_base[bld_index++ * 2 + 1] = pairu; 1787 1.1.1.2 mrg } 1788 1.1.1.2 mrg 1789 1.1.1.2 mrg m_num_ranges = bld_index; 1790 1.1.1.2 mrg 1791 1.1.1.2 mrg m_kind = VR_RANGE; 1792 1.1.1.2 mrg normalize_kind (); 1793 1.1.1.2 mrg 1794 1.1.1.2 mrg if (flag_checking) 1795 1.1.1.2 mrg verify_range (); 1796 1.1.1.2 mrg } 1797 1.1.1.2 mrg // Signed 1-bits are strange. You can't subtract 1, because you can't 1798 1.1.1.2 mrg // represent the number 1. This works around that for the invert routine. 1799 1.1.1.2 mrg 1800 1.1.1.2 mrg static wide_int inline 1801 1.1.1.2 mrg subtract_one (const wide_int &x, tree type, wi::overflow_type &overflow) 1802 1.1.1.2 mrg { 1803 1.1.1.2 mrg if (TYPE_SIGN (type) == SIGNED) 1804 1.1.1.2 mrg return wi::add (x, -1, SIGNED, &overflow); 1805 1.1.1.2 mrg else 1806 1.1.1.2 mrg return wi::sub (x, 1, UNSIGNED, &overflow); 1807 1.1.1.2 mrg } 1808 1.1.1.2 mrg 1809 1.1.1.2 mrg // The analogous function for adding 1. 1810 1.1.1.2 mrg 1811 1.1.1.2 mrg static wide_int inline 1812 1.1.1.2 mrg add_one (const wide_int &x, tree type, wi::overflow_type &overflow) 1813 1.1.1.2 mrg { 1814 1.1.1.2 mrg if (TYPE_SIGN (type) == SIGNED) 1815 1.1.1.2 mrg return wi::sub (x, -1, SIGNED, &overflow); 1816 1.1.1.2 mrg else 1817 1.1.1.2 mrg return wi::add (x, 1, UNSIGNED, &overflow); 1818 1.1.1.2 mrg } 1819 1.1 mrg 1820 1.1.1.2 mrg // Return the inverse of a range. 1821 1.1.1.2 mrg 1822 1.1.1.2 mrg void 1823 1.1.1.2 mrg irange::invert () 1824 1.1.1.2 mrg { 1825 1.1.1.2 mrg if (legacy_mode_p ()) 1826 1.1.1.2 mrg { 1827 1.1.1.2 mrg // We can't just invert VR_RANGE and VR_ANTI_RANGE because we may 1828 1.1.1.2 mrg // create non-canonical ranges. Use the constructors instead. 1829 1.1.1.2 mrg if (m_kind == VR_RANGE) 1830 1.1.1.2 mrg *this = value_range (min (), max (), VR_ANTI_RANGE); 1831 1.1.1.2 mrg else if (m_kind == VR_ANTI_RANGE) 1832 1.1.1.2 mrg *this = value_range (min (), max ()); 1833 1.1 mrg else 1834 1.1.1.2 mrg gcc_unreachable (); 1835 1.1.1.2 mrg return; 1836 1.1.1.2 mrg } 1837 1.1 mrg 1838 1.1.1.2 mrg gcc_checking_assert (!undefined_p () && !varying_p ()); 1839 1.1.1.2 mrg 1840 1.1.1.2 mrg // We always need one more set of bounds to represent an inverse, so 1841 1.1.1.2 mrg // if we're at the limit, we can't properly represent things. 1842 1.1.1.2 mrg // 1843 1.1.1.2 mrg // For instance, to represent the inverse of a 2 sub-range set 1844 1.1.1.2 mrg // [5, 10][20, 30], we would need a 3 sub-range set 1845 1.1.1.2 mrg // [-MIN, 4][11, 19][31, MAX]. 1846 1.1.1.2 mrg // 1847 1.1.1.2 mrg // In this case, return the most conservative thing. 1848 1.1.1.2 mrg // 1849 1.1.1.2 mrg // However, if any of the extremes of the range are -MIN/+MAX, we 1850 1.1.1.2 mrg // know we will not need an extra bound. For example: 1851 1.1.1.2 mrg // 1852 1.1.1.2 mrg // INVERT([-MIN,20][30,40]) => [21,29][41,+MAX] 1853 1.1.1.2 mrg // INVERT([-MIN,20][30,MAX]) => [21,29] 1854 1.1.1.2 mrg tree ttype = type (); 1855 1.1.1.2 mrg unsigned prec = TYPE_PRECISION (ttype); 1856 1.1.1.2 mrg signop sign = TYPE_SIGN (ttype); 1857 1.1.1.2 mrg wide_int type_min = wi::min_value (prec, sign); 1858 1.1.1.2 mrg wide_int type_max = wi::max_value (prec, sign); 1859 1.1.1.2 mrg // The algorithm is as follows. To calculate INVERT ([a,b][c,d]), we 1860 1.1.1.2 mrg // generate [-MIN, a-1][b+1, c-1][d+1, MAX]. 1861 1.1.1.2 mrg // 1862 1.1.1.2 mrg // If there is an over/underflow in the calculation for any 1863 1.1.1.2 mrg // sub-range, we eliminate that subrange. This allows us to easily 1864 1.1.1.2 mrg // calculate INVERT([-MIN, 5]) with: [-MIN, -MIN-1][6, MAX]. And since 1865 1.1.1.2 mrg // we eliminate the underflow, only [6, MAX] remains. 1866 1.1.1.2 mrg unsigned i = 0; 1867 1.1.1.2 mrg wi::overflow_type ovf; 1868 1.1.1.2 mrg // Construct leftmost range. 1869 1.1.1.2 mrg int_range_max orig_range (*this); 1870 1.1.1.2 mrg unsigned nitems = 0; 1871 1.1.1.2 mrg wide_int tmp; 1872 1.1.1.2 mrg // If this is going to underflow on the MINUS 1, don't even bother 1873 1.1.1.2 mrg // checking. This also handles subtracting one from an unsigned 0, 1874 1.1.1.2 mrg // which doesn't set the underflow bit. 1875 1.1.1.2 mrg if (type_min != orig_range.lower_bound ()) 1876 1.1.1.2 mrg { 1877 1.1.1.2 mrg m_base[nitems++] = wide_int_to_tree (ttype, type_min); 1878 1.1.1.2 mrg tmp = subtract_one (orig_range.lower_bound (), ttype, ovf); 1879 1.1.1.2 mrg m_base[nitems++] = wide_int_to_tree (ttype, tmp); 1880 1.1.1.2 mrg if (ovf) 1881 1.1.1.2 mrg nitems = 0; 1882 1.1.1.2 mrg } 1883 1.1.1.2 mrg i++; 1884 1.1.1.2 mrg // Construct middle ranges if applicable. 1885 1.1.1.2 mrg if (orig_range.num_pairs () > 1) 1886 1.1.1.2 mrg { 1887 1.1.1.2 mrg unsigned j = i; 1888 1.1.1.2 mrg for (; j < (orig_range.num_pairs () * 2) - 1; j += 2) 1889 1.1.1.2 mrg { 1890 1.1.1.2 mrg // The middle ranges cannot have MAX/MIN, so there's no need 1891 1.1.1.2 mrg // to check for unsigned overflow on the +1 and -1 here. 1892 1.1.1.2 mrg tmp = wi::add (wi::to_wide (orig_range.m_base[j]), 1, sign, &ovf); 1893 1.1.1.2 mrg m_base[nitems++] = wide_int_to_tree (ttype, tmp); 1894 1.1.1.2 mrg tmp = subtract_one (wi::to_wide (orig_range.m_base[j + 1]), 1895 1.1.1.2 mrg ttype, ovf); 1896 1.1.1.2 mrg m_base[nitems++] = wide_int_to_tree (ttype, tmp); 1897 1.1.1.2 mrg if (ovf) 1898 1.1.1.2 mrg nitems -= 2; 1899 1.1.1.2 mrg } 1900 1.1.1.2 mrg i = j; 1901 1.1.1.2 mrg } 1902 1.1.1.2 mrg // Construct rightmost range. 1903 1.1.1.2 mrg // 1904 1.1.1.2 mrg // However, if this will overflow on the PLUS 1, don't even bother. 1905 1.1.1.2 mrg // This also handles adding one to an unsigned MAX, which doesn't 1906 1.1.1.2 mrg // set the overflow bit. 1907 1.1.1.2 mrg if (type_max != wi::to_wide (orig_range.m_base[i])) 1908 1.1.1.2 mrg { 1909 1.1.1.2 mrg tmp = add_one (wi::to_wide (orig_range.m_base[i]), ttype, ovf); 1910 1.1.1.2 mrg m_base[nitems++] = wide_int_to_tree (ttype, tmp); 1911 1.1.1.2 mrg m_base[nitems++] = wide_int_to_tree (ttype, type_max); 1912 1.1.1.2 mrg if (ovf) 1913 1.1.1.2 mrg nitems -= 2; 1914 1.1.1.2 mrg } 1915 1.1.1.2 mrg m_num_ranges = nitems / 2; 1916 1.1.1.2 mrg 1917 1.1.1.2 mrg // We disallow undefined or varying coming in, so the result can 1918 1.1.1.2 mrg // only be a VR_RANGE. 1919 1.1.1.2 mrg gcc_checking_assert (m_kind == VR_RANGE); 1920 1.1.1.2 mrg 1921 1.1.1.2 mrg if (flag_checking) 1922 1.1.1.2 mrg verify_range (); 1923 1.1.1.2 mrg } 1924 1.1.1.2 mrg 1925 1.1.1.2 mrg static void 1926 1.1.1.2 mrg dump_bound_with_infinite_markers (FILE *file, tree bound) 1927 1.1.1.2 mrg { 1928 1.1.1.2 mrg tree type = TREE_TYPE (bound); 1929 1.1.1.2 mrg wide_int type_min = wi::min_value (TYPE_PRECISION (type), TYPE_SIGN (type)); 1930 1.1.1.2 mrg wide_int type_max = wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type)); 1931 1.1.1.2 mrg 1932 1.1.1.2 mrg if (INTEGRAL_TYPE_P (type) 1933 1.1.1.2 mrg && !TYPE_UNSIGNED (type) 1934 1.1.1.2 mrg && TREE_CODE (bound) == INTEGER_CST 1935 1.1.1.2 mrg && wi::to_wide (bound) == type_min 1936 1.1.1.2 mrg && TYPE_PRECISION (type) != 1) 1937 1.1.1.2 mrg fprintf (file, "-INF"); 1938 1.1.1.2 mrg else if (TREE_CODE (bound) == INTEGER_CST 1939 1.1.1.2 mrg && wi::to_wide (bound) == type_max 1940 1.1.1.2 mrg && TYPE_PRECISION (type) != 1) 1941 1.1.1.2 mrg fprintf (file, "+INF"); 1942 1.1.1.2 mrg else 1943 1.1.1.2 mrg print_generic_expr (file, bound); 1944 1.1.1.2 mrg } 1945 1.1.1.2 mrg 1946 1.1.1.2 mrg void 1947 1.1.1.2 mrg irange::dump (FILE *file) const 1948 1.1.1.2 mrg { 1949 1.1.1.2 mrg if (undefined_p ()) 1950 1.1.1.2 mrg { 1951 1.1.1.2 mrg fprintf (file, "UNDEFINED"); 1952 1.1.1.2 mrg return; 1953 1.1.1.2 mrg } 1954 1.1.1.2 mrg print_generic_expr (file, type ()); 1955 1.1.1.2 mrg fprintf (file, " "); 1956 1.1.1.2 mrg if (varying_p ()) 1957 1.1.1.2 mrg { 1958 1.1.1.2 mrg fprintf (file, "VARYING"); 1959 1.1.1.2 mrg return; 1960 1.1.1.2 mrg } 1961 1.1.1.2 mrg if (legacy_mode_p ()) 1962 1.1.1.2 mrg { 1963 1.1.1.2 mrg fprintf (file, "%s[", (m_kind == VR_ANTI_RANGE) ? "~" : ""); 1964 1.1.1.2 mrg dump_bound_with_infinite_markers (file, min ()); 1965 1.1.1.2 mrg fprintf (file, ", "); 1966 1.1.1.2 mrg dump_bound_with_infinite_markers (file, max ()); 1967 1.1 mrg fprintf (file, "]"); 1968 1.1.1.2 mrg return; 1969 1.1 mrg } 1970 1.1.1.2 mrg for (unsigned i = 0; i < m_num_ranges; ++i) 1971 1.1 mrg { 1972 1.1.1.2 mrg tree lb = m_base[i * 2]; 1973 1.1.1.2 mrg tree ub = m_base[i * 2 + 1]; 1974 1.1.1.2 mrg fprintf (file, "["); 1975 1.1.1.2 mrg dump_bound_with_infinite_markers (file, lb); 1976 1.1.1.2 mrg fprintf (file, ", "); 1977 1.1.1.2 mrg dump_bound_with_infinite_markers (file, ub); 1978 1.1.1.2 mrg fprintf (file, "]"); 1979 1.1 mrg } 1980 1.1 mrg } 1981 1.1 mrg 1982 1.1 mrg void 1983 1.1.1.2 mrg irange::debug () const 1984 1.1 mrg { 1985 1.1 mrg dump (stderr); 1986 1.1.1.2 mrg fprintf (stderr, "\n"); 1987 1.1 mrg } 1988 1.1 mrg 1989 1.1 mrg void 1990 1.1.1.2 mrg dump_value_range (FILE *file, const irange *vr) 1991 1.1 mrg { 1992 1.1.1.2 mrg vr->dump (file); 1993 1.1.1.2 mrg } 1994 1.1.1.2 mrg 1995 1.1.1.2 mrg DEBUG_FUNCTION void 1996 1.1.1.2 mrg debug (const irange *vr) 1997 1.1.1.2 mrg { 1998 1.1.1.2 mrg dump_value_range (stderr, vr); 1999 1.1.1.2 mrg fprintf (stderr, "\n"); 2000 1.1.1.2 mrg } 2001 1.1.1.2 mrg 2002 1.1.1.2 mrg DEBUG_FUNCTION void 2003 1.1.1.2 mrg debug (const irange &vr) 2004 1.1.1.2 mrg { 2005 1.1.1.2 mrg debug (&vr); 2006 1.1 mrg } 2007 1.1 mrg 2008 1.1 mrg DEBUG_FUNCTION void 2009 1.1 mrg debug (const value_range *vr) 2010 1.1 mrg { 2011 1.1 mrg dump_value_range (stderr, vr); 2012 1.1.1.2 mrg fprintf (stderr, "\n"); 2013 1.1 mrg } 2014 1.1 mrg 2015 1.1 mrg DEBUG_FUNCTION void 2016 1.1 mrg debug (const value_range &vr) 2017 1.1 mrg { 2018 1.1 mrg dump_value_range (stderr, &vr); 2019 1.1.1.2 mrg fprintf (stderr, "\n"); 2020 1.1 mrg } 2021 1.1 mrg 2022 1.1 mrg /* Create two value-ranges in *VR0 and *VR1 from the anti-range *AR 2023 1.1 mrg so that *VR0 U *VR1 == *AR. Returns true if that is possible, 2024 1.1 mrg false otherwise. If *AR can be represented with a single range 2025 1.1 mrg *VR1 will be VR_UNDEFINED. */ 2026 1.1 mrg 2027 1.1 mrg bool 2028 1.1 mrg ranges_from_anti_range (const value_range *ar, 2029 1.1 mrg value_range *vr0, value_range *vr1) 2030 1.1 mrg { 2031 1.1 mrg tree type = ar->type (); 2032 1.1 mrg 2033 1.1 mrg vr0->set_undefined (); 2034 1.1 mrg vr1->set_undefined (); 2035 1.1 mrg 2036 1.1 mrg /* As a future improvement, we could handle ~[0, A] as: [-INF, -1] U 2037 1.1 mrg [A+1, +INF]. Not sure if this helps in practice, though. */ 2038 1.1 mrg 2039 1.1 mrg if (ar->kind () != VR_ANTI_RANGE 2040 1.1 mrg || TREE_CODE (ar->min ()) != INTEGER_CST 2041 1.1 mrg || TREE_CODE (ar->max ()) != INTEGER_CST 2042 1.1 mrg || !vrp_val_min (type) 2043 1.1 mrg || !vrp_val_max (type)) 2044 1.1 mrg return false; 2045 1.1 mrg 2046 1.1 mrg if (tree_int_cst_lt (vrp_val_min (type), ar->min ())) 2047 1.1 mrg vr0->set (vrp_val_min (type), 2048 1.1 mrg wide_int_to_tree (type, wi::to_wide (ar->min ()) - 1)); 2049 1.1 mrg if (tree_int_cst_lt (ar->max (), vrp_val_max (type))) 2050 1.1 mrg vr1->set (wide_int_to_tree (type, wi::to_wide (ar->max ()) + 1), 2051 1.1 mrg vrp_val_max (type)); 2052 1.1 mrg if (vr0->undefined_p ()) 2053 1.1 mrg { 2054 1.1 mrg *vr0 = *vr1; 2055 1.1 mrg vr1->set_undefined (); 2056 1.1 mrg } 2057 1.1 mrg 2058 1.1 mrg return !vr0->undefined_p (); 2059 1.1 mrg } 2060 1.1 mrg 2061 1.1 mrg bool 2062 1.1.1.2 mrg range_has_numeric_bounds_p (const irange *vr) 2063 1.1 mrg { 2064 1.1.1.2 mrg return (!vr->undefined_p () 2065 1.1 mrg && TREE_CODE (vr->min ()) == INTEGER_CST 2066 1.1 mrg && TREE_CODE (vr->max ()) == INTEGER_CST); 2067 1.1 mrg } 2068 1.1 mrg 2069 1.1 mrg /* Return whether VAL is equal to the maximum value of its type. 2070 1.1 mrg We can't do a simple equality comparison with TYPE_MAX_VALUE because 2071 1.1 mrg C typedefs and Ada subtypes can produce types whose TYPE_MAX_VALUE 2072 1.1 mrg is not == to the integer constant with the same value in the type. */ 2073 1.1 mrg 2074 1.1 mrg bool 2075 1.1 mrg vrp_val_is_max (const_tree val) 2076 1.1 mrg { 2077 1.1 mrg tree type_max = vrp_val_max (TREE_TYPE (val)); 2078 1.1 mrg return (val == type_max 2079 1.1 mrg || (type_max != NULL_TREE 2080 1.1 mrg && operand_equal_p (val, type_max, 0))); 2081 1.1 mrg } 2082 1.1 mrg 2083 1.1 mrg /* Return whether VAL is equal to the minimum value of its type. */ 2084 1.1 mrg 2085 1.1 mrg bool 2086 1.1 mrg vrp_val_is_min (const_tree val) 2087 1.1 mrg { 2088 1.1 mrg tree type_min = vrp_val_min (TREE_TYPE (val)); 2089 1.1 mrg return (val == type_min 2090 1.1 mrg || (type_min != NULL_TREE 2091 1.1 mrg && operand_equal_p (val, type_min, 0))); 2092 1.1 mrg } 2093 1.1 mrg 2094 1.1 mrg /* Return true, if VAL1 and VAL2 are equal values for VRP purposes. */ 2095 1.1 mrg 2096 1.1 mrg bool 2097 1.1 mrg vrp_operand_equal_p (const_tree val1, const_tree val2) 2098 1.1 mrg { 2099 1.1 mrg if (val1 == val2) 2100 1.1 mrg return true; 2101 1.1 mrg if (!val1 || !val2 || !operand_equal_p (val1, val2, 0)) 2102 1.1 mrg return false; 2103 1.1 mrg return true; 2104 1.1 mrg } 2105 1.1.1.2 mrg 2106 1.1.1.2 mrg // ?? These stubs are for ipa-prop.cc which use a value_range in a 2107 1.1.1.2 mrg // hash_traits. hash-traits.h defines an extern of gt_ggc_mx (T &) 2108 1.1.1.2 mrg // instead of picking up the gt_ggc_mx (T *) version. 2109 1.1.1.2 mrg void 2110 1.1.1.2 mrg gt_pch_nx (int_range<1> *&x) 2111 1.1.1.2 mrg { 2112 1.1.1.2 mrg return gt_pch_nx ((irange *) x); 2113 1.1.1.2 mrg } 2114 1.1.1.2 mrg 2115 1.1.1.2 mrg void 2116 1.1.1.2 mrg gt_ggc_mx (int_range<1> *&x) 2117 1.1.1.2 mrg { 2118 1.1.1.2 mrg return gt_ggc_mx ((irange *) x); 2119 1.1.1.2 mrg } 2120 1.1.1.2 mrg 2121 1.1.1.2 mrg #define DEFINE_INT_RANGE_INSTANCE(N) \ 2122 1.1.1.2 mrg template int_range<N>::int_range(tree, tree, value_range_kind); \ 2123 1.1.1.2 mrg template int_range<N>::int_range(tree_node *, \ 2124 1.1.1.2 mrg const wide_int &, \ 2125 1.1.1.2 mrg const wide_int &, \ 2126 1.1.1.2 mrg value_range_kind); \ 2127 1.1.1.2 mrg template int_range<N>::int_range(tree); \ 2128 1.1.1.2 mrg template int_range<N>::int_range(const irange &); \ 2129 1.1.1.2 mrg template int_range<N>::int_range(const int_range &); \ 2130 1.1.1.2 mrg template int_range<N>& int_range<N>::operator= (const int_range &); 2131 1.1.1.2 mrg 2132 1.1.1.2 mrg DEFINE_INT_RANGE_INSTANCE(1) 2133 1.1.1.2 mrg DEFINE_INT_RANGE_INSTANCE(2) 2134 1.1.1.2 mrg DEFINE_INT_RANGE_INSTANCE(3) 2135 1.1.1.2 mrg DEFINE_INT_RANGE_INSTANCE(255) 2136 1.1.1.2 mrg 2137 1.1.1.2 mrg #if CHECKING_P 2138 1.1.1.2 mrg #include "selftest.h" 2139 1.1.1.2 mrg 2140 1.1.1.2 mrg namespace selftest 2141 1.1.1.2 mrg { 2142 1.1.1.2 mrg #define INT(N) build_int_cst (integer_type_node, (N)) 2143 1.1.1.2 mrg #define UINT(N) build_int_cstu (unsigned_type_node, (N)) 2144 1.1.1.2 mrg #define UINT128(N) build_int_cstu (u128_type, (N)) 2145 1.1.1.2 mrg #define UCHAR(N) build_int_cstu (unsigned_char_type_node, (N)) 2146 1.1.1.2 mrg #define SCHAR(N) build_int_cst (signed_char_type_node, (N)) 2147 1.1.1.2 mrg 2148 1.1.1.2 mrg static int_range<3> 2149 1.1.1.2 mrg build_range3 (int a, int b, int c, int d, int e, int f) 2150 1.1.1.2 mrg { 2151 1.1.1.2 mrg int_range<3> i1 (INT (a), INT (b)); 2152 1.1.1.2 mrg int_range<3> i2 (INT (c), INT (d)); 2153 1.1.1.2 mrg int_range<3> i3 (INT (e), INT (f)); 2154 1.1.1.2 mrg i1.union_ (i2); 2155 1.1.1.2 mrg i1.union_ (i3); 2156 1.1.1.2 mrg return i1; 2157 1.1.1.2 mrg } 2158 1.1.1.2 mrg 2159 1.1.1.2 mrg static void 2160 1.1.1.2 mrg range_tests_irange3 () 2161 1.1.1.2 mrg { 2162 1.1.1.2 mrg typedef int_range<3> int_range3; 2163 1.1.1.2 mrg int_range3 r0, r1, r2; 2164 1.1.1.2 mrg int_range3 i1, i2, i3; 2165 1.1.1.2 mrg 2166 1.1.1.2 mrg // ([10,20] U [5,8]) U [1,3] ==> [1,3][5,8][10,20]. 2167 1.1.1.2 mrg r0 = int_range3 (INT (10), INT (20)); 2168 1.1.1.2 mrg r1 = int_range3 (INT (5), INT (8)); 2169 1.1.1.2 mrg r0.union_ (r1); 2170 1.1.1.2 mrg r1 = int_range3 (INT (1), INT (3)); 2171 1.1.1.2 mrg r0.union_ (r1); 2172 1.1.1.2 mrg ASSERT_TRUE (r0 == build_range3 (1, 3, 5, 8, 10, 20)); 2173 1.1.1.2 mrg 2174 1.1.1.2 mrg // [1,3][5,8][10,20] U [-5,0] => [-5,3][5,8][10,20]. 2175 1.1.1.2 mrg r1 = int_range3 (INT (-5), INT (0)); 2176 1.1.1.2 mrg r0.union_ (r1); 2177 1.1.1.2 mrg ASSERT_TRUE (r0 == build_range3 (-5, 3, 5, 8, 10, 20)); 2178 1.1.1.2 mrg 2179 1.1.1.2 mrg // [10,20][30,40] U [50,60] ==> [10,20][30,40][50,60]. 2180 1.1.1.2 mrg r1 = int_range3 (INT (50), INT (60)); 2181 1.1.1.2 mrg r0 = int_range3 (INT (10), INT (20)); 2182 1.1.1.2 mrg r0.union_ (int_range3 (INT (30), INT (40))); 2183 1.1.1.2 mrg r0.union_ (r1); 2184 1.1.1.2 mrg ASSERT_TRUE (r0 == build_range3 (10, 20, 30, 40, 50, 60)); 2185 1.1.1.2 mrg // [10,20][30,40][50,60] U [70, 80] ==> [10,20][30,40][50,60][70,80]. 2186 1.1.1.2 mrg r1 = int_range3 (INT (70), INT (80)); 2187 1.1.1.2 mrg r0.union_ (r1); 2188 1.1.1.2 mrg 2189 1.1.1.2 mrg r2 = build_range3 (10, 20, 30, 40, 50, 60); 2190 1.1.1.2 mrg r2.union_ (int_range3 (INT (70), INT (80))); 2191 1.1.1.2 mrg ASSERT_TRUE (r0 == r2); 2192 1.1.1.2 mrg 2193 1.1.1.2 mrg // [10,20][30,40][50,60] U [6,35] => [6,40][50,60]. 2194 1.1.1.2 mrg r0 = build_range3 (10, 20, 30, 40, 50, 60); 2195 1.1.1.2 mrg r1 = int_range3 (INT (6), INT (35)); 2196 1.1.1.2 mrg r0.union_ (r1); 2197 1.1.1.2 mrg r1 = int_range3 (INT (6), INT (40)); 2198 1.1.1.2 mrg r1.union_ (int_range3 (INT (50), INT (60))); 2199 1.1.1.2 mrg ASSERT_TRUE (r0 == r1); 2200 1.1.1.2 mrg 2201 1.1.1.2 mrg // [10,20][30,40][50,60] U [6,60] => [6,60]. 2202 1.1.1.2 mrg r0 = build_range3 (10, 20, 30, 40, 50, 60); 2203 1.1.1.2 mrg r1 = int_range3 (INT (6), INT (60)); 2204 1.1.1.2 mrg r0.union_ (r1); 2205 1.1.1.2 mrg ASSERT_TRUE (r0 == int_range3 (INT (6), INT (60))); 2206 1.1.1.2 mrg 2207 1.1.1.2 mrg // [10,20][30,40][50,60] U [6,70] => [6,70]. 2208 1.1.1.2 mrg r0 = build_range3 (10, 20, 30, 40, 50, 60); 2209 1.1.1.2 mrg r1 = int_range3 (INT (6), INT (70)); 2210 1.1.1.2 mrg r0.union_ (r1); 2211 1.1.1.2 mrg ASSERT_TRUE (r0 == int_range3 (INT (6), INT (70))); 2212 1.1.1.2 mrg 2213 1.1.1.2 mrg // [10,20][30,40][50,60] U [35,70] => [10,20][30,70]. 2214 1.1.1.2 mrg r0 = build_range3 (10, 20, 30, 40, 50, 60); 2215 1.1.1.2 mrg r1 = int_range3 (INT (35), INT (70)); 2216 1.1.1.2 mrg r0.union_ (r1); 2217 1.1.1.2 mrg r1 = int_range3 (INT (10), INT (20)); 2218 1.1.1.2 mrg r1.union_ (int_range3 (INT (30), INT (70))); 2219 1.1.1.2 mrg ASSERT_TRUE (r0 == r1); 2220 1.1.1.2 mrg 2221 1.1.1.2 mrg // [10,20][30,40][50,60] U [15,35] => [10,40][50,60]. 2222 1.1.1.2 mrg r0 = build_range3 (10, 20, 30, 40, 50, 60); 2223 1.1.1.2 mrg r1 = int_range3 (INT (15), INT (35)); 2224 1.1.1.2 mrg r0.union_ (r1); 2225 1.1.1.2 mrg r1 = int_range3 (INT (10), INT (40)); 2226 1.1.1.2 mrg r1.union_ (int_range3 (INT (50), INT (60))); 2227 1.1.1.2 mrg ASSERT_TRUE (r0 == r1); 2228 1.1.1.2 mrg 2229 1.1.1.2 mrg // [10,20][30,40][50,60] U [35,35] => [10,20][30,40][50,60]. 2230 1.1.1.2 mrg r0 = build_range3 (10, 20, 30, 40, 50, 60); 2231 1.1.1.2 mrg r1 = int_range3 (INT (35), INT (35)); 2232 1.1.1.2 mrg r0.union_ (r1); 2233 1.1.1.2 mrg ASSERT_TRUE (r0 == build_range3 (10, 20, 30, 40, 50, 60)); 2234 1.1.1.2 mrg } 2235 1.1.1.2 mrg 2236 1.1.1.2 mrg static void 2237 1.1.1.2 mrg range_tests_int_range_max () 2238 1.1.1.2 mrg { 2239 1.1.1.2 mrg int_range_max big; 2240 1.1.1.2 mrg unsigned int nrange; 2241 1.1.1.2 mrg 2242 1.1.1.2 mrg // Build a huge multi-range range. 2243 1.1.1.2 mrg for (nrange = 0; nrange < 50; ++nrange) 2244 1.1.1.2 mrg { 2245 1.1.1.2 mrg int_range<1> tmp (INT (nrange*10), INT (nrange*10 + 5)); 2246 1.1.1.2 mrg big.union_ (tmp); 2247 1.1.1.2 mrg } 2248 1.1.1.2 mrg ASSERT_TRUE (big.num_pairs () == nrange); 2249 1.1.1.2 mrg 2250 1.1.1.2 mrg // Verify that we can copy it without loosing precision. 2251 1.1.1.2 mrg int_range_max copy (big); 2252 1.1.1.2 mrg ASSERT_TRUE (copy.num_pairs () == nrange); 2253 1.1.1.2 mrg 2254 1.1.1.2 mrg // Inverting it should produce one more sub-range. 2255 1.1.1.2 mrg big.invert (); 2256 1.1.1.2 mrg ASSERT_TRUE (big.num_pairs () == nrange + 1); 2257 1.1.1.2 mrg 2258 1.1.1.2 mrg int_range<1> tmp (INT (5), INT (37)); 2259 1.1.1.2 mrg big.intersect (tmp); 2260 1.1.1.2 mrg ASSERT_TRUE (big.num_pairs () == 4); 2261 1.1.1.2 mrg 2262 1.1.1.2 mrg // Test that [10,10][20,20] does NOT contain 15. 2263 1.1.1.2 mrg { 2264 1.1.1.2 mrg int_range_max i1 (build_int_cst (integer_type_node, 10), 2265 1.1.1.2 mrg build_int_cst (integer_type_node, 10)); 2266 1.1.1.2 mrg int_range_max i2 (build_int_cst (integer_type_node, 20), 2267 1.1.1.2 mrg build_int_cst (integer_type_node, 20)); 2268 1.1.1.2 mrg i1.union_ (i2); 2269 1.1.1.2 mrg ASSERT_FALSE (i1.contains_p (build_int_cst (integer_type_node, 15))); 2270 1.1.1.2 mrg } 2271 1.1.1.2 mrg } 2272 1.1.1.2 mrg 2273 1.1.1.2 mrg static void 2274 1.1.1.2 mrg range_tests_legacy () 2275 1.1.1.2 mrg { 2276 1.1.1.2 mrg // Test truncating copy to int_range<1>. 2277 1.1.1.2 mrg int_range<3> big = build_range3 (10, 20, 30, 40, 50, 60); 2278 1.1.1.2 mrg int_range<1> small = big; 2279 1.1.1.2 mrg ASSERT_TRUE (small == int_range<1> (INT (10), INT (60))); 2280 1.1.1.2 mrg 2281 1.1.1.2 mrg // Test truncating copy to int_range<2>. 2282 1.1.1.2 mrg int_range<2> medium = big; 2283 1.1.1.2 mrg ASSERT_TRUE (!medium.undefined_p ()); 2284 1.1.1.2 mrg 2285 1.1.1.2 mrg // Test that a truncating copy of [MIN,20][22,40][80,MAX] 2286 1.1.1.2 mrg // ends up as a conservative anti-range of ~[21,21]. 2287 1.1.1.2 mrg big = int_range<3> (vrp_val_min (integer_type_node), INT (20)); 2288 1.1.1.2 mrg big.union_ (int_range<1> (INT (22), INT (40))); 2289 1.1.1.2 mrg big.union_ (int_range<1> (INT (80), vrp_val_max (integer_type_node))); 2290 1.1.1.2 mrg small = big; 2291 1.1.1.2 mrg ASSERT_TRUE (small == int_range<1> (INT (21), INT (21), VR_ANTI_RANGE)); 2292 1.1.1.2 mrg 2293 1.1.1.2 mrg // Copying a legacy symbolic to an int_range should normalize the 2294 1.1.1.2 mrg // symbolic at copy time. 2295 1.1.1.2 mrg { 2296 1.1.1.2 mrg tree ssa = make_ssa_name (integer_type_node); 2297 1.1.1.2 mrg value_range legacy_range (ssa, INT (25)); 2298 1.1.1.2 mrg int_range<2> copy = legacy_range; 2299 1.1.1.2 mrg ASSERT_TRUE (copy == int_range<2> (vrp_val_min (integer_type_node), 2300 1.1.1.2 mrg INT (25))); 2301 1.1.1.2 mrg 2302 1.1.1.2 mrg // Test that copying ~[abc_23, abc_23] to a multi-range yields varying. 2303 1.1.1.2 mrg legacy_range = value_range (ssa, ssa, VR_ANTI_RANGE); 2304 1.1.1.2 mrg copy = legacy_range; 2305 1.1.1.2 mrg ASSERT_TRUE (copy.varying_p ()); 2306 1.1.1.2 mrg } 2307 1.1.1.2 mrg 2308 1.1.1.2 mrg // VARYING of different sizes should not be equal. 2309 1.1.1.2 mrg tree big_type = build_nonstandard_integer_type (32, 1); 2310 1.1.1.2 mrg tree small_type = build_nonstandard_integer_type (16, 1); 2311 1.1.1.2 mrg int_range_max r0 (big_type); 2312 1.1.1.2 mrg int_range_max r1 (small_type); 2313 1.1.1.2 mrg ASSERT_TRUE (r0 != r1); 2314 1.1.1.2 mrg value_range vr0 (big_type); 2315 1.1.1.2 mrg int_range_max vr1 (small_type); 2316 1.1.1.2 mrg ASSERT_TRUE (vr0 != vr1); 2317 1.1.1.2 mrg } 2318 1.1.1.2 mrg 2319 1.1.1.2 mrg // Simulate -fstrict-enums where the domain of a type is less than the 2320 1.1.1.2 mrg // underlying type. 2321 1.1.1.2 mrg 2322 1.1.1.2 mrg static void 2323 1.1.1.2 mrg range_tests_strict_enum () 2324 1.1.1.2 mrg { 2325 1.1.1.2 mrg // The enum can only hold [0, 3]. 2326 1.1.1.2 mrg tree rtype = copy_node (unsigned_type_node); 2327 1.1.1.2 mrg TYPE_MIN_VALUE (rtype) = build_int_cstu (rtype, 0); 2328 1.1.1.2 mrg TYPE_MAX_VALUE (rtype) = build_int_cstu (rtype, 3); 2329 1.1.1.2 mrg 2330 1.1.1.2 mrg // Test that even though vr1 covers the strict enum domain ([0, 3]), 2331 1.1.1.2 mrg // it does not cover the domain of the underlying type. 2332 1.1.1.2 mrg int_range<1> vr1 (build_int_cstu (rtype, 0), build_int_cstu (rtype, 1)); 2333 1.1.1.2 mrg int_range<1> vr2 (build_int_cstu (rtype, 2), build_int_cstu (rtype, 3)); 2334 1.1.1.2 mrg vr1.union_ (vr2); 2335 1.1.1.2 mrg ASSERT_TRUE (vr1 == int_range<1> (build_int_cstu (rtype, 0), 2336 1.1.1.2 mrg build_int_cstu (rtype, 3))); 2337 1.1.1.2 mrg ASSERT_FALSE (vr1.varying_p ()); 2338 1.1.1.2 mrg 2339 1.1.1.2 mrg // Test that copying to a multi-range does not change things. 2340 1.1.1.2 mrg int_range<2> ir1 (vr1); 2341 1.1.1.2 mrg ASSERT_TRUE (ir1 == vr1); 2342 1.1.1.2 mrg ASSERT_FALSE (ir1.varying_p ()); 2343 1.1.1.2 mrg 2344 1.1.1.2 mrg // The same test as above, but using TYPE_{MIN,MAX}_VALUE instead of [0,3]. 2345 1.1.1.2 mrg vr1 = int_range<1> (TYPE_MIN_VALUE (rtype), TYPE_MAX_VALUE (rtype)); 2346 1.1.1.2 mrg ir1 = vr1; 2347 1.1.1.2 mrg ASSERT_TRUE (ir1 == vr1); 2348 1.1.1.2 mrg ASSERT_FALSE (ir1.varying_p ()); 2349 1.1.1.2 mrg } 2350 1.1.1.2 mrg 2351 1.1.1.2 mrg static void 2352 1.1.1.2 mrg range_tests_misc () 2353 1.1.1.2 mrg { 2354 1.1.1.2 mrg tree u128_type = build_nonstandard_integer_type (128, /*unsigned=*/1); 2355 1.1.1.2 mrg int_range<1> i1, i2, i3; 2356 1.1.1.2 mrg int_range<1> r0, r1, rold; 2357 1.1.1.2 mrg 2358 1.1.1.2 mrg // Test 1-bit signed integer union. 2359 1.1.1.2 mrg // [-1,-1] U [0,0] = VARYING. 2360 1.1.1.2 mrg tree one_bit_type = build_nonstandard_integer_type (1, 0); 2361 1.1.1.2 mrg tree one_bit_min = vrp_val_min (one_bit_type); 2362 1.1.1.2 mrg tree one_bit_max = vrp_val_max (one_bit_type); 2363 1.1.1.2 mrg { 2364 1.1.1.2 mrg int_range<2> min (one_bit_min, one_bit_min); 2365 1.1.1.2 mrg int_range<2> max (one_bit_max, one_bit_max); 2366 1.1.1.2 mrg max.union_ (min); 2367 1.1.1.2 mrg ASSERT_TRUE (max.varying_p ()); 2368 1.1.1.2 mrg } 2369 1.1.1.2 mrg 2370 1.1.1.2 mrg // Test inversion of 1-bit signed integers. 2371 1.1.1.2 mrg { 2372 1.1.1.2 mrg int_range<2> min (one_bit_min, one_bit_min); 2373 1.1.1.2 mrg int_range<2> max (one_bit_max, one_bit_max); 2374 1.1.1.2 mrg int_range<2> t; 2375 1.1.1.2 mrg t = min; 2376 1.1.1.2 mrg t.invert (); 2377 1.1.1.2 mrg ASSERT_TRUE (t == max); 2378 1.1.1.2 mrg t = max; 2379 1.1.1.2 mrg t.invert (); 2380 1.1.1.2 mrg ASSERT_TRUE (t == min); 2381 1.1.1.2 mrg } 2382 1.1.1.2 mrg 2383 1.1.1.2 mrg // Test that NOT(255) is [0..254] in 8-bit land. 2384 1.1.1.2 mrg int_range<1> not_255 (UCHAR (255), UCHAR (255), VR_ANTI_RANGE); 2385 1.1.1.2 mrg ASSERT_TRUE (not_255 == int_range<1> (UCHAR (0), UCHAR (254))); 2386 1.1.1.2 mrg 2387 1.1.1.2 mrg // Test that NOT(0) is [1..255] in 8-bit land. 2388 1.1.1.2 mrg int_range<1> not_zero = range_nonzero (unsigned_char_type_node); 2389 1.1.1.2 mrg ASSERT_TRUE (not_zero == int_range<1> (UCHAR (1), UCHAR (255))); 2390 1.1.1.2 mrg 2391 1.1.1.2 mrg // Check that [0,127][0x..ffffff80,0x..ffffff] 2392 1.1.1.2 mrg // => ~[128, 0x..ffffff7f]. 2393 1.1.1.2 mrg r0 = int_range<1> (UINT128 (0), UINT128 (127)); 2394 1.1.1.2 mrg tree high = build_minus_one_cst (u128_type); 2395 1.1.1.2 mrg // low = -1 - 127 => 0x..ffffff80. 2396 1.1.1.2 mrg tree low = fold_build2 (MINUS_EXPR, u128_type, high, UINT128(127)); 2397 1.1.1.2 mrg r1 = int_range<1> (low, high); // [0x..ffffff80, 0x..ffffffff] 2398 1.1.1.2 mrg // r0 = [0,127][0x..ffffff80,0x..fffffff]. 2399 1.1.1.2 mrg r0.union_ (r1); 2400 1.1.1.2 mrg // r1 = [128, 0x..ffffff7f]. 2401 1.1.1.2 mrg r1 = int_range<1> (UINT128(128), 2402 1.1.1.2 mrg fold_build2 (MINUS_EXPR, u128_type, 2403 1.1.1.2 mrg build_minus_one_cst (u128_type), 2404 1.1.1.2 mrg UINT128(128))); 2405 1.1.1.2 mrg r0.invert (); 2406 1.1.1.2 mrg ASSERT_TRUE (r0 == r1); 2407 1.1.1.2 mrg 2408 1.1.1.2 mrg r0.set_varying (integer_type_node); 2409 1.1.1.2 mrg tree minint = wide_int_to_tree (integer_type_node, r0.lower_bound ()); 2410 1.1.1.2 mrg tree maxint = wide_int_to_tree (integer_type_node, r0.upper_bound ()); 2411 1.1.1.2 mrg 2412 1.1.1.2 mrg r0.set_varying (short_integer_type_node); 2413 1.1.1.2 mrg 2414 1.1.1.2 mrg r0.set_varying (unsigned_type_node); 2415 1.1.1.2 mrg tree maxuint = wide_int_to_tree (unsigned_type_node, r0.upper_bound ()); 2416 1.1.1.2 mrg 2417 1.1.1.2 mrg // Check that ~[0,5] => [6,MAX] for unsigned int. 2418 1.1.1.2 mrg r0 = int_range<1> (UINT (0), UINT (5)); 2419 1.1.1.2 mrg r0.invert (); 2420 1.1.1.2 mrg ASSERT_TRUE (r0 == int_range<1> (UINT(6), maxuint)); 2421 1.1.1.2 mrg 2422 1.1.1.2 mrg // Check that ~[10,MAX] => [0,9] for unsigned int. 2423 1.1.1.2 mrg r0 = int_range<1> (UINT(10), maxuint); 2424 1.1.1.2 mrg r0.invert (); 2425 1.1.1.2 mrg ASSERT_TRUE (r0 == int_range<1> (UINT (0), UINT (9))); 2426 1.1.1.2 mrg 2427 1.1.1.2 mrg // Check that ~[0,5] => [6,MAX] for unsigned 128-bit numbers. 2428 1.1.1.2 mrg r0 = int_range<1> (UINT128 (0), UINT128 (5), VR_ANTI_RANGE); 2429 1.1.1.2 mrg r1 = int_range<1> (UINT128(6), build_minus_one_cst (u128_type)); 2430 1.1.1.2 mrg ASSERT_TRUE (r0 == r1); 2431 1.1.1.2 mrg 2432 1.1.1.2 mrg // Check that [~5] is really [-MIN,4][6,MAX]. 2433 1.1.1.2 mrg r0 = int_range<1> (INT (5), INT (5), VR_ANTI_RANGE); 2434 1.1.1.2 mrg r1 = int_range<1> (minint, INT (4)); 2435 1.1.1.2 mrg r1.union_ (int_range<1> (INT (6), maxint)); 2436 1.1.1.2 mrg ASSERT_FALSE (r1.undefined_p ()); 2437 1.1.1.2 mrg ASSERT_TRUE (r0 == r1); 2438 1.1.1.2 mrg 2439 1.1.1.2 mrg r1 = int_range<1> (INT (5), INT (5)); 2440 1.1.1.2 mrg int_range<1> r2 (r1); 2441 1.1.1.2 mrg ASSERT_TRUE (r1 == r2); 2442 1.1.1.2 mrg 2443 1.1.1.2 mrg r1 = int_range<1> (INT (5), INT (10)); 2444 1.1.1.2 mrg 2445 1.1.1.2 mrg r1 = int_range<1> (integer_type_node, 2446 1.1.1.2 mrg wi::to_wide (INT (5)), wi::to_wide (INT (10))); 2447 1.1.1.2 mrg ASSERT_TRUE (r1.contains_p (INT (7))); 2448 1.1.1.2 mrg 2449 1.1.1.2 mrg r1 = int_range<1> (SCHAR (0), SCHAR (20)); 2450 1.1.1.2 mrg ASSERT_TRUE (r1.contains_p (SCHAR(15))); 2451 1.1.1.2 mrg ASSERT_FALSE (r1.contains_p (SCHAR(300))); 2452 1.1.1.2 mrg 2453 1.1.1.2 mrg // NOT([10,20]) ==> [-MIN,9][21,MAX]. 2454 1.1.1.2 mrg r0 = r1 = int_range<1> (INT (10), INT (20)); 2455 1.1.1.2 mrg r2 = int_range<1> (minint, INT(9)); 2456 1.1.1.2 mrg r2.union_ (int_range<1> (INT(21), maxint)); 2457 1.1.1.2 mrg ASSERT_FALSE (r2.undefined_p ()); 2458 1.1.1.2 mrg r1.invert (); 2459 1.1.1.2 mrg ASSERT_TRUE (r1 == r2); 2460 1.1.1.2 mrg // Test that NOT(NOT(x)) == x. 2461 1.1.1.2 mrg r2.invert (); 2462 1.1.1.2 mrg ASSERT_TRUE (r0 == r2); 2463 1.1.1.2 mrg 2464 1.1.1.2 mrg // Test that booleans and their inverse work as expected. 2465 1.1.1.2 mrg r0 = range_zero (boolean_type_node); 2466 1.1.1.2 mrg ASSERT_TRUE (r0 == int_range<1> (build_zero_cst (boolean_type_node), 2467 1.1.1.2 mrg build_zero_cst (boolean_type_node))); 2468 1.1.1.2 mrg r0.invert (); 2469 1.1.1.2 mrg ASSERT_TRUE (r0 == int_range<1> (build_one_cst (boolean_type_node), 2470 1.1.1.2 mrg build_one_cst (boolean_type_node))); 2471 1.1.1.2 mrg 2472 1.1.1.2 mrg // Make sure NULL and non-NULL of pointer types work, and that 2473 1.1.1.2 mrg // inverses of them are consistent. 2474 1.1.1.2 mrg tree voidp = build_pointer_type (void_type_node); 2475 1.1.1.2 mrg r0 = range_zero (voidp); 2476 1.1.1.2 mrg r1 = r0; 2477 1.1.1.2 mrg r0.invert (); 2478 1.1.1.2 mrg r0.invert (); 2479 1.1.1.2 mrg ASSERT_TRUE (r0 == r1); 2480 1.1.1.2 mrg 2481 1.1.1.2 mrg // [10,20] U [15, 30] => [10, 30]. 2482 1.1.1.2 mrg r0 = int_range<1> (INT (10), INT (20)); 2483 1.1.1.2 mrg r1 = int_range<1> (INT (15), INT (30)); 2484 1.1.1.2 mrg r0.union_ (r1); 2485 1.1.1.2 mrg ASSERT_TRUE (r0 == int_range<1> (INT (10), INT (30))); 2486 1.1.1.2 mrg 2487 1.1.1.2 mrg // [15,40] U [] => [15,40]. 2488 1.1.1.2 mrg r0 = int_range<1> (INT (15), INT (40)); 2489 1.1.1.2 mrg r1.set_undefined (); 2490 1.1.1.2 mrg r0.union_ (r1); 2491 1.1.1.2 mrg ASSERT_TRUE (r0 == int_range<1> (INT (15), INT (40))); 2492 1.1.1.2 mrg 2493 1.1.1.2 mrg // [10,20] U [10,10] => [10,20]. 2494 1.1.1.2 mrg r0 = int_range<1> (INT (10), INT (20)); 2495 1.1.1.2 mrg r1 = int_range<1> (INT (10), INT (10)); 2496 1.1.1.2 mrg r0.union_ (r1); 2497 1.1.1.2 mrg ASSERT_TRUE (r0 == int_range<1> (INT (10), INT (20))); 2498 1.1.1.2 mrg 2499 1.1.1.2 mrg // [10,20] U [9,9] => [9,20]. 2500 1.1.1.2 mrg r0 = int_range<1> (INT (10), INT (20)); 2501 1.1.1.2 mrg r1 = int_range<1> (INT (9), INT (9)); 2502 1.1.1.2 mrg r0.union_ (r1); 2503 1.1.1.2 mrg ASSERT_TRUE (r0 == int_range<1> (INT (9), INT (20))); 2504 1.1.1.2 mrg 2505 1.1.1.2 mrg // [10,20] ^ [15,30] => [15,20]. 2506 1.1.1.2 mrg r0 = int_range<1> (INT (10), INT (20)); 2507 1.1.1.2 mrg r1 = int_range<1> (INT (15), INT (30)); 2508 1.1.1.2 mrg r0.intersect (r1); 2509 1.1.1.2 mrg ASSERT_TRUE (r0 == int_range<1> (INT (15), INT (20))); 2510 1.1.1.2 mrg 2511 1.1.1.2 mrg // Test the internal sanity of wide_int's wrt HWIs. 2512 1.1.1.2 mrg ASSERT_TRUE (wi::max_value (TYPE_PRECISION (boolean_type_node), 2513 1.1.1.2 mrg TYPE_SIGN (boolean_type_node)) 2514 1.1.1.2 mrg == wi::uhwi (1, TYPE_PRECISION (boolean_type_node))); 2515 1.1.1.2 mrg 2516 1.1.1.2 mrg // Test zero_p(). 2517 1.1.1.2 mrg r0 = int_range<1> (INT (0), INT (0)); 2518 1.1.1.2 mrg ASSERT_TRUE (r0.zero_p ()); 2519 1.1.1.2 mrg 2520 1.1.1.2 mrg // Test nonzero_p(). 2521 1.1.1.2 mrg r0 = int_range<1> (INT (0), INT (0)); 2522 1.1.1.2 mrg r0.invert (); 2523 1.1.1.2 mrg ASSERT_TRUE (r0.nonzero_p ()); 2524 1.1.1.2 mrg 2525 1.1.1.2 mrg // test legacy interaction 2526 1.1.1.2 mrg // r0 = ~[1,1] 2527 1.1.1.2 mrg r0 = int_range<1> (UINT (1), UINT (1), VR_ANTI_RANGE); 2528 1.1.1.2 mrg // r1 = ~[3,3] 2529 1.1.1.2 mrg r1 = int_range<1> (UINT (3), UINT (3), VR_ANTI_RANGE); 2530 1.1.1.2 mrg 2531 1.1.1.2 mrg // vv = [0,0][2,2][4, MAX] 2532 1.1.1.2 mrg int_range<3> vv = r0; 2533 1.1.1.2 mrg vv.intersect (r1); 2534 1.1.1.2 mrg 2535 1.1.1.2 mrg ASSERT_TRUE (vv.contains_p (UINT (2))); 2536 1.1.1.2 mrg ASSERT_TRUE (vv.num_pairs () == 3); 2537 1.1.1.2 mrg 2538 1.1.1.2 mrg // create r0 as legacy [1,1] 2539 1.1.1.2 mrg r0 = int_range<1> (UINT (1), UINT (1)); 2540 1.1.1.2 mrg // And union it with [0,0][2,2][4,MAX] multi range 2541 1.1.1.2 mrg r0.union_ (vv); 2542 1.1.1.2 mrg // The result should be [0,2][4,MAX], or ~[3,3] but it must contain 2 2543 1.1.1.2 mrg ASSERT_TRUE (r0.contains_p (UINT (2))); 2544 1.1.1.2 mrg } 2545 1.1.1.2 mrg 2546 1.1.1.2 mrg void 2547 1.1.1.2 mrg range_tests () 2548 1.1.1.2 mrg { 2549 1.1.1.2 mrg range_tests_legacy (); 2550 1.1.1.2 mrg range_tests_irange3 (); 2551 1.1.1.2 mrg range_tests_int_range_max (); 2552 1.1.1.2 mrg range_tests_strict_enum (); 2553 1.1.1.2 mrg range_tests_misc (); 2554 1.1.1.2 mrg } 2555 1.1.1.2 mrg 2556 1.1.1.2 mrg } // namespace selftest 2557 1.1.1.2 mrg 2558 1.1.1.2 mrg #endif // CHECKING_P 2559