1*38fd1498Szrj /* Support routines for Value Range Propagation (VRP). 2*38fd1498Szrj Copyright (C) 2016-2018 Free Software Foundation, Inc. 3*38fd1498Szrj 4*38fd1498Szrj This file is part of GCC. 5*38fd1498Szrj 6*38fd1498Szrj GCC is free software; you can redistribute it and/or modify 7*38fd1498Szrj it under the terms of the GNU General Public License as published by 8*38fd1498Szrj the Free Software Foundation; either version 3, or (at your option) 9*38fd1498Szrj any later version. 10*38fd1498Szrj 11*38fd1498Szrj GCC is distributed in the hope that it will be useful, 12*38fd1498Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of 13*38fd1498Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*38fd1498Szrj GNU General Public License for more details. 15*38fd1498Szrj 16*38fd1498Szrj You should have received a copy of the GNU General Public License 17*38fd1498Szrj along with GCC; see the file COPYING3. If not see 18*38fd1498Szrj <http://www.gnu.org/licenses/>. */ 19*38fd1498Szrj 20*38fd1498Szrj #ifndef GCC_GIMPLE_SSA_EVRP_ANALYZE_H 21*38fd1498Szrj #define GCC_GIMPLE_SSA_EVRP_ANALYZE_H 22*38fd1498Szrj 23*38fd1498Szrj class evrp_range_analyzer 24*38fd1498Szrj { 25*38fd1498Szrj public: 26*38fd1498Szrj evrp_range_analyzer (void); ~evrp_range_analyzer(void)27*38fd1498Szrj ~evrp_range_analyzer (void) 28*38fd1498Szrj { 29*38fd1498Szrj delete vr_values; 30*38fd1498Szrj stack.release (); 31*38fd1498Szrj } 32*38fd1498Szrj 33*38fd1498Szrj void enter (basic_block); 34*38fd1498Szrj void push_marker (void); 35*38fd1498Szrj void pop_to_marker (void); 36*38fd1498Szrj void leave (basic_block); 37*38fd1498Szrj void record_ranges_from_stmt (gimple *, bool); 38*38fd1498Szrj 39*38fd1498Szrj /* Main interface to retrieve range information. */ get_value_range(const_tree op)40*38fd1498Szrj value_range *get_value_range (const_tree op) 41*38fd1498Szrj { return vr_values->get_value_range (op); } 42*38fd1498Szrj 43*38fd1498Szrj /* Record a new unwindable range. */ 44*38fd1498Szrj void push_value_range (tree var, value_range *vr); 45*38fd1498Szrj 46*38fd1498Szrj /* Dump all the current value ranges. This is primarily 47*38fd1498Szrj a debugging interface. */ dump_all_value_ranges(FILE * fp)48*38fd1498Szrj void dump_all_value_ranges (FILE *fp) 49*38fd1498Szrj { vr_values->dump_all_value_ranges (fp); } 50*38fd1498Szrj 51*38fd1498Szrj /* A bit of a wart. This should ideally go away. */ vrp_visit_cond_stmt(gcond * cond,edge * e)52*38fd1498Szrj void vrp_visit_cond_stmt (gcond *cond, edge *e) 53*38fd1498Szrj { return vr_values->vrp_visit_cond_stmt (cond, e); } 54*38fd1498Szrj 55*38fd1498Szrj /* Get the underlying vr_values class instance. If TRANSFER is 56*38fd1498Szrj true, then we are transferring ownership. Else we keep ownership. 57*38fd1498Szrj 58*38fd1498Szrj This should be converted to a unique_ptr. */ get_vr_values(void)59*38fd1498Szrj class vr_values *get_vr_values (void) { return vr_values; } 60*38fd1498Szrj 61*38fd1498Szrj private: 62*38fd1498Szrj DISABLE_COPY_AND_ASSIGN (evrp_range_analyzer); 63*38fd1498Szrj class vr_values *vr_values; 64*38fd1498Szrj 65*38fd1498Szrj value_range *pop_value_range (tree var); 66*38fd1498Szrj value_range *try_find_new_range (tree, tree op, tree_code code, tree limit); 67*38fd1498Szrj void record_ranges_from_incoming_edge (basic_block); 68*38fd1498Szrj void record_ranges_from_phis (basic_block); 69*38fd1498Szrj void set_ssa_range_info (tree, value_range *); 70*38fd1498Szrj 71*38fd1498Szrj /* STACK holds the old VR. */ 72*38fd1498Szrj auto_vec<std::pair <tree, value_range*> > stack; 73*38fd1498Szrj }; 74*38fd1498Szrj 75*38fd1498Szrj #endif /* GCC_GIMPLE_SSA_EVRP_ANALYZE_H */ 76