1 /* Misc range functions. 2 Copyright (C) 2017-2020 Free Software Foundation, Inc. 3 Contributed by Aldy Hernandez <aldyh@redhat.com>. 4 5 This file is part of GCC. 6 7 GCC is free software; you can redistribute it and/or modify it under 8 the terms of the GNU General Public License as published by the Free 9 Software Foundation; either version 3, or (at your option) any later 10 version. 11 12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13 WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15 for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with GCC; see the file COPYING3. If not see 19 <http://www.gnu.org/licenses/>. */ 20 21 #include "config.h" 22 #include "system.h" 23 #include "coretypes.h" 24 #include "backend.h" 25 #include "tree.h" 26 #include "gimple.h" 27 #include "gimple-pretty-print.h" 28 #include "fold-const.h" 29 #include "ssa.h" 30 #include "range.h" 31 32 value_range 33 range_zero (tree type) 34 { 35 return value_range (build_zero_cst (type), build_zero_cst (type)); 36 } 37 38 value_range 39 range_nonzero (tree type) 40 { 41 return value_range (build_zero_cst (type), build_zero_cst (type), 42 VR_ANTI_RANGE); 43 } 44 45 value_range 46 range_positives (tree type) 47 { 48 unsigned prec = TYPE_PRECISION (type); 49 signop sign = TYPE_SIGN (type); 50 return value_range (type, wi::zero (prec), wi::max_value (prec, sign)); 51 } 52 53 value_range 54 range_negatives (tree type) 55 { 56 unsigned prec = TYPE_PRECISION (type); 57 signop sign = TYPE_SIGN (type); 58 value_range r; 59 if (sign == UNSIGNED) 60 r.set_undefined (); 61 else 62 r = value_range (type, wi::min_value (prec, sign), wi::minus_one (prec)); 63 return r; 64 } 65