Home | History | Annotate | Line # | Download | only in gcc
      1  1.1  mrg /* Code for GIMPLE range related routines.
      2  1.1  mrg    Copyright (C) 2019-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by Andrew MacLeod <amacleod (at) redhat.com>
      4  1.1  mrg    and Aldy Hernandez <aldyh (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 "insn-codes.h"
     27  1.1  mrg #include "tree.h"
     28  1.1  mrg #include "gimple.h"
     29  1.1  mrg #include "ssa.h"
     30  1.1  mrg #include "gimple-pretty-print.h"
     31  1.1  mrg #include "optabs-tree.h"
     32  1.1  mrg #include "gimple-fold.h"
     33  1.1  mrg #include "wide-int.h"
     34  1.1  mrg #include "fold-const.h"
     35  1.1  mrg #include "case-cfn-macros.h"
     36  1.1  mrg #include "omp-general.h"
     37  1.1  mrg #include "cfgloop.h"
     38  1.1  mrg #include "tree-ssa-loop.h"
     39  1.1  mrg #include "tree-scalar-evolution.h"
     40  1.1  mrg #include "langhooks.h"
     41  1.1  mrg #include "vr-values.h"
     42  1.1  mrg #include "range.h"
     43  1.1  mrg #include "value-query.h"
     44  1.1  mrg #include "range-op.h"
     45  1.1  mrg #include "gimple-range.h"
     46  1.1  mrg // Construct a fur_source, and set the m_query field.
     47  1.1  mrg 
     48  1.1  mrg fur_source::fur_source (range_query *q)
     49  1.1  mrg {
     50  1.1  mrg   if (q)
     51  1.1  mrg     m_query = q;
     52  1.1  mrg   else if (cfun)
     53  1.1  mrg     m_query = get_range_query (cfun);
     54  1.1  mrg   else
     55  1.1  mrg     m_query = get_global_range_query ();
     56  1.1  mrg   m_gori = NULL;
     57  1.1  mrg }
     58  1.1  mrg 
     59  1.1  mrg // Invoke range_of_expr on EXPR.
     60  1.1  mrg 
     61  1.1  mrg bool
     62  1.1  mrg fur_source::get_operand (irange &r, tree expr)
     63  1.1  mrg {
     64  1.1  mrg   return m_query->range_of_expr (r, expr);
     65  1.1  mrg }
     66  1.1  mrg 
     67  1.1  mrg // Evaluate EXPR for this stmt as a PHI argument on edge E.  Use the current
     68  1.1  mrg // range_query to get the range on the edge.
     69  1.1  mrg 
     70  1.1  mrg bool
     71  1.1  mrg fur_source::get_phi_operand (irange &r, tree expr, edge e)
     72  1.1  mrg {
     73  1.1  mrg   return m_query->range_on_edge (r, e, expr);
     74  1.1  mrg }
     75  1.1  mrg 
     76  1.1  mrg // Default is no relation.
     77  1.1  mrg 
     78  1.1  mrg relation_kind
     79  1.1  mrg fur_source::query_relation (tree op1 ATTRIBUTE_UNUSED,
     80  1.1  mrg 			    tree op2 ATTRIBUTE_UNUSED)
     81  1.1  mrg {
     82  1.1  mrg   return VREL_NONE;
     83  1.1  mrg }
     84  1.1  mrg 
     85  1.1  mrg // Default registers nothing.
     86  1.1  mrg 
     87  1.1  mrg void
     88  1.1  mrg fur_source::register_relation (gimple *s ATTRIBUTE_UNUSED,
     89  1.1  mrg 			       relation_kind k ATTRIBUTE_UNUSED,
     90  1.1  mrg 			       tree op1 ATTRIBUTE_UNUSED,
     91  1.1  mrg 			       tree op2 ATTRIBUTE_UNUSED)
     92  1.1  mrg {
     93  1.1  mrg }
     94  1.1  mrg 
     95  1.1  mrg // Default registers nothing.
     96  1.1  mrg 
     97  1.1  mrg void
     98  1.1  mrg fur_source::register_relation (edge e ATTRIBUTE_UNUSED,
     99  1.1  mrg 			       relation_kind k ATTRIBUTE_UNUSED,
    100  1.1  mrg 			       tree op1 ATTRIBUTE_UNUSED,
    101  1.1  mrg 			       tree op2 ATTRIBUTE_UNUSED)
    102  1.1  mrg {
    103  1.1  mrg }
    104  1.1  mrg 
    105  1.1  mrg // This version of fur_source will pick a range up off an edge.
    106  1.1  mrg 
    107  1.1  mrg class fur_edge : public fur_source
    108  1.1  mrg {
    109  1.1  mrg public:
    110  1.1  mrg   fur_edge (edge e, range_query *q = NULL);
    111  1.1  mrg   virtual bool get_operand (irange &r, tree expr) OVERRIDE;
    112  1.1  mrg   virtual bool get_phi_operand (irange &r, tree expr, edge e) OVERRIDE;
    113  1.1  mrg private:
    114  1.1  mrg   edge m_edge;
    115  1.1  mrg };
    116  1.1  mrg 
    117  1.1  mrg // Instantiate an edge based fur_source.
    118  1.1  mrg 
    119  1.1  mrg inline
    120  1.1  mrg fur_edge::fur_edge (edge e, range_query *q) : fur_source (q)
    121  1.1  mrg {
    122  1.1  mrg   m_edge = e;
    123  1.1  mrg }
    124  1.1  mrg 
    125  1.1  mrg // Get the value of EXPR on edge m_edge.
    126  1.1  mrg 
    127  1.1  mrg bool
    128  1.1  mrg fur_edge::get_operand (irange &r, tree expr)
    129  1.1  mrg {
    130  1.1  mrg   return m_query->range_on_edge (r, m_edge, expr);
    131  1.1  mrg }
    132  1.1  mrg 
    133  1.1  mrg // Evaluate EXPR for this stmt as a PHI argument on edge E.  Use the current
    134  1.1  mrg // range_query to get the range on the edge.
    135  1.1  mrg 
    136  1.1  mrg bool
    137  1.1  mrg fur_edge::get_phi_operand (irange &r, tree expr, edge e)
    138  1.1  mrg {
    139  1.1  mrg   // Edge to edge recalculations not supoprted yet, until we sort it out.
    140  1.1  mrg   gcc_checking_assert (e == m_edge);
    141  1.1  mrg   return m_query->range_on_edge (r, e, expr);
    142  1.1  mrg }
    143  1.1  mrg 
    144  1.1  mrg // Instantiate a stmt based fur_source.
    145  1.1  mrg 
    146  1.1  mrg fur_stmt::fur_stmt (gimple *s, range_query *q) : fur_source (q)
    147  1.1  mrg {
    148  1.1  mrg   m_stmt = s;
    149  1.1  mrg }
    150  1.1  mrg 
    151  1.1  mrg // Retreive range of EXPR as it occurs as a use on stmt M_STMT.
    152  1.1  mrg 
    153  1.1  mrg bool
    154  1.1  mrg fur_stmt::get_operand (irange &r, tree expr)
    155  1.1  mrg {
    156  1.1  mrg   return m_query->range_of_expr (r, expr, m_stmt);
    157  1.1  mrg }
    158  1.1  mrg 
    159  1.1  mrg // Evaluate EXPR for this stmt as a PHI argument on edge E.  Use the current
    160  1.1  mrg // range_query to get the range on the edge.
    161  1.1  mrg 
    162  1.1  mrg bool
    163  1.1  mrg fur_stmt::get_phi_operand (irange &r, tree expr, edge e)
    164  1.1  mrg {
    165  1.1  mrg   // Pick up the range of expr from edge E.
    166  1.1  mrg   fur_edge e_src (e, m_query);
    167  1.1  mrg   return e_src.get_operand (r, expr);
    168  1.1  mrg }
    169  1.1  mrg 
    170  1.1  mrg // Return relation based from m_stmt.
    171  1.1  mrg 
    172  1.1  mrg relation_kind
    173  1.1  mrg fur_stmt::query_relation (tree op1, tree op2)
    174  1.1  mrg {
    175  1.1  mrg   return m_query->query_relation (m_stmt, op1, op2);
    176  1.1  mrg }
    177  1.1  mrg 
    178  1.1  mrg // Instantiate a stmt based fur_source with a GORI object.
    179  1.1  mrg 
    180  1.1  mrg 
    181  1.1  mrg fur_depend::fur_depend (gimple *s, gori_compute *gori, range_query *q)
    182  1.1  mrg   : fur_stmt (s, q)
    183  1.1  mrg {
    184  1.1  mrg   gcc_checking_assert (gori);
    185  1.1  mrg   m_gori = gori;
    186  1.1  mrg   // Set relations if there is an oracle in the range_query.
    187  1.1  mrg   // This will enable registering of relationships as they are discovered.
    188  1.1  mrg   m_oracle = q->oracle ();
    189  1.1  mrg 
    190  1.1  mrg }
    191  1.1  mrg 
    192  1.1  mrg // Register a relation on a stmt if there is an oracle.
    193  1.1  mrg 
    194  1.1  mrg void
    195  1.1  mrg fur_depend::register_relation (gimple *s, relation_kind k, tree op1, tree op2)
    196  1.1  mrg {
    197  1.1  mrg   if (m_oracle)
    198  1.1  mrg     m_oracle->register_stmt (s, k, op1, op2);
    199  1.1  mrg }
    200  1.1  mrg 
    201  1.1  mrg // Register a relation on an edge if there is an oracle.
    202  1.1  mrg 
    203  1.1  mrg void
    204  1.1  mrg fur_depend::register_relation (edge e, relation_kind k, tree op1, tree op2)
    205  1.1  mrg {
    206  1.1  mrg   if (m_oracle)
    207  1.1  mrg     m_oracle->register_edge (e, k, op1, op2);
    208  1.1  mrg }
    209  1.1  mrg 
    210  1.1  mrg // This version of fur_source will pick a range up from a list of ranges
    211  1.1  mrg // supplied by the caller.
    212  1.1  mrg 
    213  1.1  mrg class fur_list : public fur_source
    214  1.1  mrg {
    215  1.1  mrg public:
    216  1.1  mrg   fur_list (irange &r1);
    217  1.1  mrg   fur_list (irange &r1, irange &r2);
    218  1.1  mrg   fur_list (unsigned num, irange *list);
    219  1.1  mrg   virtual bool get_operand (irange &r, tree expr) OVERRIDE;
    220  1.1  mrg   virtual bool get_phi_operand (irange &r, tree expr, edge e) OVERRIDE;
    221  1.1  mrg private:
    222  1.1  mrg   int_range_max m_local[2];
    223  1.1  mrg   irange *m_list;
    224  1.1  mrg   unsigned m_index;
    225  1.1  mrg   unsigned m_limit;
    226  1.1  mrg };
    227  1.1  mrg 
    228  1.1  mrg // One range supplied for unary operations.
    229  1.1  mrg 
    230  1.1  mrg fur_list::fur_list (irange &r1) : fur_source (NULL)
    231  1.1  mrg {
    232  1.1  mrg   m_list = m_local;
    233  1.1  mrg   m_index = 0;
    234  1.1  mrg   m_limit = 1;
    235  1.1  mrg   m_local[0] = r1;
    236  1.1  mrg }
    237  1.1  mrg 
    238  1.1  mrg // Two ranges supplied for binary operations.
    239  1.1  mrg 
    240  1.1  mrg fur_list::fur_list (irange &r1, irange &r2) : fur_source (NULL)
    241  1.1  mrg {
    242  1.1  mrg   m_list = m_local;
    243  1.1  mrg   m_index = 0;
    244  1.1  mrg   m_limit = 2;
    245  1.1  mrg   m_local[0] = r1;
    246  1.1  mrg   m_local[1] = r2;
    247  1.1  mrg }
    248  1.1  mrg 
    249  1.1  mrg // Arbitrary number of ranges in a vector.
    250  1.1  mrg 
    251  1.1  mrg fur_list::fur_list (unsigned num, irange *list) : fur_source (NULL)
    252  1.1  mrg {
    253  1.1  mrg   m_list = list;
    254  1.1  mrg   m_index = 0;
    255  1.1  mrg   m_limit = num;
    256  1.1  mrg }
    257  1.1  mrg 
    258  1.1  mrg // Get the next operand from the vector, ensure types are compatible.
    259  1.1  mrg 
    260  1.1  mrg bool
    261  1.1  mrg fur_list::get_operand (irange &r, tree expr)
    262  1.1  mrg {
    263  1.1  mrg   if (m_index >= m_limit)
    264  1.1  mrg     return m_query->range_of_expr (r, expr);
    265  1.1  mrg   r = m_list[m_index++];
    266  1.1  mrg   gcc_checking_assert (range_compatible_p (TREE_TYPE (expr), r.type ()));
    267  1.1  mrg   return true;
    268  1.1  mrg }
    269  1.1  mrg 
    270  1.1  mrg // This will simply pick the next operand from the vector.
    271  1.1  mrg bool
    272  1.1  mrg fur_list::get_phi_operand (irange &r, tree expr, edge e ATTRIBUTE_UNUSED)
    273  1.1  mrg {
    274  1.1  mrg   return get_operand (r, expr);
    275  1.1  mrg }
    276  1.1  mrg 
    277  1.1  mrg // Fold stmt S into range R using R1 as the first operand.
    278  1.1  mrg 
    279  1.1  mrg bool
    280  1.1  mrg fold_range (irange &r, gimple *s, irange &r1)
    281  1.1  mrg {
    282  1.1  mrg   fold_using_range f;
    283  1.1  mrg   fur_list src (r1);
    284  1.1  mrg   return f.fold_stmt (r, s, src);
    285  1.1  mrg }
    286  1.1  mrg 
    287  1.1  mrg // Fold stmt S into range R using R1  and R2 as the first two operands.
    288  1.1  mrg 
    289  1.1  mrg bool
    290  1.1  mrg fold_range (irange &r, gimple *s, irange &r1, irange &r2)
    291  1.1  mrg {
    292  1.1  mrg   fold_using_range f;
    293  1.1  mrg   fur_list src (r1, r2);
    294  1.1  mrg   return f.fold_stmt (r, s, src);
    295  1.1  mrg }
    296  1.1  mrg 
    297  1.1  mrg // Fold stmt S into range R using NUM_ELEMENTS from VECTOR as the initial
    298  1.1  mrg // operands encountered.
    299  1.1  mrg 
    300  1.1  mrg bool
    301  1.1  mrg fold_range (irange &r, gimple *s, unsigned num_elements, irange *vector)
    302  1.1  mrg {
    303  1.1  mrg   fold_using_range f;
    304  1.1  mrg   fur_list src (num_elements, vector);
    305  1.1  mrg   return f.fold_stmt (r, s, src);
    306  1.1  mrg }
    307  1.1  mrg 
    308  1.1  mrg // Fold stmt S into range R using range query Q.
    309  1.1  mrg 
    310  1.1  mrg bool
    311  1.1  mrg fold_range (irange &r, gimple *s, range_query *q)
    312  1.1  mrg {
    313  1.1  mrg   fold_using_range f;
    314  1.1  mrg   fur_stmt src (s, q);
    315  1.1  mrg   return f.fold_stmt (r, s, src);
    316  1.1  mrg }
    317  1.1  mrg 
    318  1.1  mrg // Recalculate stmt S into R using range query Q as if it were on edge ON_EDGE.
    319  1.1  mrg 
    320  1.1  mrg bool
    321  1.1  mrg fold_range (irange &r, gimple *s, edge on_edge, range_query *q)
    322  1.1  mrg {
    323  1.1  mrg   fold_using_range f;
    324  1.1  mrg   fur_edge src (on_edge, q);
    325  1.1  mrg   return f.fold_stmt (r, s, src);
    326  1.1  mrg }
    327  1.1  mrg 
    328  1.1  mrg // -------------------------------------------------------------------------
    329  1.1  mrg 
    330  1.1  mrg // Adjust the range for a pointer difference where the operands came
    331  1.1  mrg // from a memchr.
    332  1.1  mrg //
    333  1.1  mrg // This notices the following sequence:
    334  1.1  mrg //
    335  1.1  mrg //	def = __builtin_memchr (arg, 0, sz)
    336  1.1  mrg //	n = def - arg
    337  1.1  mrg //
    338  1.1  mrg // The range for N can be narrowed to [0, PTRDIFF_MAX - 1].
    339  1.1  mrg 
    340  1.1  mrg static void
    341  1.1  mrg adjust_pointer_diff_expr (irange &res, const gimple *diff_stmt)
    342  1.1  mrg {
    343  1.1  mrg   tree op0 = gimple_assign_rhs1 (diff_stmt);
    344  1.1  mrg   tree op1 = gimple_assign_rhs2 (diff_stmt);
    345  1.1  mrg   tree op0_ptype = TREE_TYPE (TREE_TYPE (op0));
    346  1.1  mrg   tree op1_ptype = TREE_TYPE (TREE_TYPE (op1));
    347  1.1  mrg   gimple *call;
    348  1.1  mrg 
    349  1.1  mrg   if (TREE_CODE (op0) == SSA_NAME
    350  1.1  mrg       && TREE_CODE (op1) == SSA_NAME
    351  1.1  mrg       && (call = SSA_NAME_DEF_STMT (op0))
    352  1.1  mrg       && is_gimple_call (call)
    353  1.1  mrg       && gimple_call_builtin_p (call, BUILT_IN_MEMCHR)
    354  1.1  mrg       && TYPE_MODE (op0_ptype) == TYPE_MODE (char_type_node)
    355  1.1  mrg       && TYPE_PRECISION (op0_ptype) == TYPE_PRECISION (char_type_node)
    356  1.1  mrg       && TYPE_MODE (op1_ptype) == TYPE_MODE (char_type_node)
    357  1.1  mrg       && TYPE_PRECISION (op1_ptype) == TYPE_PRECISION (char_type_node)
    358  1.1  mrg       && gimple_call_builtin_p (call, BUILT_IN_MEMCHR)
    359  1.1  mrg       && vrp_operand_equal_p (op1, gimple_call_arg (call, 0))
    360  1.1  mrg       && integer_zerop (gimple_call_arg (call, 1)))
    361  1.1  mrg     {
    362  1.1  mrg       tree max = vrp_val_max (ptrdiff_type_node);
    363  1.1  mrg       unsigned prec = TYPE_PRECISION (TREE_TYPE (max));
    364  1.1  mrg       wide_int wmaxm1 = wi::to_wide (max, prec) - 1;
    365  1.1  mrg       res.intersect (wi::zero (prec), wmaxm1);
    366  1.1  mrg     }
    367  1.1  mrg }
    368  1.1  mrg 
    369  1.1  mrg // Adjust the range for an IMAGPART_EXPR.
    370  1.1  mrg 
    371  1.1  mrg static void
    372  1.1  mrg adjust_imagpart_expr (irange &res, const gimple *stmt)
    373  1.1  mrg {
    374  1.1  mrg   tree name = TREE_OPERAND (gimple_assign_rhs1 (stmt), 0);
    375  1.1  mrg 
    376  1.1  mrg   if (TREE_CODE (name) != SSA_NAME || !SSA_NAME_DEF_STMT (name))
    377  1.1  mrg     return;
    378  1.1  mrg 
    379  1.1  mrg   gimple *def_stmt = SSA_NAME_DEF_STMT (name);
    380  1.1  mrg   if (is_gimple_call (def_stmt) && gimple_call_internal_p (def_stmt))
    381  1.1  mrg     {
    382  1.1  mrg       switch (gimple_call_internal_fn (def_stmt))
    383  1.1  mrg 	{
    384  1.1  mrg 	case IFN_ADD_OVERFLOW:
    385  1.1  mrg 	case IFN_SUB_OVERFLOW:
    386  1.1  mrg 	case IFN_MUL_OVERFLOW:
    387  1.1  mrg 	case IFN_ATOMIC_COMPARE_EXCHANGE:
    388  1.1  mrg 	  {
    389  1.1  mrg 	    int_range<2> r;
    390  1.1  mrg 	    r.set_varying (boolean_type_node);
    391  1.1  mrg 	    tree type = TREE_TYPE (gimple_assign_lhs (stmt));
    392  1.1  mrg 	    range_cast (r, type);
    393  1.1  mrg 	    res.intersect (r);
    394  1.1  mrg 	  }
    395  1.1  mrg 	default:
    396  1.1  mrg 	  break;
    397  1.1  mrg 	}
    398  1.1  mrg       return;
    399  1.1  mrg     }
    400  1.1  mrg   if (is_gimple_assign (def_stmt)
    401  1.1  mrg       && gimple_assign_rhs_code (def_stmt) == COMPLEX_CST)
    402  1.1  mrg     {
    403  1.1  mrg       tree cst = gimple_assign_rhs1 (def_stmt);
    404  1.1  mrg       if (TREE_CODE (cst) == COMPLEX_CST)
    405  1.1  mrg 	{
    406  1.1  mrg 	  wide_int imag = wi::to_wide (TREE_IMAGPART (cst));
    407  1.1  mrg 	  res.intersect (imag, imag);
    408  1.1  mrg 	}
    409  1.1  mrg     }
    410  1.1  mrg }
    411  1.1  mrg 
    412  1.1  mrg // Adjust the range for a REALPART_EXPR.
    413  1.1  mrg 
    414  1.1  mrg static void
    415  1.1  mrg adjust_realpart_expr (irange &res, const gimple *stmt)
    416  1.1  mrg {
    417  1.1  mrg   tree name = TREE_OPERAND (gimple_assign_rhs1 (stmt), 0);
    418  1.1  mrg 
    419  1.1  mrg   if (TREE_CODE (name) != SSA_NAME)
    420  1.1  mrg     return;
    421  1.1  mrg 
    422  1.1  mrg   gimple *def_stmt = SSA_NAME_DEF_STMT (name);
    423  1.1  mrg   if (!SSA_NAME_DEF_STMT (name))
    424  1.1  mrg     return;
    425  1.1  mrg 
    426  1.1  mrg   if (is_gimple_assign (def_stmt)
    427  1.1  mrg       && gimple_assign_rhs_code (def_stmt) == COMPLEX_CST)
    428  1.1  mrg     {
    429  1.1  mrg       tree cst = gimple_assign_rhs1 (def_stmt);
    430  1.1  mrg       if (TREE_CODE (cst) == COMPLEX_CST)
    431  1.1  mrg 	{
    432  1.1  mrg 	  tree imag = TREE_REALPART (cst);
    433  1.1  mrg 	  int_range<2> tmp (imag, imag);
    434  1.1  mrg 	  res.intersect (tmp);
    435  1.1  mrg 	}
    436  1.1  mrg     }
    437  1.1  mrg }
    438  1.1  mrg 
    439  1.1  mrg // This function looks for situations when walking the use/def chains
    440  1.1  mrg // may provide additonal contextual range information not exposed on
    441  1.1  mrg // this statement.
    442  1.1  mrg 
    443  1.1  mrg static void
    444  1.1  mrg gimple_range_adjustment (irange &res, const gimple *stmt)
    445  1.1  mrg {
    446  1.1  mrg   switch (gimple_expr_code (stmt))
    447  1.1  mrg     {
    448  1.1  mrg     case POINTER_DIFF_EXPR:
    449  1.1  mrg       adjust_pointer_diff_expr (res, stmt);
    450  1.1  mrg       return;
    451  1.1  mrg 
    452  1.1  mrg     case IMAGPART_EXPR:
    453  1.1  mrg       adjust_imagpart_expr (res, stmt);
    454  1.1  mrg       return;
    455  1.1  mrg 
    456  1.1  mrg     case REALPART_EXPR:
    457  1.1  mrg       adjust_realpart_expr (res, stmt);
    458  1.1  mrg       return;
    459  1.1  mrg 
    460  1.1  mrg     default:
    461  1.1  mrg       break;
    462  1.1  mrg     }
    463  1.1  mrg }
    464  1.1  mrg 
    465  1.1  mrg // Return the base of the RHS of an assignment.
    466  1.1  mrg 
    467  1.1  mrg static tree
    468  1.1  mrg gimple_range_base_of_assignment (const gimple *stmt)
    469  1.1  mrg {
    470  1.1  mrg   gcc_checking_assert (gimple_code (stmt) == GIMPLE_ASSIGN);
    471  1.1  mrg   tree op1 = gimple_assign_rhs1 (stmt);
    472  1.1  mrg   if (gimple_assign_rhs_code (stmt) == ADDR_EXPR)
    473  1.1  mrg     return get_base_address (TREE_OPERAND (op1, 0));
    474  1.1  mrg   return op1;
    475  1.1  mrg }
    476  1.1  mrg 
    477  1.1  mrg // Return the first operand of this statement if it is a valid operand
    478  1.1  mrg // supported by ranges, otherwise return NULL_TREE.  Special case is
    479  1.1  mrg // &(SSA_NAME expr), return the SSA_NAME instead of the ADDR expr.
    480  1.1  mrg 
    481  1.1  mrg tree
    482  1.1  mrg gimple_range_operand1 (const gimple *stmt)
    483  1.1  mrg {
    484  1.1  mrg   gcc_checking_assert (gimple_range_handler (stmt));
    485  1.1  mrg 
    486  1.1  mrg   switch (gimple_code (stmt))
    487  1.1  mrg     {
    488  1.1  mrg       case GIMPLE_COND:
    489  1.1  mrg 	return gimple_cond_lhs (stmt);
    490  1.1  mrg       case GIMPLE_ASSIGN:
    491  1.1  mrg 	{
    492  1.1  mrg 	  tree base = gimple_range_base_of_assignment (stmt);
    493  1.1  mrg 	  if (base && TREE_CODE (base) == MEM_REF)
    494  1.1  mrg 	    {
    495  1.1  mrg 	      // If the base address is an SSA_NAME, we return it
    496  1.1  mrg 	      // here.  This allows processing of the range of that
    497  1.1  mrg 	      // name, while the rest of the expression is simply
    498  1.1  mrg 	      // ignored.  The code in range_ops will see the
    499  1.1  mrg 	      // ADDR_EXPR and do the right thing.
    500  1.1  mrg 	      tree ssa = TREE_OPERAND (base, 0);
    501  1.1  mrg 	      if (TREE_CODE (ssa) == SSA_NAME)
    502  1.1  mrg 		return ssa;
    503  1.1  mrg 	    }
    504  1.1  mrg 	  return base;
    505  1.1  mrg 	}
    506  1.1  mrg       default:
    507  1.1  mrg 	break;
    508  1.1  mrg     }
    509  1.1  mrg   return NULL;
    510  1.1  mrg }
    511  1.1  mrg 
    512  1.1  mrg // Return the second operand of statement STMT, otherwise return NULL_TREE.
    513  1.1  mrg 
    514  1.1  mrg tree
    515  1.1  mrg gimple_range_operand2 (const gimple *stmt)
    516  1.1  mrg {
    517  1.1  mrg   gcc_checking_assert (gimple_range_handler (stmt));
    518  1.1  mrg 
    519  1.1  mrg   switch (gimple_code (stmt))
    520  1.1  mrg     {
    521  1.1  mrg     case GIMPLE_COND:
    522  1.1  mrg       return gimple_cond_rhs (stmt);
    523  1.1  mrg     case GIMPLE_ASSIGN:
    524  1.1  mrg       if (gimple_num_ops (stmt) >= 3)
    525  1.1  mrg 	return gimple_assign_rhs2 (stmt);
    526  1.1  mrg     default:
    527  1.1  mrg       break;
    528  1.1  mrg     }
    529  1.1  mrg   return NULL_TREE;
    530  1.1  mrg }
    531  1.1  mrg 
    532  1.1  mrg // Calculate a range for statement S and return it in R. If NAME is provided it
    533  1.1  mrg // represents the SSA_NAME on the LHS of the statement. It is only required
    534  1.1  mrg // if there is more than one lhs/output.  If a range cannot
    535  1.1  mrg // be calculated, return false.
    536  1.1  mrg 
    537  1.1  mrg bool
    538  1.1  mrg fold_using_range::fold_stmt (irange &r, gimple *s, fur_source &src, tree name)
    539  1.1  mrg {
    540  1.1  mrg   bool res = false;
    541  1.1  mrg   // If name and S are specified, make sure it is an LHS of S.
    542  1.1  mrg   gcc_checking_assert (!name || !gimple_get_lhs (s) ||
    543  1.1  mrg 		       name == gimple_get_lhs (s));
    544  1.1  mrg 
    545  1.1  mrg   if (!name)
    546  1.1  mrg     name = gimple_get_lhs (s);
    547  1.1  mrg 
    548  1.1  mrg   // Process addresses.
    549  1.1  mrg   if (gimple_code (s) == GIMPLE_ASSIGN
    550  1.1  mrg       && gimple_assign_rhs_code (s) == ADDR_EXPR)
    551  1.1  mrg     return range_of_address (r, s, src);
    552  1.1  mrg 
    553  1.1  mrg   if (gimple_range_handler (s))
    554  1.1  mrg     res = range_of_range_op (r, s, src);
    555  1.1  mrg   else if (is_a<gphi *>(s))
    556  1.1  mrg     res = range_of_phi (r, as_a<gphi *> (s), src);
    557  1.1  mrg   else if (is_a<gcall *>(s))
    558  1.1  mrg     res = range_of_call (r, as_a<gcall *> (s), src);
    559  1.1  mrg   else if (is_a<gassign *> (s) && gimple_assign_rhs_code (s) == COND_EXPR)
    560  1.1  mrg     res = range_of_cond_expr (r, as_a<gassign *> (s), src);
    561  1.1  mrg 
    562  1.1  mrg   if (!res)
    563  1.1  mrg     {
    564  1.1  mrg       // If no name specified or range is unsupported, bail.
    565  1.1  mrg       if (!name || !gimple_range_ssa_p (name))
    566  1.1  mrg 	return false;
    567  1.1  mrg       // We don't understand the stmt, so return the global range.
    568  1.1  mrg       r = gimple_range_global (name);
    569  1.1  mrg       return true;
    570  1.1  mrg     }
    571  1.1  mrg 
    572  1.1  mrg   if (r.undefined_p ())
    573  1.1  mrg     return true;
    574  1.1  mrg 
    575  1.1  mrg   // We sometimes get compatible types copied from operands, make sure
    576  1.1  mrg   // the correct type is being returned.
    577  1.1  mrg   if (name && TREE_TYPE (name) != r.type ())
    578  1.1  mrg     {
    579  1.1  mrg       gcc_checking_assert (range_compatible_p (r.type (), TREE_TYPE (name)));
    580  1.1  mrg       range_cast (r, TREE_TYPE (name));
    581  1.1  mrg     }
    582  1.1  mrg   return true;
    583  1.1  mrg }
    584  1.1  mrg 
    585  1.1  mrg // Calculate a range for range_op statement S and return it in R.  If any
    586  1.1  mrg // If a range cannot be calculated, return false.
    587  1.1  mrg 
    588  1.1  mrg bool
    589  1.1  mrg fold_using_range::range_of_range_op (irange &r, gimple *s, fur_source &src)
    590  1.1  mrg {
    591  1.1  mrg   int_range_max range1, range2;
    592  1.1  mrg   tree type = gimple_range_type (s);
    593  1.1  mrg   if (!type)
    594  1.1  mrg     return false;
    595  1.1  mrg   range_operator *handler = gimple_range_handler (s);
    596  1.1  mrg   gcc_checking_assert (handler);
    597  1.1  mrg 
    598  1.1  mrg   tree lhs = gimple_get_lhs (s);
    599  1.1  mrg   tree op1 = gimple_range_operand1 (s);
    600  1.1  mrg   tree op2 = gimple_range_operand2 (s);
    601  1.1  mrg 
    602  1.1  mrg   if (src.get_operand (range1, op1))
    603  1.1  mrg     {
    604  1.1  mrg       if (!op2)
    605  1.1  mrg 	{
    606  1.1  mrg 	  // Fold range, and register any dependency if available.
    607  1.1  mrg 	  int_range<2> r2 (type);
    608  1.1  mrg 	  handler->fold_range (r, type, range1, r2);
    609  1.1  mrg 	  if (lhs && gimple_range_ssa_p (op1))
    610  1.1  mrg 	    {
    611  1.1  mrg 	      if (src.gori ())
    612  1.1  mrg 		src.gori ()->register_dependency (lhs, op1);
    613  1.1  mrg 	      relation_kind rel;
    614  1.1  mrg 	      rel = handler->lhs_op1_relation (r, range1, range1);
    615  1.1  mrg 	      if (rel != VREL_NONE)
    616  1.1  mrg 		src.register_relation (s, rel, lhs, op1);
    617  1.1  mrg 	    }
    618  1.1  mrg 	}
    619  1.1  mrg       else if (src.get_operand (range2, op2))
    620  1.1  mrg 	{
    621  1.1  mrg 	  relation_kind rel = src.query_relation (op1, op2);
    622  1.1  mrg 	  if (dump_file && (dump_flags & TDF_DETAILS) && rel != VREL_NONE)
    623  1.1  mrg 	    {
    624  1.1  mrg 	      fprintf (dump_file, " folding with relation ");
    625  1.1  mrg 	      print_generic_expr (dump_file, op1, TDF_SLIM);
    626  1.1  mrg 	      print_relation (dump_file, rel);
    627  1.1  mrg 	      print_generic_expr (dump_file, op2, TDF_SLIM);
    628  1.1  mrg 	      fputc ('\n', dump_file);
    629  1.1  mrg 	    }
    630  1.1  mrg 	  // Fold range, and register any dependency if available.
    631  1.1  mrg 	  handler->fold_range (r, type, range1, range2, rel);
    632  1.1  mrg 	  relation_fold_and_or (r, s, src);
    633  1.1  mrg 	  if (lhs)
    634  1.1  mrg 	    {
    635  1.1  mrg 	      if (src.gori ())
    636  1.1  mrg 		{
    637  1.1  mrg 		  src.gori ()->register_dependency (lhs, op1);
    638  1.1  mrg 		  src.gori ()->register_dependency (lhs, op2);
    639  1.1  mrg 		}
    640  1.1  mrg 	      if (gimple_range_ssa_p (op1))
    641  1.1  mrg 		{
    642  1.1  mrg 		  rel = handler->lhs_op1_relation (r, range1, range2);
    643  1.1  mrg 		  if (rel != VREL_NONE)
    644  1.1  mrg 		    src.register_relation (s, rel, lhs, op1);
    645  1.1  mrg 		}
    646  1.1  mrg 	      if (gimple_range_ssa_p (op2))
    647  1.1  mrg 		{
    648  1.1  mrg 		  rel= handler->lhs_op2_relation (r, range1, range2);
    649  1.1  mrg 		  if (rel != VREL_NONE)
    650  1.1  mrg 		    src.register_relation (s, rel, lhs, op2);
    651  1.1  mrg 		}
    652  1.1  mrg 	    }
    653  1.1  mrg 	  // Check for an existing BB, as we maybe asked to fold an
    654  1.1  mrg 	  // artificial statement not in the CFG.
    655  1.1  mrg 	  else if (is_a<gcond *> (s) && gimple_bb (s))
    656  1.1  mrg 	    {
    657  1.1  mrg 	      basic_block bb = gimple_bb (s);
    658  1.1  mrg 	      edge e0 = EDGE_SUCC (bb, 0);
    659  1.1  mrg 	      edge e1 = EDGE_SUCC (bb, 1);
    660  1.1  mrg 
    661  1.1  mrg 	      if (!single_pred_p (e0->dest))
    662  1.1  mrg 		e0 = NULL;
    663  1.1  mrg 	      if (!single_pred_p (e1->dest))
    664  1.1  mrg 		e1 = NULL;
    665  1.1  mrg 	      src.register_outgoing_edges (as_a<gcond *> (s), r, e0, e1);
    666  1.1  mrg 	    }
    667  1.1  mrg 	}
    668  1.1  mrg       else
    669  1.1  mrg 	r.set_varying (type);
    670  1.1  mrg     }
    671  1.1  mrg   else
    672  1.1  mrg     r.set_varying (type);
    673  1.1  mrg   // Make certain range-op adjustments that aren't handled any other way.
    674  1.1  mrg   gimple_range_adjustment (r, s);
    675  1.1  mrg   return true;
    676  1.1  mrg }
    677  1.1  mrg 
    678  1.1  mrg // Calculate the range of an assignment containing an ADDR_EXPR.
    679  1.1  mrg // Return the range in R.
    680  1.1  mrg // If a range cannot be calculated, set it to VARYING and return true.
    681  1.1  mrg 
    682  1.1  mrg bool
    683  1.1  mrg fold_using_range::range_of_address (irange &r, gimple *stmt, fur_source &src)
    684  1.1  mrg {
    685  1.1  mrg   gcc_checking_assert (gimple_code (stmt) == GIMPLE_ASSIGN);
    686  1.1  mrg   gcc_checking_assert (gimple_assign_rhs_code (stmt) == ADDR_EXPR);
    687  1.1  mrg 
    688  1.1  mrg   bool strict_overflow_p;
    689  1.1  mrg   tree expr = gimple_assign_rhs1 (stmt);
    690  1.1  mrg   poly_int64 bitsize, bitpos;
    691  1.1  mrg   tree offset;
    692  1.1  mrg   machine_mode mode;
    693  1.1  mrg   int unsignedp, reversep, volatilep;
    694  1.1  mrg   tree base = get_inner_reference (TREE_OPERAND (expr, 0), &bitsize,
    695  1.1  mrg 				   &bitpos, &offset, &mode, &unsignedp,
    696  1.1  mrg 				   &reversep, &volatilep);
    697  1.1  mrg 
    698  1.1  mrg 
    699  1.1  mrg   if (base != NULL_TREE
    700  1.1  mrg       && TREE_CODE (base) == MEM_REF
    701  1.1  mrg       && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
    702  1.1  mrg     {
    703  1.1  mrg       tree ssa = TREE_OPERAND (base, 0);
    704  1.1  mrg       tree lhs = gimple_get_lhs (stmt);
    705  1.1  mrg       if (lhs && gimple_range_ssa_p (ssa) && src.gori ())
    706  1.1  mrg 	src.gori ()->register_dependency (lhs, ssa);
    707  1.1  mrg       gcc_checking_assert (irange::supports_type_p (TREE_TYPE (ssa)));
    708  1.1  mrg       src.get_operand (r, ssa);
    709  1.1  mrg       range_cast (r, TREE_TYPE (gimple_assign_rhs1 (stmt)));
    710  1.1  mrg 
    711  1.1  mrg       poly_offset_int off = 0;
    712  1.1  mrg       bool off_cst = false;
    713  1.1  mrg       if (offset == NULL_TREE || TREE_CODE (offset) == INTEGER_CST)
    714  1.1  mrg 	{
    715  1.1  mrg 	  off = mem_ref_offset (base);
    716  1.1  mrg 	  if (offset)
    717  1.1  mrg 	    off += poly_offset_int::from (wi::to_poly_wide (offset),
    718  1.1  mrg 					  SIGNED);
    719  1.1  mrg 	  off <<= LOG2_BITS_PER_UNIT;
    720  1.1  mrg 	  off += bitpos;
    721  1.1  mrg 	  off_cst = true;
    722  1.1  mrg 	}
    723  1.1  mrg       /* If &X->a is equal to X, the range of X is the result.  */
    724  1.1  mrg       if (off_cst && known_eq (off, 0))
    725  1.1  mrg 	return true;
    726  1.1  mrg       else if (flag_delete_null_pointer_checks
    727  1.1  mrg 	       && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (expr)))
    728  1.1  mrg 	{
    729  1.1  mrg 	  /* For -fdelete-null-pointer-checks -fno-wrapv-pointer we don't
    730  1.1  mrg 	     allow going from non-NULL pointer to NULL.  */
    731  1.1  mrg 	  if (!range_includes_zero_p (&r))
    732  1.1  mrg 	    {
    733  1.1  mrg 	      /* We could here instead adjust r by off >> LOG2_BITS_PER_UNIT
    734  1.1  mrg 		 using POINTER_PLUS_EXPR if off_cst and just fall back to
    735  1.1  mrg 		 this.  */
    736  1.1  mrg 	      r = range_nonzero (TREE_TYPE (gimple_assign_rhs1 (stmt)));
    737  1.1  mrg 	      return true;
    738  1.1  mrg 	    }
    739  1.1  mrg 	}
    740  1.1  mrg       /* If MEM_REF has a "positive" offset, consider it non-NULL
    741  1.1  mrg 	 always, for -fdelete-null-pointer-checks also "negative"
    742  1.1  mrg 	 ones.  Punt for unknown offsets (e.g. variable ones).  */
    743  1.1  mrg       if (!TYPE_OVERFLOW_WRAPS (TREE_TYPE (expr))
    744  1.1  mrg 	  && off_cst
    745  1.1  mrg 	  && known_ne (off, 0)
    746  1.1  mrg 	  && (flag_delete_null_pointer_checks || known_gt (off, 0)))
    747  1.1  mrg 	{
    748  1.1  mrg 	  r = range_nonzero (TREE_TYPE (gimple_assign_rhs1 (stmt)));
    749  1.1  mrg 	  return true;
    750  1.1  mrg 	}
    751  1.1  mrg       r = int_range<2> (TREE_TYPE (gimple_assign_rhs1 (stmt)));
    752  1.1  mrg       return true;
    753  1.1  mrg     }
    754  1.1  mrg 
    755  1.1  mrg   // Handle "= &a".
    756  1.1  mrg   if (tree_single_nonzero_warnv_p (expr, &strict_overflow_p))
    757  1.1  mrg     {
    758  1.1  mrg       r = range_nonzero (TREE_TYPE (gimple_assign_rhs1 (stmt)));
    759  1.1  mrg       return true;
    760  1.1  mrg     }
    761  1.1  mrg 
    762  1.1  mrg   // Otherwise return varying.
    763  1.1  mrg   r = int_range<2> (TREE_TYPE (gimple_assign_rhs1 (stmt)));
    764  1.1  mrg   return true;
    765  1.1  mrg }
    766  1.1  mrg 
    767  1.1  mrg // Calculate a range for phi statement S and return it in R.
    768  1.1  mrg // If a range cannot be calculated, return false.
    769  1.1  mrg 
    770  1.1  mrg bool
    771  1.1  mrg fold_using_range::range_of_phi (irange &r, gphi *phi, fur_source &src)
    772  1.1  mrg {
    773  1.1  mrg   tree phi_def = gimple_phi_result (phi);
    774  1.1  mrg   tree type = gimple_range_type (phi);
    775  1.1  mrg   int_range_max arg_range;
    776  1.1  mrg   int_range_max equiv_range;
    777  1.1  mrg   unsigned x;
    778  1.1  mrg 
    779  1.1  mrg   if (!type)
    780  1.1  mrg     return false;
    781  1.1  mrg 
    782  1.1  mrg   // Track if all executable arguments are the same.
    783  1.1  mrg   tree single_arg = NULL_TREE;
    784  1.1  mrg   bool seen_arg = false;
    785  1.1  mrg 
    786  1.1  mrg   // Start with an empty range, unioning in each argument's range.
    787  1.1  mrg   r.set_undefined ();
    788  1.1  mrg   for (x = 0; x < gimple_phi_num_args (phi); x++)
    789  1.1  mrg     {
    790  1.1  mrg       tree arg = gimple_phi_arg_def (phi, x);
    791  1.1  mrg       // An argument that is the same as the def provides no new range.
    792  1.1  mrg       if (arg == phi_def)
    793  1.1  mrg 	continue;
    794  1.1  mrg 
    795  1.1  mrg       edge e = gimple_phi_arg_edge (phi, x);
    796  1.1  mrg 
    797  1.1  mrg       // Get the range of the argument on its edge.
    798  1.1  mrg       src.get_phi_operand (arg_range, arg, e);
    799  1.1  mrg 
    800  1.1  mrg       if (!arg_range.undefined_p ())
    801  1.1  mrg 	{
    802  1.1  mrg 	  // Register potential dependencies for stale value tracking.
    803  1.1  mrg 	  // Likewise, if the incoming PHI argument is equivalent to this
    804  1.1  mrg 	  // PHI definition, it provides no new info.  Accumulate these ranges
    805  1.1  mrg 	  // in case all arguments are equivalences.
    806  1.1  mrg 	  if (src.query ()->query_relation (e, arg, phi_def, false) == EQ_EXPR)
    807  1.1  mrg 	    equiv_range.union_(arg_range);
    808  1.1  mrg 	  else
    809  1.1  mrg 	    r.union_ (arg_range);
    810  1.1  mrg 
    811  1.1  mrg 	  if (gimple_range_ssa_p (arg) && src.gori ())
    812  1.1  mrg 	    src.gori ()->register_dependency (phi_def, arg);
    813  1.1  mrg 
    814  1.1  mrg 	  // Track if all arguments are the same.
    815  1.1  mrg 	  if (!seen_arg)
    816  1.1  mrg 	    {
    817  1.1  mrg 	      seen_arg = true;
    818  1.1  mrg 	      single_arg = arg;
    819  1.1  mrg 	    }
    820  1.1  mrg 	  else if (single_arg != arg)
    821  1.1  mrg 	    single_arg = NULL_TREE;
    822  1.1  mrg 	}
    823  1.1  mrg 
    824  1.1  mrg       // Once the value reaches varying, stop looking.
    825  1.1  mrg       if (r.varying_p () && single_arg == NULL_TREE)
    826  1.1  mrg 	break;
    827  1.1  mrg     }
    828  1.1  mrg 
    829  1.1  mrg     // If all arguments were equivalences, use the equivalence ranges as no
    830  1.1  mrg     // arguments were processed.
    831  1.1  mrg     if (r.undefined_p () && !equiv_range.undefined_p ())
    832  1.1  mrg       r = equiv_range;
    833  1.1  mrg 
    834  1.1  mrg     // If the PHI boils down to a single effective argument, look at it.
    835  1.1  mrg     if (single_arg)
    836  1.1  mrg       {
    837  1.1  mrg 	// Symbolic arguments are equivalences.
    838  1.1  mrg 	if (gimple_range_ssa_p (single_arg))
    839  1.1  mrg 	  src.register_relation (phi, EQ_EXPR, phi_def, single_arg);
    840  1.1  mrg 	else if (src.get_operand (arg_range, single_arg)
    841  1.1  mrg 		 && arg_range.singleton_p ())
    842  1.1  mrg 	  {
    843  1.1  mrg 	    // Numerical arguments that are a constant can be returned as
    844  1.1  mrg 	    // the constant. This can help fold later cases where even this
    845  1.1  mrg 	    // constant might have been UNDEFINED via an unreachable edge.
    846  1.1  mrg 	    r = arg_range;
    847  1.1  mrg 	    return true;
    848  1.1  mrg 	  }
    849  1.1  mrg       }
    850  1.1  mrg 
    851  1.1  mrg   // If SCEV is available, query if this PHI has any knonwn values.
    852  1.1  mrg   if (scev_initialized_p () && !POINTER_TYPE_P (TREE_TYPE (phi_def)))
    853  1.1  mrg     {
    854  1.1  mrg       value_range loop_range;
    855  1.1  mrg       class loop *l = loop_containing_stmt (phi);
    856  1.1  mrg       if (l && loop_outer (l))
    857  1.1  mrg 	{
    858  1.1  mrg 	  range_of_ssa_name_with_loop_info (loop_range, phi_def, l, phi, src);
    859  1.1  mrg 	  if (!loop_range.varying_p ())
    860  1.1  mrg 	    {
    861  1.1  mrg 	      if (dump_file && (dump_flags & TDF_DETAILS))
    862  1.1  mrg 		{
    863  1.1  mrg 		  fprintf (dump_file, "   Loops range found for ");
    864  1.1  mrg 		  print_generic_expr (dump_file, phi_def, TDF_SLIM);
    865  1.1  mrg 		  fprintf (dump_file, ": ");
    866  1.1  mrg 		  loop_range.dump (dump_file);
    867  1.1  mrg 		  fprintf (dump_file, " and calculated range :");
    868  1.1  mrg 		  r.dump (dump_file);
    869  1.1  mrg 		  fprintf (dump_file, "\n");
    870  1.1  mrg 		}
    871  1.1  mrg 	      r.intersect (loop_range);
    872  1.1  mrg 	    }
    873  1.1  mrg 	}
    874  1.1  mrg     }
    875  1.1  mrg 
    876  1.1  mrg   return true;
    877  1.1  mrg }
    878  1.1  mrg 
    879  1.1  mrg // Calculate a range for call statement S and return it in R.
    880  1.1  mrg // If a range cannot be calculated, return false.
    881  1.1  mrg 
    882  1.1  mrg bool
    883  1.1  mrg fold_using_range::range_of_call (irange &r, gcall *call, fur_source &src)
    884  1.1  mrg {
    885  1.1  mrg   tree type = gimple_range_type (call);
    886  1.1  mrg   if (!type)
    887  1.1  mrg     return false;
    888  1.1  mrg 
    889  1.1  mrg   tree lhs = gimple_call_lhs (call);
    890  1.1  mrg   bool strict_overflow_p;
    891  1.1  mrg 
    892  1.1  mrg   if (range_of_builtin_call (r, call, src))
    893  1.1  mrg     ;
    894  1.1  mrg   else if (gimple_stmt_nonnegative_warnv_p (call, &strict_overflow_p))
    895  1.1  mrg     r.set (build_int_cst (type, 0), TYPE_MAX_VALUE (type));
    896  1.1  mrg   else if (gimple_call_nonnull_result_p (call)
    897  1.1  mrg 	   || gimple_call_nonnull_arg (call))
    898  1.1  mrg     r = range_nonzero (type);
    899  1.1  mrg   else
    900  1.1  mrg     r.set_varying (type);
    901  1.1  mrg 
    902  1.1  mrg   // If there is an LHS, intersect that with what is known.
    903  1.1  mrg   if (lhs)
    904  1.1  mrg     {
    905  1.1  mrg       value_range def;
    906  1.1  mrg       def = gimple_range_global (lhs);
    907  1.1  mrg       r.intersect (def);
    908  1.1  mrg     }
    909  1.1  mrg   return true;
    910  1.1  mrg }
    911  1.1  mrg 
    912  1.1  mrg // Return the range of a __builtin_ubsan* in CALL and set it in R.
    913  1.1  mrg // CODE is the type of ubsan call (PLUS_EXPR, MINUS_EXPR or
    914  1.1  mrg // MULT_EXPR).
    915  1.1  mrg 
    916  1.1  mrg void
    917  1.1  mrg fold_using_range::range_of_builtin_ubsan_call (irange &r, gcall *call,
    918  1.1  mrg 					       tree_code code, fur_source &src)
    919  1.1  mrg {
    920  1.1  mrg   gcc_checking_assert (code == PLUS_EXPR || code == MINUS_EXPR
    921  1.1  mrg 		       || code == MULT_EXPR);
    922  1.1  mrg   tree type = gimple_range_type (call);
    923  1.1  mrg   range_operator *op = range_op_handler (code, type);
    924  1.1  mrg   gcc_checking_assert (op);
    925  1.1  mrg   int_range_max ir0, ir1;
    926  1.1  mrg   tree arg0 = gimple_call_arg (call, 0);
    927  1.1  mrg   tree arg1 = gimple_call_arg (call, 1);
    928  1.1  mrg   src.get_operand (ir0, arg0);
    929  1.1  mrg   src.get_operand (ir1, arg1);
    930  1.1  mrg   // Check for any relation between arg0 and arg1.
    931  1.1  mrg   relation_kind relation = src.query_relation (arg0, arg1);
    932  1.1  mrg 
    933  1.1  mrg   bool saved_flag_wrapv = flag_wrapv;
    934  1.1  mrg   // Pretend the arithmetic is wrapping.  If there is any overflow,
    935  1.1  mrg   // we'll complain, but will actually do wrapping operation.
    936  1.1  mrg   flag_wrapv = 1;
    937  1.1  mrg   op->fold_range (r, type, ir0, ir1, relation);
    938  1.1  mrg   flag_wrapv = saved_flag_wrapv;
    939  1.1  mrg 
    940  1.1  mrg   // If for both arguments vrp_valueize returned non-NULL, this should
    941  1.1  mrg   // have been already folded and if not, it wasn't folded because of
    942  1.1  mrg   // overflow.  Avoid removing the UBSAN_CHECK_* calls in that case.
    943  1.1  mrg   if (r.singleton_p ())
    944  1.1  mrg     r.set_varying (type);
    945  1.1  mrg }
    946  1.1  mrg 
    947  1.1  mrg // Return TRUE if we recognize the target character set and return the
    948  1.1  mrg // range for lower case and upper case letters.
    949  1.1  mrg 
    950  1.1  mrg static bool
    951  1.1  mrg get_letter_range (tree type, irange &lowers, irange &uppers)
    952  1.1  mrg {
    953  1.1  mrg   // ASCII
    954  1.1  mrg   int a = lang_hooks.to_target_charset ('a');
    955  1.1  mrg   int z = lang_hooks.to_target_charset ('z');
    956  1.1  mrg   int A = lang_hooks.to_target_charset ('A');
    957  1.1  mrg   int Z = lang_hooks.to_target_charset ('Z');
    958  1.1  mrg 
    959  1.1  mrg   if ((z - a == 25) && (Z - A == 25))
    960  1.1  mrg     {
    961  1.1  mrg       lowers = int_range<2> (build_int_cst (type, a), build_int_cst (type, z));
    962  1.1  mrg       uppers = int_range<2> (build_int_cst (type, A), build_int_cst (type, Z));
    963  1.1  mrg       return true;
    964  1.1  mrg     }
    965  1.1  mrg   // Unknown character set.
    966  1.1  mrg   return false;
    967  1.1  mrg }
    968  1.1  mrg 
    969  1.1  mrg // For a builtin in CALL, return a range in R if known and return
    970  1.1  mrg // TRUE.  Otherwise return FALSE.
    971  1.1  mrg 
    972  1.1  mrg bool
    973  1.1  mrg fold_using_range::range_of_builtin_call (irange &r, gcall *call,
    974  1.1  mrg 					 fur_source &src)
    975  1.1  mrg {
    976  1.1  mrg   combined_fn func = gimple_call_combined_fn (call);
    977  1.1  mrg   if (func == CFN_LAST)
    978  1.1  mrg     return false;
    979  1.1  mrg 
    980  1.1  mrg   tree type = gimple_range_type (call);
    981  1.1  mrg   tree arg;
    982  1.1  mrg   int mini, maxi, zerov = 0, prec;
    983  1.1  mrg   scalar_int_mode mode;
    984  1.1  mrg 
    985  1.1  mrg   switch (func)
    986  1.1  mrg     {
    987  1.1  mrg     case CFN_BUILT_IN_CONSTANT_P:
    988  1.1  mrg       arg = gimple_call_arg (call, 0);
    989  1.1  mrg       if (src.get_operand (r, arg) && r.singleton_p ())
    990  1.1  mrg 	{
    991  1.1  mrg 	  r.set (build_one_cst (type), build_one_cst (type));
    992  1.1  mrg 	  return true;
    993  1.1  mrg 	}
    994  1.1  mrg       if (cfun->after_inlining)
    995  1.1  mrg 	{
    996  1.1  mrg 	  r.set_zero (type);
    997  1.1  mrg 	  // r.equiv_clear ();
    998  1.1  mrg 	  return true;
    999  1.1  mrg 	}
   1000  1.1  mrg       break;
   1001  1.1  mrg 
   1002  1.1  mrg     case CFN_BUILT_IN_TOUPPER:
   1003  1.1  mrg       {
   1004  1.1  mrg 	arg = gimple_call_arg (call, 0);
   1005  1.1  mrg 	// If the argument isn't compatible with the LHS, do nothing.
   1006  1.1  mrg 	if (!range_compatible_p (type, TREE_TYPE (arg)))
   1007  1.1  mrg 	  return false;
   1008  1.1  mrg 	if (!src.get_operand (r, arg))
   1009  1.1  mrg 	  return false;
   1010  1.1  mrg 
   1011  1.1  mrg 	int_range<3> lowers;
   1012  1.1  mrg 	int_range<3> uppers;
   1013  1.1  mrg 	if (!get_letter_range (type, lowers, uppers))
   1014  1.1  mrg 	  return false;
   1015  1.1  mrg 
   1016  1.1  mrg 	// Return the range passed in without any lower case characters,
   1017  1.1  mrg 	// but including all the upper case ones.
   1018  1.1  mrg 	lowers.invert ();
   1019  1.1  mrg 	r.intersect (lowers);
   1020  1.1  mrg 	r.union_ (uppers);
   1021  1.1  mrg 	return true;
   1022  1.1  mrg       }
   1023  1.1  mrg 
   1024  1.1  mrg      case CFN_BUILT_IN_TOLOWER:
   1025  1.1  mrg       {
   1026  1.1  mrg 	arg = gimple_call_arg (call, 0);
   1027  1.1  mrg 	// If the argument isn't compatible with the LHS, do nothing.
   1028  1.1  mrg 	if (!range_compatible_p (type, TREE_TYPE (arg)))
   1029  1.1  mrg 	  return false;
   1030  1.1  mrg 	if (!src.get_operand (r, arg))
   1031  1.1  mrg 	  return false;
   1032  1.1  mrg 
   1033  1.1  mrg 	int_range<3> lowers;
   1034  1.1  mrg 	int_range<3> uppers;
   1035  1.1  mrg 	if (!get_letter_range (type, lowers, uppers))
   1036  1.1  mrg 	  return false;
   1037  1.1  mrg 
   1038  1.1  mrg 	// Return the range passed in without any upper case characters,
   1039  1.1  mrg 	// but including all the lower case ones.
   1040  1.1  mrg 	uppers.invert ();
   1041  1.1  mrg 	r.intersect (uppers);
   1042  1.1  mrg 	r.union_ (lowers);
   1043  1.1  mrg 	return true;
   1044  1.1  mrg       }
   1045  1.1  mrg 
   1046  1.1  mrg     CASE_CFN_FFS:
   1047  1.1  mrg     CASE_CFN_POPCOUNT:
   1048  1.1  mrg       // __builtin_ffs* and __builtin_popcount* return [0, prec].
   1049  1.1  mrg       arg = gimple_call_arg (call, 0);
   1050  1.1  mrg       prec = TYPE_PRECISION (TREE_TYPE (arg));
   1051  1.1  mrg       mini = 0;
   1052  1.1  mrg       maxi = prec;
   1053  1.1  mrg       src.get_operand (r, arg);
   1054  1.1  mrg       // If arg is non-zero, then ffs or popcount are non-zero.
   1055  1.1  mrg       if (!range_includes_zero_p (&r))
   1056  1.1  mrg 	mini = 1;
   1057  1.1  mrg       // If some high bits are known to be zero, decrease the maximum.
   1058  1.1  mrg       if (!r.undefined_p ())
   1059  1.1  mrg 	{
   1060  1.1  mrg 	  if (TYPE_SIGN (r.type ()) == SIGNED)
   1061  1.1  mrg 	    range_cast (r, unsigned_type_for (r.type ()));
   1062  1.1  mrg 	  wide_int max = r.upper_bound ();
   1063  1.1  mrg 	  maxi = wi::floor_log2 (max) + 1;
   1064  1.1  mrg 	}
   1065  1.1  mrg       r.set (build_int_cst (type, mini), build_int_cst (type, maxi));
   1066  1.1  mrg       return true;
   1067  1.1  mrg 
   1068  1.1  mrg     CASE_CFN_PARITY:
   1069  1.1  mrg       r.set (build_zero_cst (type), build_one_cst (type));
   1070  1.1  mrg       return true;
   1071  1.1  mrg 
   1072  1.1  mrg     CASE_CFN_CLZ:
   1073  1.1  mrg       // __builtin_c[lt]z* return [0, prec-1], except when the
   1074  1.1  mrg       // argument is 0, but that is undefined behavior.
   1075  1.1  mrg       //
   1076  1.1  mrg       // For __builtin_c[lt]z* consider argument of 0 always undefined
   1077  1.1  mrg       // behavior, for internal fns depending on C?Z_DEFINED_VALUE_AT_ZERO.
   1078  1.1  mrg       arg = gimple_call_arg (call, 0);
   1079  1.1  mrg       prec = TYPE_PRECISION (TREE_TYPE (arg));
   1080  1.1  mrg       mini = 0;
   1081  1.1  mrg       maxi = prec - 1;
   1082  1.1  mrg       mode = SCALAR_INT_TYPE_MODE (TREE_TYPE (arg));
   1083  1.1  mrg       if (gimple_call_internal_p (call))
   1084  1.1  mrg 	{
   1085  1.1  mrg 	  if (optab_handler (clz_optab, mode) != CODE_FOR_nothing
   1086  1.1  mrg 	      && CLZ_DEFINED_VALUE_AT_ZERO (mode, zerov) == 2)
   1087  1.1  mrg 	    {
   1088  1.1  mrg 	      // Only handle the single common value.
   1089  1.1  mrg 	      if (zerov == prec)
   1090  1.1  mrg 		maxi = prec;
   1091  1.1  mrg 	      else
   1092  1.1  mrg 		// Magic value to give up, unless we can prove arg is non-zero.
   1093  1.1  mrg 		mini = -2;
   1094  1.1  mrg 	    }
   1095  1.1  mrg 	}
   1096  1.1  mrg 
   1097  1.1  mrg       src.get_operand (r, arg);
   1098  1.1  mrg       // From clz of minimum we can compute result maximum.
   1099  1.1  mrg       if (!r.undefined_p ())
   1100  1.1  mrg 	{
   1101  1.1  mrg 	  // From clz of minimum we can compute result maximum.
   1102  1.1  mrg 	  if (wi::gt_p (r.lower_bound (), 0, TYPE_SIGN (r.type ())))
   1103  1.1  mrg 	    {
   1104  1.1  mrg 	      maxi = prec - 1 - wi::floor_log2 (r.lower_bound ());
   1105  1.1  mrg 	      if (mini == -2)
   1106  1.1  mrg 		mini = 0;
   1107  1.1  mrg 	    }
   1108  1.1  mrg 	  else if (!range_includes_zero_p (&r))
   1109  1.1  mrg 	    {
   1110  1.1  mrg 	      mini = 0;
   1111  1.1  mrg 	      maxi = prec - 1;
   1112  1.1  mrg 	    }
   1113  1.1  mrg 	  if (mini == -2)
   1114  1.1  mrg 	    break;
   1115  1.1  mrg 	  // From clz of maximum we can compute result minimum.
   1116  1.1  mrg 	  wide_int max = r.upper_bound ();
   1117  1.1  mrg 	  int newmini = prec - 1 - wi::floor_log2 (max);
   1118  1.1  mrg 	  if (max == 0)
   1119  1.1  mrg 	    {
   1120  1.1  mrg 	      // If CLZ_DEFINED_VALUE_AT_ZERO is 2 with VALUE of prec,
   1121  1.1  mrg 	      // return [prec, prec], otherwise ignore the range.
   1122  1.1  mrg 	      if (maxi == prec)
   1123  1.1  mrg 		mini = prec;
   1124  1.1  mrg 	    }
   1125  1.1  mrg 	  else
   1126  1.1  mrg 	    mini = newmini;
   1127  1.1  mrg 	}
   1128  1.1  mrg       if (mini == -2)
   1129  1.1  mrg 	break;
   1130  1.1  mrg       r.set (build_int_cst (type, mini), build_int_cst (type, maxi));
   1131  1.1  mrg       return true;
   1132  1.1  mrg 
   1133  1.1  mrg     CASE_CFN_CTZ:
   1134  1.1  mrg       // __builtin_ctz* return [0, prec-1], except for when the
   1135  1.1  mrg       // argument is 0, but that is undefined behavior.
   1136  1.1  mrg       //
   1137  1.1  mrg       // For __builtin_ctz* consider argument of 0 always undefined
   1138  1.1  mrg       // behavior, for internal fns depending on CTZ_DEFINED_VALUE_AT_ZERO.
   1139  1.1  mrg       arg = gimple_call_arg (call, 0);
   1140  1.1  mrg       prec = TYPE_PRECISION (TREE_TYPE (arg));
   1141  1.1  mrg       mini = 0;
   1142  1.1  mrg       maxi = prec - 1;
   1143  1.1  mrg       mode = SCALAR_INT_TYPE_MODE (TREE_TYPE (arg));
   1144  1.1  mrg       if (gimple_call_internal_p (call))
   1145  1.1  mrg 	{
   1146  1.1  mrg 	  if (optab_handler (ctz_optab, mode) != CODE_FOR_nothing
   1147  1.1  mrg 	      && CTZ_DEFINED_VALUE_AT_ZERO (mode, zerov) == 2)
   1148  1.1  mrg 	    {
   1149  1.1  mrg 	      // Handle only the two common values.
   1150  1.1  mrg 	      if (zerov == -1)
   1151  1.1  mrg 		mini = -1;
   1152  1.1  mrg 	      else if (zerov == prec)
   1153  1.1  mrg 		maxi = prec;
   1154  1.1  mrg 	      else
   1155  1.1  mrg 		// Magic value to give up, unless we can prove arg is non-zero.
   1156  1.1  mrg 		mini = -2;
   1157  1.1  mrg 	    }
   1158  1.1  mrg 	}
   1159  1.1  mrg       src.get_operand (r, arg);
   1160  1.1  mrg       if (!r.undefined_p ())
   1161  1.1  mrg 	{
   1162  1.1  mrg 	  // If arg is non-zero, then use [0, prec - 1].
   1163  1.1  mrg 	  if (!range_includes_zero_p (&r))
   1164  1.1  mrg 	    {
   1165  1.1  mrg 	      mini = 0;
   1166  1.1  mrg 	      maxi = prec - 1;
   1167  1.1  mrg 	    }
   1168  1.1  mrg 	  // If some high bits are known to be zero, we can decrease
   1169  1.1  mrg 	  // the maximum.
   1170  1.1  mrg 	  wide_int max = r.upper_bound ();
   1171  1.1  mrg 	  if (max == 0)
   1172  1.1  mrg 	    {
   1173  1.1  mrg 	      // Argument is [0, 0].  If CTZ_DEFINED_VALUE_AT_ZERO
   1174  1.1  mrg 	      // is 2 with value -1 or prec, return [-1, -1] or [prec, prec].
   1175  1.1  mrg 	      // Otherwise ignore the range.
   1176  1.1  mrg 	      if (mini == -1)
   1177  1.1  mrg 		maxi = -1;
   1178  1.1  mrg 	      else if (maxi == prec)
   1179  1.1  mrg 		mini = prec;
   1180  1.1  mrg 	    }
   1181  1.1  mrg 	  // If value at zero is prec and 0 is in the range, we can't lower
   1182  1.1  mrg 	  // the upper bound.  We could create two separate ranges though,
   1183  1.1  mrg 	  // [0,floor_log2(max)][prec,prec] though.
   1184  1.1  mrg 	  else if (maxi != prec)
   1185  1.1  mrg 	    maxi = wi::floor_log2 (max);
   1186  1.1  mrg 	}
   1187  1.1  mrg       if (mini == -2)
   1188  1.1  mrg 	break;
   1189  1.1  mrg       r.set (build_int_cst (type, mini), build_int_cst (type, maxi));
   1190  1.1  mrg       return true;
   1191  1.1  mrg 
   1192  1.1  mrg     CASE_CFN_CLRSB:
   1193  1.1  mrg       arg = gimple_call_arg (call, 0);
   1194  1.1  mrg       prec = TYPE_PRECISION (TREE_TYPE (arg));
   1195  1.1  mrg       r.set (build_int_cst (type, 0), build_int_cst (type, prec - 1));
   1196  1.1  mrg       return true;
   1197  1.1  mrg     case CFN_UBSAN_CHECK_ADD:
   1198  1.1  mrg       range_of_builtin_ubsan_call (r, call, PLUS_EXPR, src);
   1199  1.1  mrg       return true;
   1200  1.1  mrg     case CFN_UBSAN_CHECK_SUB:
   1201  1.1  mrg       range_of_builtin_ubsan_call (r, call, MINUS_EXPR, src);
   1202  1.1  mrg       return true;
   1203  1.1  mrg     case CFN_UBSAN_CHECK_MUL:
   1204  1.1  mrg       range_of_builtin_ubsan_call (r, call, MULT_EXPR, src);
   1205  1.1  mrg       return true;
   1206  1.1  mrg 
   1207  1.1  mrg     case CFN_GOACC_DIM_SIZE:
   1208  1.1  mrg     case CFN_GOACC_DIM_POS:
   1209  1.1  mrg       // Optimizing these two internal functions helps the loop
   1210  1.1  mrg       // optimizer eliminate outer comparisons.  Size is [1,N]
   1211  1.1  mrg       // and pos is [0,N-1].
   1212  1.1  mrg       {
   1213  1.1  mrg 	bool is_pos = func == CFN_GOACC_DIM_POS;
   1214  1.1  mrg 	int axis = oacc_get_ifn_dim_arg (call);
   1215  1.1  mrg 	int size = oacc_get_fn_dim_size (current_function_decl, axis);
   1216  1.1  mrg 	if (!size)
   1217  1.1  mrg 	  // If it's dynamic, the backend might know a hardware limitation.
   1218  1.1  mrg 	  size = targetm.goacc.dim_limit (axis);
   1219  1.1  mrg 
   1220  1.1  mrg 	r.set (build_int_cst (type, is_pos ? 0 : 1),
   1221  1.1  mrg 	       size
   1222  1.1  mrg 	       ? build_int_cst (type, size - is_pos) : vrp_val_max (type));
   1223  1.1  mrg 	return true;
   1224  1.1  mrg       }
   1225  1.1  mrg 
   1226  1.1  mrg     case CFN_BUILT_IN_STRLEN:
   1227  1.1  mrg       if (tree lhs = gimple_call_lhs (call))
   1228  1.1  mrg 	if (ptrdiff_type_node
   1229  1.1  mrg 	    && (TYPE_PRECISION (ptrdiff_type_node)
   1230  1.1  mrg 		== TYPE_PRECISION (TREE_TYPE (lhs))))
   1231  1.1  mrg 	  {
   1232  1.1  mrg 	    tree type = TREE_TYPE (lhs);
   1233  1.1  mrg 	    tree max = vrp_val_max (ptrdiff_type_node);
   1234  1.1  mrg 	    wide_int wmax
   1235  1.1  mrg 	      = wi::to_wide (max, TYPE_PRECISION (TREE_TYPE (max)));
   1236  1.1  mrg 	    tree range_min = build_zero_cst (type);
   1237  1.1  mrg 	    // To account for the terminating NULL, the maximum length
   1238  1.1  mrg 	    // is one less than the maximum array size, which in turn
   1239  1.1  mrg 	    // is one less than PTRDIFF_MAX (or SIZE_MAX where it's
   1240  1.1  mrg 	    // smaller than the former type).
   1241  1.1  mrg 	    // FIXME: Use max_object_size() - 1 here.
   1242  1.1  mrg 	    tree range_max = wide_int_to_tree (type, wmax - 2);
   1243  1.1  mrg 	    r.set (range_min, range_max);
   1244  1.1  mrg 	    return true;
   1245  1.1  mrg 	  }
   1246  1.1  mrg       break;
   1247  1.1  mrg     default:
   1248  1.1  mrg       break;
   1249  1.1  mrg     }
   1250  1.1  mrg   return false;
   1251  1.1  mrg }
   1252  1.1  mrg 
   1253  1.1  mrg 
   1254  1.1  mrg // Calculate a range for COND_EXPR statement S and return it in R.
   1255  1.1  mrg // If a range cannot be calculated, return false.
   1256  1.1  mrg 
   1257  1.1  mrg bool
   1258  1.1  mrg fold_using_range::range_of_cond_expr  (irange &r, gassign *s, fur_source &src)
   1259  1.1  mrg {
   1260  1.1  mrg   int_range_max cond_range, range1, range2;
   1261  1.1  mrg   tree cond = gimple_assign_rhs1 (s);
   1262  1.1  mrg   tree op1 = gimple_assign_rhs2 (s);
   1263  1.1  mrg   tree op2 = gimple_assign_rhs3 (s);
   1264  1.1  mrg 
   1265  1.1  mrg   tree type = gimple_range_type (s);
   1266  1.1  mrg   if (!type)
   1267  1.1  mrg     return false;
   1268  1.1  mrg 
   1269  1.1  mrg   gcc_checking_assert (gimple_assign_rhs_code (s) == COND_EXPR);
   1270  1.1  mrg   gcc_checking_assert (range_compatible_p (TREE_TYPE (op1), TREE_TYPE (op2)));
   1271  1.1  mrg   src.get_operand (cond_range, cond);
   1272  1.1  mrg   src.get_operand (range1, op1);
   1273  1.1  mrg   src.get_operand (range2, op2);
   1274  1.1  mrg 
   1275  1.1  mrg   // Try to see if there is a dependence between the COND and either operand
   1276  1.1  mrg   if (src.gori ())
   1277  1.1  mrg     if (src.gori ()->condexpr_adjust (range1, range2, s, cond, op1, op2, src))
   1278  1.1  mrg       if (dump_file && (dump_flags & TDF_DETAILS))
   1279  1.1  mrg 	{
   1280  1.1  mrg 	  fprintf (dump_file, "Possible COND_EXPR adjustment. Range op1 : ");
   1281  1.1  mrg 	  range1.dump(dump_file);
   1282  1.1  mrg 	  fprintf (dump_file, " and Range op2: ");
   1283  1.1  mrg 	  range2.dump(dump_file);
   1284  1.1  mrg 	  fprintf (dump_file, "\n");
   1285  1.1  mrg 	}
   1286  1.1  mrg 
   1287  1.1  mrg   // If the condition is known, choose the appropriate expression.
   1288  1.1  mrg   if (cond_range.singleton_p ())
   1289  1.1  mrg     {
   1290  1.1  mrg       // False, pick second operand.
   1291  1.1  mrg       if (cond_range.zero_p ())
   1292  1.1  mrg 	r = range2;
   1293  1.1  mrg       else
   1294  1.1  mrg 	r = range1;
   1295  1.1  mrg     }
   1296  1.1  mrg   else
   1297  1.1  mrg     {
   1298  1.1  mrg       r = range1;
   1299  1.1  mrg       r.union_ (range2);
   1300  1.1  mrg     }
   1301  1.1  mrg   gcc_checking_assert (r.undefined_p ()
   1302  1.1  mrg 		       || range_compatible_p (r.type (), type));
   1303  1.1  mrg   return true;
   1304  1.1  mrg }
   1305  1.1  mrg 
   1306  1.1  mrg // If SCEV has any information about phi node NAME, return it as a range in R.
   1307  1.1  mrg 
   1308  1.1  mrg void
   1309  1.1  mrg fold_using_range::range_of_ssa_name_with_loop_info (irange &r, tree name,
   1310  1.1  mrg 						    class loop *l, gphi *phi,
   1311  1.1  mrg 						    fur_source &src)
   1312  1.1  mrg {
   1313  1.1  mrg   gcc_checking_assert (TREE_CODE (name) == SSA_NAME);
   1314  1.1  mrg   tree min, max, type = TREE_TYPE (name);
   1315  1.1  mrg   if (bounds_of_var_in_loop (&min, &max, src.query (), l, phi, name))
   1316  1.1  mrg     {
   1317  1.1  mrg       if (TREE_CODE (min) != INTEGER_CST)
   1318  1.1  mrg 	{
   1319  1.1  mrg 	  if (src.query ()->range_of_expr (r, min, phi) && !r.undefined_p ())
   1320  1.1  mrg 	    min = wide_int_to_tree (type, r.lower_bound ());
   1321  1.1  mrg 	  else
   1322  1.1  mrg 	    min = vrp_val_min (type);
   1323  1.1  mrg 	}
   1324  1.1  mrg       if (TREE_CODE (max) != INTEGER_CST)
   1325  1.1  mrg 	{
   1326  1.1  mrg 	  if (src.query ()->range_of_expr (r, max, phi) && !r.undefined_p ())
   1327  1.1  mrg 	    max = wide_int_to_tree (type, r.upper_bound ());
   1328  1.1  mrg 	  else
   1329  1.1  mrg 	    max = vrp_val_max (type);
   1330  1.1  mrg 	}
   1331  1.1  mrg       r.set (min, max);
   1332  1.1  mrg     }
   1333  1.1  mrg   else
   1334  1.1  mrg     r.set_varying (type);
   1335  1.1  mrg }
   1336  1.1  mrg 
   1337  1.1  mrg // -----------------------------------------------------------------------
   1338  1.1  mrg 
   1339  1.1  mrg // Check if an && or || expression can be folded based on relations. ie
   1340  1.1  mrg //   c_2 = a_6 > b_7
   1341  1.1  mrg //   c_3 = a_6 < b_7
   1342  1.1  mrg //   c_4 = c_2 && c_3
   1343  1.1  mrg // c_2 and c_3 can never be true at the same time,
   1344  1.1  mrg // Therefore c_4 can always resolve to false based purely on the relations.
   1345  1.1  mrg 
   1346  1.1  mrg void
   1347  1.1  mrg fold_using_range::relation_fold_and_or (irange& lhs_range, gimple *s,
   1348  1.1  mrg 					fur_source &src)
   1349  1.1  mrg {
   1350  1.1  mrg   // No queries or already folded.
   1351  1.1  mrg   if (!src.gori () || !src.query ()->oracle () || lhs_range.singleton_p ())
   1352  1.1  mrg     return;
   1353  1.1  mrg 
   1354  1.1  mrg   // Only care about AND and OR expressions.
   1355  1.1  mrg   enum tree_code code = gimple_expr_code (s);
   1356  1.1  mrg   bool is_and = false;
   1357  1.1  mrg   if (code == BIT_AND_EXPR || code == TRUTH_AND_EXPR)
   1358  1.1  mrg     is_and = true;
   1359  1.1  mrg   else if (code != BIT_IOR_EXPR && code != TRUTH_OR_EXPR)
   1360  1.1  mrg     return;
   1361  1.1  mrg 
   1362  1.1  mrg   tree lhs = gimple_get_lhs (s);
   1363  1.1  mrg   tree ssa1 = gimple_range_ssa_p (gimple_range_operand1 (s));
   1364  1.1  mrg   tree ssa2 = gimple_range_ssa_p (gimple_range_operand2 (s));
   1365  1.1  mrg 
   1366  1.1  mrg   // Deal with || and && only when there is a full set of symbolics.
   1367  1.1  mrg   if (!lhs || !ssa1 || !ssa2
   1368  1.1  mrg       || (TREE_CODE (TREE_TYPE (lhs)) != BOOLEAN_TYPE)
   1369  1.1  mrg       || (TREE_CODE (TREE_TYPE (ssa1)) != BOOLEAN_TYPE)
   1370  1.1  mrg       || (TREE_CODE (TREE_TYPE (ssa2)) != BOOLEAN_TYPE))
   1371  1.1  mrg     return;
   1372  1.1  mrg 
   1373  1.1  mrg   // Now we know its a boolean AND or OR expression with boolean operands.
   1374  1.1  mrg   // Ideally we search dependencies for common names, and see what pops out.
   1375  1.1  mrg   // until then, simply try to resolve direct dependencies.
   1376  1.1  mrg 
   1377  1.1  mrg   gimple *ssa1_stmt = SSA_NAME_DEF_STMT (ssa1);
   1378  1.1  mrg   gimple *ssa2_stmt = SSA_NAME_DEF_STMT (ssa2);
   1379  1.1  mrg 
   1380  1.1  mrg   range_operator *handler1 = gimple_range_handler (SSA_NAME_DEF_STMT (ssa1));
   1381  1.1  mrg   range_operator *handler2 = gimple_range_handler (SSA_NAME_DEF_STMT (ssa2));
   1382  1.1  mrg 
   1383  1.1  mrg   // If either handler is not present, no relation can be found.
   1384  1.1  mrg   if (!handler1 || !handler2)
   1385  1.1  mrg     return;
   1386  1.1  mrg 
   1387  1.1  mrg   // Both stmts will need to have 2 ssa names in the stmt.
   1388  1.1  mrg   tree ssa1_dep1 = gimple_range_ssa_p (gimple_range_operand1 (ssa1_stmt));
   1389  1.1  mrg   tree ssa1_dep2 = gimple_range_ssa_p (gimple_range_operand2 (ssa1_stmt));
   1390  1.1  mrg   tree ssa2_dep1 = gimple_range_ssa_p (gimple_range_operand1 (ssa2_stmt));
   1391  1.1  mrg   tree ssa2_dep2 = gimple_range_ssa_p (gimple_range_operand2 (ssa2_stmt));
   1392  1.1  mrg 
   1393  1.1  mrg   if (!ssa1_dep1 || !ssa1_dep2 || !ssa2_dep1 || !ssa2_dep2)
   1394  1.1  mrg     return;
   1395  1.1  mrg 
   1396  1.1  mrg   // Make sure they are the same dependencies, and detect the order of the
   1397  1.1  mrg   // relationship.
   1398  1.1  mrg   bool reverse_op2 = true;
   1399  1.1  mrg   if (ssa1_dep1 == ssa2_dep1 && ssa1_dep2 == ssa2_dep2)
   1400  1.1  mrg     reverse_op2 = false;
   1401  1.1  mrg   else if (ssa1_dep1 != ssa2_dep2 || ssa1_dep2 != ssa2_dep1)
   1402  1.1  mrg     return;
   1403  1.1  mrg 
   1404  1.1  mrg   int_range<2> bool_one (boolean_true_node, boolean_true_node);
   1405  1.1  mrg 
   1406  1.1  mrg   relation_kind relation1 = handler1->op1_op2_relation (bool_one);
   1407  1.1  mrg   relation_kind relation2 = handler2->op1_op2_relation (bool_one);
   1408  1.1  mrg   if (relation1 == VREL_NONE || relation2 == VREL_NONE)
   1409  1.1  mrg     return;
   1410  1.1  mrg 
   1411  1.1  mrg   if (reverse_op2)
   1412  1.1  mrg     relation2 = relation_negate (relation2);
   1413  1.1  mrg 
   1414  1.1  mrg   // x && y is false if the relation intersection of the true cases is NULL.
   1415  1.1  mrg   if (is_and && relation_intersect (relation1, relation2) == VREL_EMPTY)
   1416  1.1  mrg     lhs_range = int_range<2> (boolean_false_node, boolean_false_node);
   1417  1.1  mrg   // x || y is true if the union of the true cases is NO-RELATION..
   1418  1.1  mrg   // ie, one or the other being true covers the full range of possibilties.
   1419  1.1  mrg   else if (!is_and && relation_union (relation1, relation2) == VREL_NONE)
   1420  1.1  mrg     lhs_range = bool_one;
   1421  1.1  mrg   else
   1422  1.1  mrg     return;
   1423  1.1  mrg 
   1424  1.1  mrg   range_cast (lhs_range, TREE_TYPE (lhs));
   1425  1.1  mrg   if (dump_file && (dump_flags & TDF_DETAILS))
   1426  1.1  mrg     {
   1427  1.1  mrg       fprintf (dump_file, "  Relation adjustment: ");
   1428  1.1  mrg       print_generic_expr (dump_file, ssa1, TDF_SLIM);
   1429  1.1  mrg       fprintf (dump_file, "  and ");
   1430  1.1  mrg       print_generic_expr (dump_file, ssa2, TDF_SLIM);
   1431  1.1  mrg       fprintf (dump_file, "  combine to produce ");
   1432  1.1  mrg       lhs_range.dump (dump_file);
   1433  1.1  mrg       fputc ('\n', dump_file);
   1434  1.1  mrg     }
   1435  1.1  mrg 
   1436  1.1  mrg   return;
   1437  1.1  mrg }
   1438  1.1  mrg 
   1439  1.1  mrg // Register any outgoing edge relations from a conditional branch.
   1440  1.1  mrg 
   1441  1.1  mrg void
   1442  1.1  mrg fur_source::register_outgoing_edges (gcond *s, irange &lhs_range, edge e0, edge e1)
   1443  1.1  mrg {
   1444  1.1  mrg   int_range_max r;
   1445  1.1  mrg   int_range<2> e0_range, e1_range;
   1446  1.1  mrg   tree name;
   1447  1.1  mrg   range_operator *handler;
   1448  1.1  mrg   basic_block bb = gimple_bb (s);
   1449  1.1  mrg 
   1450  1.1  mrg   if (e0)
   1451  1.1  mrg     {
   1452  1.1  mrg       // If this edge is never taken, ignore it.
   1453  1.1  mrg       gcond_edge_range (e0_range, e0);
   1454  1.1  mrg       e0_range.intersect (lhs_range);
   1455  1.1  mrg       if (e0_range.undefined_p ())
   1456  1.1  mrg 	e0 = NULL;
   1457  1.1  mrg     }
   1458  1.1  mrg 
   1459  1.1  mrg 
   1460  1.1  mrg   if (e1)
   1461  1.1  mrg     {
   1462  1.1  mrg       // If this edge is never taken, ignore it.
   1463  1.1  mrg       gcond_edge_range (e1_range, e1);
   1464  1.1  mrg       e1_range.intersect (lhs_range);
   1465  1.1  mrg       if (e1_range.undefined_p ())
   1466  1.1  mrg 	e1 = NULL;
   1467  1.1  mrg     }
   1468  1.1  mrg 
   1469  1.1  mrg   if (!e0 && !e1)
   1470  1.1  mrg     return;
   1471  1.1  mrg 
   1472  1.1  mrg   // First, register the gcond itself.  This will catch statements like
   1473  1.1  mrg   // if (a_2 < b_5)
   1474  1.1  mrg   tree ssa1 = gimple_range_ssa_p (gimple_range_operand1 (s));
   1475  1.1  mrg   tree ssa2 = gimple_range_ssa_p (gimple_range_operand2 (s));
   1476  1.1  mrg   if (ssa1 && ssa2)
   1477  1.1  mrg     {
   1478  1.1  mrg       handler = gimple_range_handler (s);
   1479  1.1  mrg       gcc_checking_assert (handler);
   1480  1.1  mrg       if (e0)
   1481  1.1  mrg 	{
   1482  1.1  mrg 	  relation_kind relation = handler->op1_op2_relation (e0_range);
   1483  1.1  mrg 	  if (relation != VREL_NONE)
   1484  1.1  mrg 	    register_relation (e0, relation, ssa1, ssa2);
   1485  1.1  mrg 	}
   1486  1.1  mrg       if (e1)
   1487  1.1  mrg 	{
   1488  1.1  mrg 	  relation_kind relation = handler->op1_op2_relation (e1_range);
   1489  1.1  mrg 	  if (relation != VREL_NONE)
   1490  1.1  mrg 	    register_relation (e1, relation, ssa1, ssa2);
   1491  1.1  mrg 	}
   1492  1.1  mrg     }
   1493  1.1  mrg 
   1494  1.1  mrg   // Outgoing relations of GORI exports require a gori engine.
   1495  1.1  mrg   if (!gori ())
   1496  1.1  mrg     return;
   1497  1.1  mrg 
   1498  1.1  mrg   // Now look for other relations in the exports.  This will find stmts
   1499  1.1  mrg   // leading to the condition such as:
   1500  1.1  mrg   // c_2 = a_4 < b_7
   1501  1.1  mrg   // if (c_2)
   1502  1.1  mrg   FOR_EACH_GORI_EXPORT_NAME (*(gori ()), bb, name)
   1503  1.1  mrg     {
   1504  1.1  mrg       if (TREE_CODE (TREE_TYPE (name)) != BOOLEAN_TYPE)
   1505  1.1  mrg 	continue;
   1506  1.1  mrg       gimple *stmt = SSA_NAME_DEF_STMT (name);
   1507  1.1  mrg       handler = gimple_range_handler (stmt);
   1508  1.1  mrg       if (!handler)
   1509  1.1  mrg 	continue;
   1510  1.1  mrg       tree ssa1 = gimple_range_ssa_p (gimple_range_operand1 (stmt));
   1511  1.1  mrg       tree ssa2 = gimple_range_ssa_p (gimple_range_operand2 (stmt));
   1512  1.1  mrg       if (ssa1 && ssa2)
   1513  1.1  mrg 	{
   1514  1.1  mrg 	  if (e0 && gori ()->outgoing_edge_range_p (r, e0, name, *m_query)
   1515  1.1  mrg 	      && r.singleton_p ())
   1516  1.1  mrg 	    {
   1517  1.1  mrg 	      relation_kind relation = handler->op1_op2_relation (r);
   1518  1.1  mrg 	      if (relation != VREL_NONE)
   1519  1.1  mrg 		register_relation (e0, relation, ssa1, ssa2);
   1520  1.1  mrg 	    }
   1521  1.1  mrg 	  if (e1 && gori ()->outgoing_edge_range_p (r, e1, name, *m_query)
   1522  1.1  mrg 	      && r.singleton_p ())
   1523  1.1  mrg 	    {
   1524  1.1  mrg 	      relation_kind relation = handler->op1_op2_relation (r);
   1525  1.1  mrg 	      if (relation != VREL_NONE)
   1526  1.1  mrg 		register_relation (e1, relation, ssa1, ssa2);
   1527  1.1  mrg 	    }
   1528  1.1  mrg 	}
   1529  1.1  mrg     }
   1530  1.1  mrg }
   1531