1 /* Support routines for Value Range Propagation (VRP).
2    Copyright (C) 2005-2022 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10 
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "insn-codes.h"
25 #include "tree.h"
26 #include "gimple.h"
27 #include "ssa.h"
28 #include "optabs-tree.h"
29 #include "gimple-pretty-print.h"
30 #include "diagnostic-core.h"
31 #include "flags.h"
32 #include "fold-const.h"
33 #include "calls.h"
34 #include "cfganal.h"
35 #include "gimple-fold.h"
36 #include "gimple-iterator.h"
37 #include "tree-cfg.h"
38 #include "tree-ssa-loop-niter.h"
39 #include "tree-ssa-loop.h"
40 #include "intl.h"
41 #include "cfgloop.h"
42 #include "tree-scalar-evolution.h"
43 #include "tree-ssa-propagate.h"
44 #include "tree-chrec.h"
45 #include "omp-general.h"
46 #include "case-cfn-macros.h"
47 #include "alloc-pool.h"
48 #include "attribs.h"
49 #include "range.h"
50 #include "vr-values.h"
51 #include "cfghooks.h"
52 #include "range-op.h"
53 #include "gimple-range.h"
54 
55 /* Set value range VR to a non-negative range of type TYPE.  */
56 
57 static inline void
set_value_range_to_nonnegative(value_range_equiv * vr,tree type)58 set_value_range_to_nonnegative (value_range_equiv *vr, tree type)
59 {
60   tree zero = build_int_cst (type, 0);
61   vr->update (zero, vrp_val_max (type));
62 }
63 
64 /* Set value range VR to a range of a truthvalue of type TYPE.  */
65 
66 static inline void
set_value_range_to_truthvalue(value_range_equiv * vr,tree type)67 set_value_range_to_truthvalue (value_range_equiv *vr, tree type)
68 {
69   if (TYPE_PRECISION (type) == 1)
70     vr->set_varying (type);
71   else
72     vr->update (build_int_cst (type, 0), build_int_cst (type, 1));
73 }
74 
75 /* Return the lattice entry for VAR or NULL if it doesn't exist or cannot
76    be initialized.  */
77 
78 value_range_equiv *
get_lattice_entry(const_tree var)79 vr_values::get_lattice_entry (const_tree var)
80 {
81   value_range_equiv *vr;
82   tree sym;
83   unsigned ver = SSA_NAME_VERSION (var);
84 
85   /* If we query the entry for a new SSA name avoid reallocating the lattice
86      since we should get here at most from the substitute-and-fold stage which
87      will never try to change values.  */
88   if (ver >= num_vr_values)
89     return NULL;
90 
91   vr = vr_value[ver];
92   if (vr)
93     return vr;
94 
95   /* Create a default value range.  */
96   vr = allocate_value_range_equiv ();
97   vr_value[ver] = vr;
98 
99   /* After propagation finished return varying.  */
100   if (values_propagated)
101     {
102       vr->set_varying (TREE_TYPE (var));
103       return vr;
104     }
105 
106   vr->set_undefined ();
107 
108   /* If VAR is a default definition of a parameter, the variable can
109      take any value in VAR's type.  */
110   if (SSA_NAME_IS_DEFAULT_DEF (var))
111     {
112       sym = SSA_NAME_VAR (var);
113       if (TREE_CODE (sym) == PARM_DECL)
114           {
115             /* Try to use the "nonnull" attribute to create ~[0, 0]
116                anti-ranges for pointers.  Note that this is only valid with
117                default definitions of PARM_DECLs.  */
118             if (POINTER_TYPE_P (TREE_TYPE (sym))
119                 && (nonnull_arg_p (sym)
120                       || (get_global_range_query ()->range_of_expr (*vr,
121                                                             const_cast <tree> (var))
122                           && vr->nonzero_p ())))
123               {
124                 vr->set_nonzero (TREE_TYPE (sym));
125                 vr->equiv_clear ();
126               }
127             else if (INTEGRAL_TYPE_P (TREE_TYPE (sym)))
128               {
129                 get_global_range_query ()->range_of_expr (*vr, const_cast <tree> (var));
130                 if (vr->undefined_p ())
131                     vr->set_varying (TREE_TYPE (sym));
132               }
133             else
134               vr->set_varying (TREE_TYPE (sym));
135           }
136       else if (TREE_CODE (sym) == RESULT_DECL
137                  && DECL_BY_REFERENCE (sym))
138           {
139             vr->set_nonzero (TREE_TYPE (sym));
140             vr->equiv_clear ();
141           }
142     }
143 
144   return vr;
145 }
146 
147 /* Return value range information for VAR.
148 
149    If we have no values ranges recorded (ie, VRP is not running), then
150    return NULL.  Otherwise create an empty range if none existed for VAR.  */
151 
152 const value_range_equiv *
get_value_range(const_tree var,gimple * stmt ATTRIBUTE_UNUSED)153 vr_values::get_value_range (const_tree var,
154                                   gimple *stmt ATTRIBUTE_UNUSED)
155 {
156   /* If we have no recorded ranges, then return NULL.  */
157   if (!vr_value)
158     return NULL;
159 
160   value_range_equiv *vr = get_lattice_entry (var);
161 
162   /* Reallocate the lattice if needed.  */
163   if (!vr)
164     {
165       unsigned int old_sz = num_vr_values;
166       num_vr_values = num_ssa_names + num_ssa_names / 10;
167       vr_value = XRESIZEVEC (value_range_equiv *, vr_value, num_vr_values);
168       for ( ; old_sz < num_vr_values; old_sz++)
169         vr_value [old_sz] = NULL;
170 
171       /* Now that the lattice has been resized, we should never fail.  */
172       vr = get_lattice_entry (var);
173       gcc_assert (vr);
174     }
175 
176   return vr;
177 }
178 
179 bool
range_of_expr(irange & r,tree expr,gimple * stmt)180 vr_values::range_of_expr (irange &r, tree expr, gimple *stmt)
181 {
182   if (!gimple_range_ssa_p (expr))
183     return get_tree_range (r, expr, stmt);
184 
185   if (const value_range *vr = get_value_range (expr, stmt))
186     {
187       if (vr->undefined_p () || vr->constant_p ())
188           r = *vr;
189       else
190           {
191             value_range tmp = *vr;
192             tmp.normalize_symbolics ();
193             r = tmp;
194           }
195       return true;
196     }
197   return false;
198 }
199 
200 tree
value_of_expr(tree op,gimple *)201 vr_values::value_of_expr (tree op, gimple *)
202 {
203   return op_with_constant_singleton_value_range (op);
204 }
205 
206 tree
value_on_edge(edge,tree op)207 vr_values::value_on_edge (edge, tree op)
208 {
209   return op_with_constant_singleton_value_range (op);
210 }
211 
212 tree
value_of_stmt(gimple * stmt,tree op)213 vr_values::value_of_stmt (gimple *stmt, tree op)
214 {
215   if (!op)
216     op = gimple_get_lhs (stmt);
217 
218   gcc_checking_assert (!op|| op == gimple_get_lhs (stmt));
219 
220   if (op)
221     return op_with_constant_singleton_value_range (op);
222   return NULL_TREE;
223 }
224 
225 /* Set the lattice entry for DEF to VARYING.  */
226 
227 void
set_def_to_varying(const_tree def)228 vr_values::set_def_to_varying (const_tree def)
229 {
230   value_range_equiv *vr = get_lattice_entry (def);
231   if (vr)
232     vr->set_varying (TREE_TYPE (def));
233 }
234 
235 /* Set value-ranges of all SSA names defined by STMT to varying.  */
236 
237 void
set_defs_to_varying(gimple * stmt)238 vr_values::set_defs_to_varying (gimple *stmt)
239 {
240   ssa_op_iter i;
241   tree def;
242   FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
243     set_def_to_varying (def);
244 }
245 
246 /* Update the value range and equivalence set for variable VAR to
247    NEW_VR.  Return true if NEW_VR is different from VAR's previous
248    value.
249 
250    NOTE: This function assumes that NEW_VR is a temporary value range
251    object created for the sole purpose of updating VAR's range.  The
252    storage used by the equivalence set from NEW_VR will be freed by
253    this function.  Do not call update_value_range when NEW_VR
254    is the range object associated with another SSA name.  */
255 
256 bool
update_value_range(const_tree var,value_range_equiv * new_vr)257 vr_values::update_value_range (const_tree var, value_range_equiv *new_vr)
258 {
259   value_range_equiv *old_vr;
260   bool is_new;
261 
262   /* If there is a value-range on the SSA name from earlier analysis
263      factor that in.  */
264   if (INTEGRAL_TYPE_P (TREE_TYPE (var)))
265     {
266       value_range_equiv nr;
267       get_global_range_query ()->range_of_expr (nr, const_cast <tree> (var));
268       if (!nr.undefined_p ())
269           new_vr->intersect (&nr);
270     }
271 
272   /* Update the value range, if necessary.  If we cannot allocate a lattice
273      entry for VAR keep it at VARYING.  This happens when DOM feeds us stmts
274      with SSA names allocated after setting up the lattice.  */
275   old_vr = get_lattice_entry (var);
276   if (!old_vr)
277     return false;
278   is_new = !old_vr->equal_p (*new_vr, /*ignore_equivs=*/false);
279 
280   if (is_new)
281     {
282       /* Do not allow transitions up the lattice.  The following
283            is slightly more awkward than just new_vr->type < old_vr->type
284            because VR_RANGE and VR_ANTI_RANGE need to be considered
285            the same.  We may not have is_new when transitioning to
286            UNDEFINED.  If old_vr->type is VARYING, we shouldn't be
287            called, if we are anyway, keep it VARYING.  */
288       if (old_vr->varying_p ())
289           {
290             new_vr->set_varying (TREE_TYPE (var));
291             is_new = false;
292           }
293       else if (new_vr->undefined_p ())
294           {
295             old_vr->set_varying (TREE_TYPE (var));
296             new_vr->set_varying (TREE_TYPE (var));
297             return true;
298           }
299       else
300           old_vr->set (new_vr->min (), new_vr->max (), new_vr->equiv (),
301                          new_vr->kind ());
302     }
303 
304   new_vr->equiv_clear ();
305 
306   return is_new;
307 }
308 
309 /* Return true if value range VR involves exactly one symbol SYM.  */
310 
311 static bool
symbolic_range_based_on_p(value_range * vr,const_tree sym)312 symbolic_range_based_on_p (value_range *vr, const_tree sym)
313 {
314   bool neg, min_has_symbol, max_has_symbol;
315   tree inv;
316 
317   if (is_gimple_min_invariant (vr->min ()))
318     min_has_symbol = false;
319   else if (get_single_symbol (vr->min (), &neg, &inv) == sym)
320     min_has_symbol = true;
321   else
322     return false;
323 
324   if (is_gimple_min_invariant (vr->max ()))
325     max_has_symbol = false;
326   else if (get_single_symbol (vr->max (), &neg, &inv) == sym)
327     max_has_symbol = true;
328   else
329     return false;
330 
331   return (min_has_symbol || max_has_symbol);
332 }
333 
334 /* Return true if the result of assignment STMT is know to be non-zero.  */
335 
336 static bool
gimple_assign_nonzero_p(gimple * stmt)337 gimple_assign_nonzero_p (gimple *stmt)
338 {
339   enum tree_code code = gimple_assign_rhs_code (stmt);
340   bool strict_overflow_p;
341   tree type = TREE_TYPE (gimple_assign_lhs (stmt));
342   switch (get_gimple_rhs_class (code))
343     {
344     case GIMPLE_UNARY_RHS:
345       return tree_unary_nonzero_warnv_p (gimple_assign_rhs_code (stmt),
346                                                    type,
347                                                    gimple_assign_rhs1 (stmt),
348                                                    &strict_overflow_p);
349     case GIMPLE_BINARY_RHS:
350       return tree_binary_nonzero_warnv_p (gimple_assign_rhs_code (stmt),
351                                                     type,
352                                                     gimple_assign_rhs1 (stmt),
353                                                     gimple_assign_rhs2 (stmt),
354                                                     &strict_overflow_p);
355     case GIMPLE_TERNARY_RHS:
356       return false;
357     case GIMPLE_SINGLE_RHS:
358       return tree_single_nonzero_warnv_p (gimple_assign_rhs1 (stmt),
359                                                     &strict_overflow_p);
360     case GIMPLE_INVALID_RHS:
361       gcc_unreachable ();
362     default:
363       gcc_unreachable ();
364     }
365 }
366 
367 /* Return true if STMT is known to compute a non-zero value.  */
368 
369 static bool
gimple_stmt_nonzero_p(gimple * stmt)370 gimple_stmt_nonzero_p (gimple *stmt)
371 {
372   switch (gimple_code (stmt))
373     {
374     case GIMPLE_ASSIGN:
375       return gimple_assign_nonzero_p (stmt);
376     case GIMPLE_CALL:
377       {
378         gcall *call_stmt = as_a<gcall *> (stmt);
379           return (gimple_call_nonnull_result_p (call_stmt)
380                     || gimple_call_nonnull_arg (call_stmt));
381       }
382     default:
383       gcc_unreachable ();
384     }
385 }
386 /* Like tree_expr_nonzero_p, but this function uses value ranges
387    obtained so far.  */
388 
389 bool
vrp_stmt_computes_nonzero(gimple * stmt)390 vr_values::vrp_stmt_computes_nonzero (gimple *stmt)
391 {
392   if (gimple_stmt_nonzero_p (stmt))
393     return true;
394 
395   /* If we have an expression of the form &X->a, then the expression
396      is nonnull if X is nonnull.  */
397   if (is_gimple_assign (stmt)
398       && gimple_assign_rhs_code (stmt) == ADDR_EXPR)
399     {
400       tree expr = gimple_assign_rhs1 (stmt);
401       poly_int64 bitsize, bitpos;
402       tree offset;
403       machine_mode mode;
404       int unsignedp, reversep, volatilep;
405       tree base = get_inner_reference (TREE_OPERAND (expr, 0), &bitsize,
406                                                &bitpos, &offset, &mode, &unsignedp,
407                                                &reversep, &volatilep);
408 
409       if (base != NULL_TREE
410             && TREE_CODE (base) == MEM_REF
411             && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
412           {
413             poly_offset_int off = 0;
414             bool off_cst = false;
415             if (offset == NULL_TREE || TREE_CODE (offset) == INTEGER_CST)
416               {
417                 off = mem_ref_offset (base);
418                 if (offset)
419                     off += poly_offset_int::from (wi::to_poly_wide (offset),
420                                                         SIGNED);
421                 off <<= LOG2_BITS_PER_UNIT;
422                 off += bitpos;
423                 off_cst = true;
424               }
425             /* If &X->a is equal to X and X is ~[0, 0], the result is too.
426                For -fdelete-null-pointer-checks -fno-wrapv-pointer we don't
427                allow going from non-NULL pointer to NULL.  */
428             if ((off_cst && known_eq (off, 0))
429                 || (flag_delete_null_pointer_checks
430                       && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (expr))))
431               {
432                 const value_range_equiv *vr
433                     = get_value_range (TREE_OPERAND (base, 0), stmt);
434                 if (!range_includes_zero_p (vr))
435                     return true;
436               }
437             /* If MEM_REF has a "positive" offset, consider it non-NULL
438                always, for -fdelete-null-pointer-checks also "negative"
439                ones.  Punt for unknown offsets (e.g. variable ones).  */
440             if (!TYPE_OVERFLOW_WRAPS (TREE_TYPE (expr))
441                 && off_cst
442                 && known_ne (off, 0)
443                 && (flag_delete_null_pointer_checks || known_gt (off, 0)))
444               return true;
445           }
446     }
447 
448   return false;
449 }
450 
451 /* Returns true if EXPR is a valid value (as expected by compare_values) --
452    a gimple invariant, or SSA_NAME +- CST.  */
453 
454 static bool
valid_value_p(tree expr)455 valid_value_p (tree expr)
456 {
457   if (TREE_CODE (expr) == SSA_NAME)
458     return true;
459 
460   if (TREE_CODE (expr) == PLUS_EXPR
461       || TREE_CODE (expr) == MINUS_EXPR)
462     return (TREE_CODE (TREE_OPERAND (expr, 0)) == SSA_NAME
463               && TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST);
464 
465   return is_gimple_min_invariant (expr);
466 }
467 
468 /* If OP has a value range with a single constant value return that,
469    otherwise return NULL_TREE.  This returns OP itself if OP is a
470    constant.  */
471 
472 tree
op_with_constant_singleton_value_range(tree op)473 vr_values::op_with_constant_singleton_value_range (tree op)
474 {
475   if (is_gimple_min_invariant (op))
476     return op;
477 
478   if (TREE_CODE (op) != SSA_NAME)
479     return NULL_TREE;
480 
481   tree t;
482   if (get_value_range (op)->singleton_p (&t))
483     return t;
484   return NULL;
485 }
486 
487 /* Return true if op is in a boolean [0, 1] value-range.  */
488 
489 bool
op_with_boolean_value_range_p(tree op,gimple * s)490 simplify_using_ranges::op_with_boolean_value_range_p (tree op, gimple *s)
491 {
492   if (TYPE_PRECISION (TREE_TYPE (op)) == 1)
493     return true;
494 
495   if (integer_zerop (op)
496       || integer_onep (op))
497     return true;
498 
499   if (TREE_CODE (op) != SSA_NAME)
500     return false;
501 
502   /* ?? Errr, this should probably check for [0,0] and [1,1] as well
503      as [0,1].  */
504   const value_range *vr = query->get_value_range (op, s);
505   return *vr == value_range (build_zero_cst (TREE_TYPE (op)),
506                                    build_one_cst (TREE_TYPE (op)));
507 }
508 
509 /* Extract value range information for VAR when (OP COND_CODE LIMIT) is
510    true and store it in *VR_P.  */
511 
512 void
extract_range_for_var_from_comparison_expr(tree var,enum tree_code cond_code,tree op,tree limit,value_range_equiv * vr_p)513 vr_values::extract_range_for_var_from_comparison_expr (tree var,
514                                                                    enum tree_code cond_code,
515                                                                    tree op, tree limit,
516                                                                    value_range_equiv *vr_p)
517 {
518   tree  min, max, type;
519   const value_range_equiv *limit_vr;
520   type = TREE_TYPE (var);
521 
522   /* For pointer arithmetic, we only keep track of pointer equality
523      and inequality.  If we arrive here with unfolded conditions like
524      _1 > _1 do not derive anything.  */
525   if ((POINTER_TYPE_P (type) && cond_code != NE_EXPR && cond_code != EQ_EXPR)
526       || limit == var)
527     {
528       vr_p->set_varying (type);
529       return;
530     }
531 
532   /* If LIMIT is another SSA name and LIMIT has a range of its own,
533      try to use LIMIT's range to avoid creating symbolic ranges
534      unnecessarily. */
535   limit_vr = (TREE_CODE (limit) == SSA_NAME) ? get_value_range (limit) : NULL;
536 
537   /* LIMIT's range is only interesting if it has any useful information.  */
538   if (! limit_vr
539       || limit_vr->undefined_p ()
540       || limit_vr->varying_p ()
541       || (limit_vr->symbolic_p ()
542             && ! (limit_vr->kind () == VR_RANGE
543                     && (limit_vr->min () == limit_vr->max ()
544                         || operand_equal_p (limit_vr->min (),
545                                                   limit_vr->max (), 0)))))
546     limit_vr = NULL;
547 
548   /* Initially, the new range has the same set of equivalences of
549      VAR's range.  This will be revised before returning the final
550      value.  Since assertions may be chained via mutually exclusive
551      predicates, we will need to trim the set of equivalences before
552      we are done.  */
553   gcc_assert (vr_p->equiv () == NULL);
554   vr_p->equiv_add (var, get_value_range (var), &vrp_equiv_obstack);
555 
556   /* Extract a new range based on the asserted comparison for VAR and
557      LIMIT's value range.  Notice that if LIMIT has an anti-range, we
558      will only use it for equality comparisons (EQ_EXPR).  For any
559      other kind of assertion, we cannot derive a range from LIMIT's
560      anti-range that can be used to describe the new range.  For
561      instance, ASSERT_EXPR <x_2, x_2 <= b_4>.  If b_4 is ~[2, 10],
562      then b_4 takes on the ranges [-INF, 1] and [11, +INF].  There is
563      no single range for x_2 that could describe LE_EXPR, so we might
564      as well build the range [b_4, +INF] for it.
565      One special case we handle is extracting a range from a
566      range test encoded as (unsigned)var + CST <= limit.  */
567   if (TREE_CODE (op) == NOP_EXPR
568       || TREE_CODE (op) == PLUS_EXPR)
569     {
570       if (TREE_CODE (op) == PLUS_EXPR)
571         {
572             min = fold_build1 (NEGATE_EXPR, TREE_TYPE (TREE_OPERAND (op, 1)),
573                                    TREE_OPERAND (op, 1));
574           max = int_const_binop (PLUS_EXPR, limit, min);
575             op = TREE_OPERAND (op, 0);
576           }
577       else
578           {
579             min = build_int_cst (TREE_TYPE (var), 0);
580             max = limit;
581           }
582 
583       /* Make sure to not set TREE_OVERFLOW on the final type
584            conversion.  We are willingly interpreting large positive
585            unsigned values as negative signed values here.  */
586       min = force_fit_type (TREE_TYPE (var), wi::to_widest (min), 0, false);
587       max = force_fit_type (TREE_TYPE (var), wi::to_widest (max), 0, false);
588 
589       /* We can transform a max, min range to an anti-range or
590          vice-versa.  Use set_and_canonicalize which does this for
591          us.  */
592       if (cond_code == LE_EXPR)
593           vr_p->set (min, max, vr_p->equiv ());
594       else if (cond_code == GT_EXPR)
595           vr_p->set (min, max, vr_p->equiv (), VR_ANTI_RANGE);
596       else
597           gcc_unreachable ();
598     }
599   else if (cond_code == EQ_EXPR)
600     {
601       enum value_range_kind range_kind;
602 
603       if (limit_vr)
604           {
605             range_kind = limit_vr->kind ();
606             min = limit_vr->min ();
607             max = limit_vr->max ();
608           }
609       else
610           {
611             range_kind = VR_RANGE;
612             min = limit;
613             max = limit;
614           }
615 
616       vr_p->update (min, max, range_kind);
617 
618       /* When asserting the equality VAR == LIMIT and LIMIT is another
619            SSA name, the new range will also inherit the equivalence set
620            from LIMIT.  */
621       if (TREE_CODE (limit) == SSA_NAME)
622           vr_p->equiv_add (limit, get_value_range (limit), &vrp_equiv_obstack);
623     }
624   else if (cond_code == NE_EXPR)
625     {
626       /* As described above, when LIMIT's range is an anti-range and
627            this assertion is an inequality (NE_EXPR), then we cannot
628            derive anything from the anti-range.  For instance, if
629            LIMIT's range was ~[0, 0], the assertion 'VAR != LIMIT' does
630            not imply that VAR's range is [0, 0].  So, in the case of
631            anti-ranges, we just assert the inequality using LIMIT and
632            not its anti-range.
633 
634            If LIMIT_VR is a range, we can only use it to build a new
635            anti-range if LIMIT_VR is a single-valued range.  For
636            instance, if LIMIT_VR is [0, 1], the predicate
637            VAR != [0, 1] does not mean that VAR's range is ~[0, 1].
638            Rather, it means that for value 0 VAR should be ~[0, 0]
639            and for value 1, VAR should be ~[1, 1].  We cannot
640            represent these ranges.
641 
642            The only situation in which we can build a valid
643            anti-range is when LIMIT_VR is a single-valued range
644            (i.e., LIMIT_VR->MIN == LIMIT_VR->MAX).  In that case,
645            build the anti-range ~[LIMIT_VR->MIN, LIMIT_VR->MAX].  */
646       if (limit_vr
647             && limit_vr->kind () == VR_RANGE
648             && compare_values (limit_vr->min (), limit_vr->max ()) == 0)
649           {
650             min = limit_vr->min ();
651             max = limit_vr->max ();
652           }
653       else
654           {
655             /* In any other case, we cannot use LIMIT's range to build a
656                valid anti-range.  */
657             min = max = limit;
658           }
659 
660       /* If MIN and MAX cover the whole range for their type, then
661            just use the original LIMIT.  */
662       if (INTEGRAL_TYPE_P (type)
663             && vrp_val_is_min (min)
664             && vrp_val_is_max (max))
665           min = max = limit;
666 
667       vr_p->set (min, max, vr_p->equiv (), VR_ANTI_RANGE);
668     }
669   else if (cond_code == LE_EXPR || cond_code == LT_EXPR)
670     {
671       min = TYPE_MIN_VALUE (type);
672 
673       if (limit_vr == NULL || limit_vr->kind () == VR_ANTI_RANGE)
674           max = limit;
675       else
676           {
677             /* If LIMIT_VR is of the form [N1, N2], we need to build the
678                range [MIN, N2] for LE_EXPR and [MIN, N2 - 1] for
679                LT_EXPR.  */
680             max = limit_vr->max ();
681           }
682 
683       /* If the maximum value forces us to be out of bounds, simply punt.
684            It would be pointless to try and do anything more since this
685            all should be optimized away above us.  */
686       if (cond_code == LT_EXPR
687             && compare_values (max, min) == 0)
688           vr_p->set_varying (TREE_TYPE (min));
689       else
690           {
691             /* For LT_EXPR, we create the range [MIN, MAX - 1].  */
692             if (cond_code == LT_EXPR)
693               {
694                 if (TYPE_PRECISION (TREE_TYPE (max)) == 1
695                       && !TYPE_UNSIGNED (TREE_TYPE (max)))
696                     max = fold_build2 (PLUS_EXPR, TREE_TYPE (max), max,
697                                            build_int_cst (TREE_TYPE (max), -1));
698                 else
699                     max = fold_build2 (MINUS_EXPR, TREE_TYPE (max), max,
700                                            build_int_cst (TREE_TYPE (max), 1));
701                 /* Signal to compare_values_warnv this expr doesn't overflow.  */
702                 if (EXPR_P (max))
703                     suppress_warning (max, OPT_Woverflow);
704               }
705 
706             vr_p->update (min, max);
707           }
708     }
709   else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
710     {
711       max = TYPE_MAX_VALUE (type);
712 
713       if (limit_vr == NULL || limit_vr->kind () == VR_ANTI_RANGE)
714           min = limit;
715       else
716           {
717             /* If LIMIT_VR is of the form [N1, N2], we need to build the
718                range [N1, MAX] for GE_EXPR and [N1 + 1, MAX] for
719                GT_EXPR.  */
720             min = limit_vr->min ();
721           }
722 
723       /* If the minimum value forces us to be out of bounds, simply punt.
724            It would be pointless to try and do anything more since this
725            all should be optimized away above us.  */
726       if (cond_code == GT_EXPR
727             && compare_values (min, max) == 0)
728           vr_p->set_varying (TREE_TYPE (min));
729       else
730           {
731             /* For GT_EXPR, we create the range [MIN + 1, MAX].  */
732             if (cond_code == GT_EXPR)
733               {
734                 if (TYPE_PRECISION (TREE_TYPE (min)) == 1
735                       && !TYPE_UNSIGNED (TREE_TYPE (min)))
736                     min = fold_build2 (MINUS_EXPR, TREE_TYPE (min), min,
737                                            build_int_cst (TREE_TYPE (min), -1));
738                 else
739                     min = fold_build2 (PLUS_EXPR, TREE_TYPE (min), min,
740                                            build_int_cst (TREE_TYPE (min), 1));
741                 /* Signal to compare_values_warnv this expr doesn't overflow.  */
742                 if (EXPR_P (min))
743                     suppress_warning (min, OPT_Woverflow);
744               }
745 
746             vr_p->update (min, max);
747           }
748     }
749   else
750     gcc_unreachable ();
751 
752   /* Finally intersect the new range with what we already know about var.  */
753   vr_p->intersect (get_value_range (var));
754 }
755 
756 /* Extract value range information from an ASSERT_EXPR EXPR and store
757    it in *VR_P.  */
758 
759 void
extract_range_from_assert(value_range_equiv * vr_p,tree expr)760 vr_values::extract_range_from_assert (value_range_equiv *vr_p, tree expr)
761 {
762   tree var = ASSERT_EXPR_VAR (expr);
763   tree cond = ASSERT_EXPR_COND (expr);
764   tree limit, op;
765   enum tree_code cond_code;
766   gcc_assert (COMPARISON_CLASS_P (cond));
767 
768   /* Find VAR in the ASSERT_EXPR conditional.  */
769   if (var == TREE_OPERAND (cond, 0)
770       || TREE_CODE (TREE_OPERAND (cond, 0)) == PLUS_EXPR
771       || TREE_CODE (TREE_OPERAND (cond, 0)) == NOP_EXPR)
772     {
773       /* If the predicate is of the form VAR COMP LIMIT, then we just
774            take LIMIT from the RHS and use the same comparison code.  */
775       cond_code = TREE_CODE (cond);
776       limit = TREE_OPERAND (cond, 1);
777       op = TREE_OPERAND (cond, 0);
778     }
779   else
780     {
781       /* If the predicate is of the form LIMIT COMP VAR, then we need
782            to flip around the comparison code to create the proper range
783            for VAR.  */
784       cond_code = swap_tree_comparison (TREE_CODE (cond));
785       limit = TREE_OPERAND (cond, 0);
786       op = TREE_OPERAND (cond, 1);
787     }
788   extract_range_for_var_from_comparison_expr (var, cond_code, op,
789                                                         limit, vr_p);
790 }
791 
792 /* Extract range information from SSA name VAR and store it in VR.  If
793    VAR has an interesting range, use it.  Otherwise, create the
794    range [VAR, VAR] and return it.  This is useful in situations where
795    we may have conditionals testing values of VARYING names.  For
796    instance,
797 
798           x_3 = y_5;
799           if (x_3 > y_5)
800             ...
801 
802     Even if y_5 is deemed VARYING, we can determine that x_3 > y_5 is
803     always false.  */
804 
805 void
extract_range_from_ssa_name(value_range_equiv * vr,tree var)806 vr_values::extract_range_from_ssa_name (value_range_equiv *vr, tree var)
807 {
808   const value_range_equiv *var_vr = get_value_range (var);
809 
810   if (!var_vr->varying_p ())
811     vr->deep_copy (var_vr);
812   else
813     vr->set (var);
814 
815   if (!vr->undefined_p ())
816     vr->equiv_add (var, get_value_range (var), &vrp_equiv_obstack);
817 }
818 
819 /* Extract range information from a binary expression OP0 CODE OP1 based on
820    the ranges of each of its operands with resulting type EXPR_TYPE.
821    The resulting range is stored in *VR.  */
822 
823 void
extract_range_from_binary_expr(value_range_equiv * vr,enum tree_code code,tree expr_type,tree op0,tree op1)824 vr_values::extract_range_from_binary_expr (value_range_equiv *vr,
825                                                      enum tree_code code,
826                                                      tree expr_type, tree op0, tree op1)
827 {
828   /* Get value ranges for each operand.  For constant operands, create
829      a new value range with the operand to simplify processing.  */
830   value_range vr0, vr1;
831   if (TREE_CODE (op0) == SSA_NAME)
832     vr0 = *(get_value_range (op0));
833   else if (is_gimple_min_invariant (op0))
834     vr0.set (op0);
835   else
836     vr0.set_varying (TREE_TYPE (op0));
837 
838   if (TREE_CODE (op1) == SSA_NAME)
839     vr1 = *(get_value_range (op1));
840   else if (is_gimple_min_invariant (op1))
841     vr1.set (op1);
842   else
843     vr1.set_varying (TREE_TYPE (op1));
844 
845   /* If one argument is varying, we can sometimes still deduce a
846      range for the output: any + [3, +INF] is in [MIN+3, +INF].  */
847   if (INTEGRAL_TYPE_P (TREE_TYPE (op0))
848       && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0)))
849     {
850       if (vr0.varying_p () && !vr1.varying_p ())
851           vr0 = value_range (vrp_val_min (expr_type), vrp_val_max (expr_type));
852       else if (vr1.varying_p () && !vr0.varying_p ())
853           vr1 = value_range (vrp_val_min (expr_type), vrp_val_max (expr_type));
854     }
855 
856   range_fold_binary_expr (vr, code, expr_type, &vr0, &vr1);
857 
858   /* Set value_range for n in following sequence:
859      def = __builtin_memchr (arg, 0, sz)
860      n = def - arg
861      Here the range for n can be set to [0, PTRDIFF_MAX - 1]. */
862 
863   if (vr->varying_p ()
864       && code == POINTER_DIFF_EXPR
865       && TREE_CODE (op0) == SSA_NAME
866       && TREE_CODE (op1) == SSA_NAME)
867     {
868       tree op0_ptype = TREE_TYPE (TREE_TYPE (op0));
869       tree op1_ptype = TREE_TYPE (TREE_TYPE (op1));
870       gcall *call_stmt = NULL;
871 
872       if (TYPE_MODE (op0_ptype) == TYPE_MODE (char_type_node)
873             && TYPE_PRECISION (op0_ptype) == TYPE_PRECISION (char_type_node)
874             && TYPE_MODE (op1_ptype) == TYPE_MODE (char_type_node)
875             && TYPE_PRECISION (op1_ptype) == TYPE_PRECISION (char_type_node)
876             && (call_stmt = dyn_cast<gcall *>(SSA_NAME_DEF_STMT (op0)))
877             && gimple_call_builtin_p (call_stmt, BUILT_IN_MEMCHR)
878             && operand_equal_p (op0, gimple_call_lhs (call_stmt), 0)
879             && operand_equal_p (op1, gimple_call_arg (call_stmt, 0), 0)
880             && integer_zerop (gimple_call_arg (call_stmt, 1)))
881               {
882                 tree max = vrp_val_max (ptrdiff_type_node);
883                 wide_int wmax = wi::to_wide (max, TYPE_PRECISION (TREE_TYPE (max)));
884                 tree range_min = build_zero_cst (expr_type);
885                 tree range_max = wide_int_to_tree (expr_type, wmax - 1);
886                 vr->set (range_min, range_max);
887                 return;
888               }
889      }
890 
891   /* Try harder for PLUS and MINUS if the range of one operand is symbolic
892      and based on the other operand, for example if it was deduced from a
893      symbolic comparison.  When a bound of the range of the first operand
894      is invariant, we set the corresponding bound of the new range to INF
895      in order to avoid recursing on the range of the second operand.  */
896   if (vr->varying_p ()
897       && (code == PLUS_EXPR || code == MINUS_EXPR)
898       && TREE_CODE (op1) == SSA_NAME
899       && vr0.kind () == VR_RANGE
900       && symbolic_range_based_on_p (&vr0, op1))
901     {
902       const bool minus_p = (code == MINUS_EXPR);
903       value_range n_vr1;
904 
905       /* Try with VR0 and [-INF, OP1].  */
906       if (is_gimple_min_invariant (minus_p ? vr0.max () : vr0.min ()))
907           n_vr1.set (vrp_val_min (expr_type), op1);
908 
909       /* Try with VR0 and [OP1, +INF].  */
910       else if (is_gimple_min_invariant (minus_p ? vr0.min () : vr0.max ()))
911           n_vr1.set (op1, vrp_val_max (expr_type));
912 
913       /* Try with VR0 and [OP1, OP1].  */
914       else
915           n_vr1.set (op1, op1);
916 
917       range_fold_binary_expr (vr, code, expr_type, &vr0, &n_vr1);
918     }
919 
920   if (vr->varying_p ()
921       && (code == PLUS_EXPR || code == MINUS_EXPR)
922       && TREE_CODE (op0) == SSA_NAME
923       && vr1.kind () == VR_RANGE
924       && symbolic_range_based_on_p (&vr1, op0))
925     {
926       const bool minus_p = (code == MINUS_EXPR);
927       value_range n_vr0;
928 
929       /* Try with [-INF, OP0] and VR1.  */
930       if (is_gimple_min_invariant (minus_p ? vr1.max () : vr1.min ()))
931           n_vr0.set (vrp_val_min (expr_type), op0);
932 
933       /* Try with [OP0, +INF] and VR1.  */
934       else if (is_gimple_min_invariant (minus_p ? vr1.min (): vr1.max ()))
935           n_vr0.set (op0, vrp_val_max (expr_type));
936 
937       /* Try with [OP0, OP0] and VR1.  */
938       else
939           n_vr0.set (op0);
940 
941       range_fold_binary_expr (vr, code, expr_type, &n_vr0, &vr1);
942     }
943 
944   /* If we didn't derive a range for MINUS_EXPR, and
945      op1's range is ~[op0,op0] or vice-versa, then we
946      can derive a non-null range.  This happens often for
947      pointer subtraction.  */
948   if (vr->varying_p ()
949       && (code == MINUS_EXPR || code == POINTER_DIFF_EXPR)
950       && TREE_CODE (op0) == SSA_NAME
951       && ((vr0.kind () == VR_ANTI_RANGE
952              && vr0.min () == op1
953              && vr0.min () == vr0.max ())
954             || (vr1.kind () == VR_ANTI_RANGE
955                 && vr1.min () == op0
956                 && vr1.min () == vr1.max ())))
957     {
958       vr->set_nonzero (expr_type);
959       vr->equiv_clear ();
960     }
961 }
962 
963 /* Extract range information from a unary expression CODE OP0 based on
964    the range of its operand with resulting type TYPE.
965    The resulting range is stored in *VR.  */
966 
967 void
extract_range_from_unary_expr(value_range_equiv * vr,enum tree_code code,tree type,tree op0)968 vr_values::extract_range_from_unary_expr (value_range_equiv *vr,
969                                                     enum tree_code code,
970                                                     tree type, tree op0)
971 {
972   value_range vr0;
973 
974   /* Get value ranges for the operand.  For constant operands, create
975      a new value range with the operand to simplify processing.  */
976   if (TREE_CODE (op0) == SSA_NAME)
977     vr0 = *(get_value_range (op0));
978   else if (is_gimple_min_invariant (op0))
979     vr0.set (op0);
980   else
981     vr0.set_varying (type);
982 
983   range_fold_unary_expr (vr, code, type, &vr0, TREE_TYPE (op0));
984 }
985 
986 
987 /* Extract range information from a conditional expression STMT based on
988    the ranges of each of its operands and the expression code.  */
989 
990 void
extract_range_from_cond_expr(value_range_equiv * vr,gassign * stmt)991 vr_values::extract_range_from_cond_expr (value_range_equiv *vr, gassign *stmt)
992 {
993   /* Get value ranges for each operand.  For constant operands, create
994      a new value range with the operand to simplify processing.  */
995   tree op0 = gimple_assign_rhs2 (stmt);
996   value_range_equiv tem0;
997   const value_range_equiv *vr0 = &tem0;
998   if (TREE_CODE (op0) == SSA_NAME)
999     vr0 = get_value_range (op0);
1000   else if (is_gimple_min_invariant (op0))
1001     tem0.set (op0);
1002   else
1003     tem0.set_varying (TREE_TYPE (op0));
1004 
1005   tree op1 = gimple_assign_rhs3 (stmt);
1006   value_range_equiv tem1;
1007   const value_range_equiv *vr1 = &tem1;
1008   if (TREE_CODE (op1) == SSA_NAME)
1009     vr1 = get_value_range (op1);
1010   else if (is_gimple_min_invariant (op1))
1011     tem1.set (op1);
1012   else
1013     tem1.set_varying (TREE_TYPE (op1));
1014 
1015   /* The resulting value range is the union of the operand ranges */
1016   vr->deep_copy (vr0);
1017   vr->union_ (vr1);
1018 }
1019 
1020 
1021 /* Extract range information from a comparison expression EXPR based
1022    on the range of its operand and the expression code.  */
1023 
1024 void
extract_range_from_comparison(value_range_equiv * vr,gimple * stmt)1025 vr_values::extract_range_from_comparison (value_range_equiv *vr,
1026                                                     gimple *stmt)
1027 {
1028   enum tree_code code = gimple_assign_rhs_code (stmt);
1029   tree type = TREE_TYPE (gimple_assign_lhs (stmt));
1030   tree op0 = gimple_assign_rhs1 (stmt);
1031   tree op1 = gimple_assign_rhs2 (stmt);
1032   bool sop;
1033   tree val
1034     = simplifier.vrp_evaluate_conditional_warnv_with_ops (stmt, code, op0, op1,
1035                                                                         false, &sop, NULL);
1036   if (val)
1037     {
1038       /* Since this expression was found on the RHS of an assignment,
1039            its type may be different from _Bool.  Convert VAL to EXPR's
1040            type.  */
1041       val = fold_convert (type, val);
1042       if (is_gimple_min_invariant (val))
1043           vr->set (val);
1044       else
1045           vr->update (val, val);
1046     }
1047   else
1048     /* The result of a comparison is always true or false.  */
1049     set_value_range_to_truthvalue (vr, type);
1050 }
1051 
1052 /* Helper function for simplify_internal_call_using_ranges and
1053    extract_range_basic.  Return true if OP0 SUBCODE OP1 for
1054    SUBCODE {PLUS,MINUS,MULT}_EXPR is known to never overflow or
1055    always overflow.  Set *OVF to true if it is known to always
1056    overflow.  */
1057 
1058 static bool
check_for_binary_op_overflow(range_query * query,enum tree_code subcode,tree type,tree op0,tree op1,bool * ovf,gimple * s=NULL)1059 check_for_binary_op_overflow (range_query *query,
1060                                     enum tree_code subcode, tree type,
1061                                     tree op0, tree op1, bool *ovf, gimple *s = NULL)
1062 {
1063   value_range vr0, vr1;
1064   if (TREE_CODE (op0) == SSA_NAME)
1065     vr0 = *query->get_value_range (op0, s);
1066   else if (TREE_CODE (op0) == INTEGER_CST)
1067     vr0.set (op0);
1068   else
1069     vr0.set_varying (TREE_TYPE (op0));
1070 
1071   if (TREE_CODE (op1) == SSA_NAME)
1072     vr1 = *query->get_value_range (op1, s);
1073   else if (TREE_CODE (op1) == INTEGER_CST)
1074     vr1.set (op1);
1075   else
1076     vr1.set_varying (TREE_TYPE (op1));
1077 
1078   tree vr0min = vr0.min (), vr0max = vr0.max ();
1079   tree vr1min = vr1.min (), vr1max = vr1.max ();
1080   if (!range_int_cst_p (&vr0)
1081       || TREE_OVERFLOW (vr0min)
1082       || TREE_OVERFLOW (vr0max))
1083     {
1084       vr0min = vrp_val_min (TREE_TYPE (op0));
1085       vr0max = vrp_val_max (TREE_TYPE (op0));
1086     }
1087   if (!range_int_cst_p (&vr1)
1088       || TREE_OVERFLOW (vr1min)
1089       || TREE_OVERFLOW (vr1max))
1090     {
1091       vr1min = vrp_val_min (TREE_TYPE (op1));
1092       vr1max = vrp_val_max (TREE_TYPE (op1));
1093     }
1094   *ovf = arith_overflowed_p (subcode, type, vr0min,
1095                                    subcode == MINUS_EXPR ? vr1max : vr1min);
1096   if (arith_overflowed_p (subcode, type, vr0max,
1097                                 subcode == MINUS_EXPR ? vr1min : vr1max) != *ovf)
1098     return false;
1099   if (subcode == MULT_EXPR)
1100     {
1101       if (arith_overflowed_p (subcode, type, vr0min, vr1max) != *ovf
1102             || arith_overflowed_p (subcode, type, vr0max, vr1min) != *ovf)
1103           return false;
1104     }
1105   if (*ovf)
1106     {
1107       /* So far we found that there is an overflow on the boundaries.
1108            That doesn't prove that there is an overflow even for all values
1109            in between the boundaries.  For that compute widest_int range
1110            of the result and see if it doesn't overlap the range of
1111            type.  */
1112       widest_int wmin, wmax;
1113       widest_int w[4];
1114       int i;
1115       w[0] = wi::to_widest (vr0min);
1116       w[1] = wi::to_widest (vr0max);
1117       w[2] = wi::to_widest (vr1min);
1118       w[3] = wi::to_widest (vr1max);
1119       for (i = 0; i < 4; i++)
1120           {
1121             widest_int wt;
1122             switch (subcode)
1123               {
1124               case PLUS_EXPR:
1125                 wt = wi::add (w[i & 1], w[2 + (i & 2) / 2]);
1126                 break;
1127               case MINUS_EXPR:
1128                 wt = wi::sub (w[i & 1], w[2 + (i & 2) / 2]);
1129                 break;
1130               case MULT_EXPR:
1131                 wt = wi::mul (w[i & 1], w[2 + (i & 2) / 2]);
1132                 break;
1133               default:
1134                 gcc_unreachable ();
1135               }
1136             if (i == 0)
1137               {
1138                 wmin = wt;
1139                 wmax = wt;
1140               }
1141             else
1142               {
1143                 wmin = wi::smin (wmin, wt);
1144                 wmax = wi::smax (wmax, wt);
1145               }
1146           }
1147       /* The result of op0 CODE op1 is known to be in range
1148            [wmin, wmax].  */
1149       widest_int wtmin = wi::to_widest (vrp_val_min (type));
1150       widest_int wtmax = wi::to_widest (vrp_val_max (type));
1151       /* If all values in [wmin, wmax] are smaller than
1152            [wtmin, wtmax] or all are larger than [wtmin, wtmax],
1153            the arithmetic operation will always overflow.  */
1154       if (wmax < wtmin || wmin > wtmax)
1155           return true;
1156       return false;
1157     }
1158   return true;
1159 }
1160 
1161 /* Derive a range from a builtin.  Set range in VR and return TRUE if
1162    successful.  */
1163 
1164 bool
extract_range_from_ubsan_builtin(value_range_equiv * vr,gimple * stmt)1165 vr_values::extract_range_from_ubsan_builtin (value_range_equiv *vr, gimple *stmt)
1166 {
1167   gcc_assert (is_gimple_call (stmt));
1168   enum tree_code subcode = ERROR_MARK;
1169   combined_fn cfn = gimple_call_combined_fn (stmt);
1170   scalar_int_mode mode;
1171 
1172   switch (cfn)
1173     {
1174     case CFN_UBSAN_CHECK_ADD:
1175       subcode = PLUS_EXPR;
1176       break;
1177     case CFN_UBSAN_CHECK_SUB:
1178       subcode = MINUS_EXPR;
1179       break;
1180     case CFN_UBSAN_CHECK_MUL:
1181       subcode = MULT_EXPR;
1182       break;
1183     default:
1184       break;
1185     }
1186   if (subcode != ERROR_MARK)
1187     {
1188       bool saved_flag_wrapv = flag_wrapv;
1189       /* Pretend the arithmetics is wrapping.  If there is
1190            any overflow, we'll complain, but will actually do
1191            wrapping operation.  */
1192       flag_wrapv = 1;
1193       extract_range_from_binary_expr (vr, subcode,
1194                                               TREE_TYPE (gimple_call_arg (stmt, 0)),
1195                                               gimple_call_arg (stmt, 0),
1196                                               gimple_call_arg (stmt, 1));
1197       flag_wrapv = saved_flag_wrapv;
1198 
1199       /* If for both arguments vrp_valueize returned non-NULL,
1200            this should have been already folded and if not, it
1201            wasn't folded because of overflow.  Avoid removing the
1202            UBSAN_CHECK_* calls in that case.  */
1203       if (vr->kind () == VR_RANGE
1204             && (vr->min () == vr->max ()
1205                 || operand_equal_p (vr->min (), vr->max (), 0)))
1206           vr->set_varying (vr->type ());
1207 
1208       return !vr->varying_p ();
1209     }
1210   return false;
1211 }
1212 
1213 /* Try to derive a nonnegative or nonzero range out of STMT relying
1214    primarily on generic routines in fold in conjunction with range data.
1215    Store the result in *VR */
1216 
1217 void
extract_range_basic(value_range_equiv * vr,gimple * stmt)1218 vr_values::extract_range_basic (value_range_equiv *vr, gimple *stmt)
1219 {
1220   bool sop;
1221 
1222   if (is_gimple_call (stmt))
1223     {
1224       combined_fn cfn = gimple_call_combined_fn (stmt);
1225       switch (cfn)
1226           {
1227           case CFN_UBSAN_CHECK_ADD:
1228           case CFN_UBSAN_CHECK_SUB:
1229           case CFN_UBSAN_CHECK_MUL:
1230             if (extract_range_from_ubsan_builtin (vr, stmt))
1231               return;
1232             break;
1233           default:
1234             if (fold_range (*vr, stmt, this))
1235               {
1236                 /* The original code nuked equivalences every time a
1237                      range was found, so do the same here.  */
1238                 vr->equiv_clear ();
1239                 return;
1240               }
1241             break;
1242           }
1243     }
1244   /* Handle extraction of the two results (result of arithmetics and
1245      a flag whether arithmetics overflowed) from {ADD,SUB,MUL}_OVERFLOW
1246      internal function.  Similarly from ATOMIC_COMPARE_EXCHANGE.  */
1247   if (is_gimple_assign (stmt)
1248       && (gimple_assign_rhs_code (stmt) == REALPART_EXPR
1249             || gimple_assign_rhs_code (stmt) == IMAGPART_EXPR)
1250       && INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt))))
1251     {
1252       enum tree_code code = gimple_assign_rhs_code (stmt);
1253       tree op = gimple_assign_rhs1 (stmt);
1254       tree type = TREE_TYPE (gimple_assign_lhs (stmt));
1255       if (TREE_CODE (op) == code && TREE_CODE (TREE_OPERAND (op, 0)) == SSA_NAME)
1256           {
1257             gimple *g = SSA_NAME_DEF_STMT (TREE_OPERAND (op, 0));
1258             if (is_gimple_call (g) && gimple_call_internal_p (g))
1259               {
1260                 enum tree_code subcode = ERROR_MARK;
1261                 switch (gimple_call_internal_fn (g))
1262                     {
1263                     case IFN_ADD_OVERFLOW:
1264                       subcode = PLUS_EXPR;
1265                       break;
1266                     case IFN_SUB_OVERFLOW:
1267                       subcode = MINUS_EXPR;
1268                       break;
1269                     case IFN_MUL_OVERFLOW:
1270                       subcode = MULT_EXPR;
1271                       break;
1272                     case IFN_ATOMIC_COMPARE_EXCHANGE:
1273                       if (code == IMAGPART_EXPR)
1274                         {
1275                           /* This is the boolean return value whether compare and
1276                                exchange changed anything or not.  */
1277                           vr->set (build_int_cst (type, 0),
1278                                      build_int_cst (type, 1));
1279                           return;
1280                         }
1281                       break;
1282                     default:
1283                       break;
1284                     }
1285                 if (subcode != ERROR_MARK)
1286                     {
1287                       tree op0 = gimple_call_arg (g, 0);
1288                       tree op1 = gimple_call_arg (g, 1);
1289                       if (code == IMAGPART_EXPR)
1290                         {
1291                           bool ovf = false;
1292                           if (check_for_binary_op_overflow (this, subcode, type,
1293                                                                       op0, op1, &ovf))
1294                               vr->set (build_int_cst (type, ovf));
1295                           else if (TYPE_PRECISION (type) == 1
1296                                      && !TYPE_UNSIGNED (type))
1297                               vr->set_varying (type);
1298                           else
1299                               vr->set (build_int_cst (type, 0),
1300                                          build_int_cst (type, 1));
1301                         }
1302                       else if (types_compatible_p (type, TREE_TYPE (op0))
1303                                  && types_compatible_p (type, TREE_TYPE (op1)))
1304                         {
1305                           bool saved_flag_wrapv = flag_wrapv;
1306                           /* Pretend the arithmetics is wrapping.  If there is
1307                                any overflow, IMAGPART_EXPR will be set.  */
1308                           flag_wrapv = 1;
1309                           extract_range_from_binary_expr (vr, subcode, type,
1310                                                                   op0, op1);
1311                           flag_wrapv = saved_flag_wrapv;
1312                         }
1313                       else
1314                         {
1315                           value_range_equiv vr0, vr1;
1316                           bool saved_flag_wrapv = flag_wrapv;
1317                           /* Pretend the arithmetics is wrapping.  If there is
1318                                any overflow, IMAGPART_EXPR will be set.  */
1319                           flag_wrapv = 1;
1320                           extract_range_from_unary_expr (&vr0, NOP_EXPR,
1321                                                                  type, op0);
1322                           extract_range_from_unary_expr (&vr1, NOP_EXPR,
1323                                                                  type, op1);
1324                           range_fold_binary_expr (vr, subcode, type, &vr0, &vr1);
1325                           flag_wrapv = saved_flag_wrapv;
1326                         }
1327                       return;
1328                     }
1329               }
1330           }
1331     }
1332   /* None of the below should need a 'type', but we are only called
1333      for assignments and calls with a LHS.  */
1334   tree type = TREE_TYPE (gimple_get_lhs (stmt));
1335   if (INTEGRAL_TYPE_P (type)
1336       && gimple_stmt_nonnegative_warnv_p (stmt, &sop))
1337     set_value_range_to_nonnegative (vr, type);
1338   else if (vrp_stmt_computes_nonzero (stmt))
1339     {
1340       vr->set_nonzero (type);
1341       vr->equiv_clear ();
1342     }
1343   else
1344     vr->set_varying (type);
1345 }
1346 
1347 
1348 /* Try to compute a useful range out of assignment STMT and store it
1349    in *VR.  */
1350 
1351 void
extract_range_from_assignment(value_range_equiv * vr,gassign * stmt)1352 vr_values::extract_range_from_assignment (value_range_equiv *vr, gassign *stmt)
1353 {
1354   enum tree_code code = gimple_assign_rhs_code (stmt);
1355 
1356   if (code == ASSERT_EXPR)
1357     extract_range_from_assert (vr, gimple_assign_rhs1 (stmt));
1358   else if (code == SSA_NAME)
1359     extract_range_from_ssa_name (vr, gimple_assign_rhs1 (stmt));
1360   else if (TREE_CODE_CLASS (code) == tcc_binary)
1361     extract_range_from_binary_expr (vr, gimple_assign_rhs_code (stmt),
1362                                             TREE_TYPE (gimple_assign_lhs (stmt)),
1363                                             gimple_assign_rhs1 (stmt),
1364                                             gimple_assign_rhs2 (stmt));
1365   else if (TREE_CODE_CLASS (code) == tcc_unary)
1366     extract_range_from_unary_expr (vr, gimple_assign_rhs_code (stmt),
1367                                            TREE_TYPE (gimple_assign_lhs (stmt)),
1368                                            gimple_assign_rhs1 (stmt));
1369   else if (code == COND_EXPR)
1370     extract_range_from_cond_expr (vr, stmt);
1371   else if (TREE_CODE_CLASS (code) == tcc_comparison)
1372     extract_range_from_comparison (vr, stmt);
1373   else if (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS
1374              && is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))
1375     vr->set (gimple_assign_rhs1 (stmt));
1376   else
1377     vr->set_varying (TREE_TYPE (gimple_assign_lhs (stmt)));
1378 
1379   if (vr->varying_p ())
1380     extract_range_basic (vr, stmt);
1381 }
1382 
1383 /* Given two numeric value ranges VR0, VR1 and a comparison code COMP:
1384 
1385    - Return BOOLEAN_TRUE_NODE if VR0 COMP VR1 always returns true for
1386      all the values in the ranges.
1387 
1388    - Return BOOLEAN_FALSE_NODE if the comparison always returns false.
1389 
1390    - Return NULL_TREE if it is not always possible to determine the
1391      value of the comparison.
1392 
1393    Also set *STRICT_OVERFLOW_P to indicate whether comparision evaluation
1394    assumed signed overflow is undefined.  */
1395 
1396 
1397 static tree
compare_ranges(enum tree_code comp,const value_range_equiv * vr0,const value_range_equiv * vr1,bool * strict_overflow_p)1398 compare_ranges (enum tree_code comp, const value_range_equiv *vr0,
1399                     const value_range_equiv *vr1, bool *strict_overflow_p)
1400 {
1401   /* VARYING or UNDEFINED ranges cannot be compared.  */
1402   if (vr0->varying_p ()
1403       || vr0->undefined_p ()
1404       || vr1->varying_p ()
1405       || vr1->undefined_p ())
1406     return NULL_TREE;
1407 
1408   /* Anti-ranges need to be handled separately.  */
1409   if (vr0->kind () == VR_ANTI_RANGE || vr1->kind () == VR_ANTI_RANGE)
1410     {
1411       /* If both are anti-ranges, then we cannot compute any
1412            comparison.  */
1413       if (vr0->kind () == VR_ANTI_RANGE && vr1->kind () == VR_ANTI_RANGE)
1414           return NULL_TREE;
1415 
1416       /* These comparisons are never statically computable.  */
1417       if (comp == GT_EXPR
1418             || comp == GE_EXPR
1419             || comp == LT_EXPR
1420             || comp == LE_EXPR)
1421           return NULL_TREE;
1422 
1423       /* Equality can be computed only between a range and an
1424            anti-range.  ~[VAL1, VAL2] == [VAL1, VAL2] is always false.  */
1425       if (vr0->kind () == VR_RANGE)
1426           /* To simplify processing, make VR0 the anti-range.  */
1427           std::swap (vr0, vr1);
1428 
1429       gcc_assert (comp == NE_EXPR || comp == EQ_EXPR);
1430 
1431       if (compare_values_warnv (vr0->min (), vr1->min (), strict_overflow_p) == 0
1432             && compare_values_warnv (vr0->max (), vr1->max (), strict_overflow_p) == 0)
1433           return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
1434 
1435       return NULL_TREE;
1436     }
1437 
1438   /* Simplify processing.  If COMP is GT_EXPR or GE_EXPR, switch the
1439      operands around and change the comparison code.  */
1440   if (comp == GT_EXPR || comp == GE_EXPR)
1441     {
1442       comp = (comp == GT_EXPR) ? LT_EXPR : LE_EXPR;
1443       std::swap (vr0, vr1);
1444     }
1445 
1446   if (comp == EQ_EXPR)
1447     {
1448       /* Equality may only be computed if both ranges represent
1449            exactly one value.  */
1450       if (compare_values_warnv (vr0->min (), vr0->max (), strict_overflow_p) == 0
1451             && compare_values_warnv (vr1->min (), vr1->max (), strict_overflow_p) == 0)
1452           {
1453             int cmp_min = compare_values_warnv (vr0->min (), vr1->min (),
1454                                                         strict_overflow_p);
1455             int cmp_max = compare_values_warnv (vr0->max (), vr1->max (),
1456                                                         strict_overflow_p);
1457             if (cmp_min == 0 && cmp_max == 0)
1458               return boolean_true_node;
1459             else if (cmp_min != -2 && cmp_max != -2)
1460               return boolean_false_node;
1461           }
1462       /* If [V0_MIN, V1_MAX] < [V1_MIN, V1_MAX] then V0 != V1.  */
1463       else if (compare_values_warnv (vr0->min (), vr1->max (),
1464                                              strict_overflow_p) == 1
1465                  || compare_values_warnv (vr1->min (), vr0->max (),
1466                                                   strict_overflow_p) == 1)
1467           return boolean_false_node;
1468 
1469       return NULL_TREE;
1470     }
1471   else if (comp == NE_EXPR)
1472     {
1473       int cmp1, cmp2;
1474 
1475       /* If VR0 is completely to the left or completely to the right
1476            of VR1, they are always different.  Notice that we need to
1477            make sure that both comparisons yield similar results to
1478            avoid comparing values that cannot be compared at
1479            compile-time.  */
1480       cmp1 = compare_values_warnv (vr0->max (), vr1->min (), strict_overflow_p);
1481       cmp2 = compare_values_warnv (vr0->min (), vr1->max (), strict_overflow_p);
1482       if ((cmp1 == -1 && cmp2 == -1) || (cmp1 == 1 && cmp2 == 1))
1483           return boolean_true_node;
1484 
1485       /* If VR0 and VR1 represent a single value and are identical,
1486            return false.  */
1487       else if (compare_values_warnv (vr0->min (), vr0->max (),
1488                                              strict_overflow_p) == 0
1489                  && compare_values_warnv (vr1->min (), vr1->max (),
1490                                                   strict_overflow_p) == 0
1491                  && compare_values_warnv (vr0->min (), vr1->min (),
1492                                                   strict_overflow_p) == 0
1493                  && compare_values_warnv (vr0->max (), vr1->max (),
1494                                                   strict_overflow_p) == 0)
1495           return boolean_false_node;
1496 
1497       /* Otherwise, they may or may not be different.  */
1498       else
1499           return NULL_TREE;
1500     }
1501   else if (comp == LT_EXPR || comp == LE_EXPR)
1502     {
1503       int tst;
1504 
1505       /* If VR0 is to the left of VR1, return true.  */
1506       tst = compare_values_warnv (vr0->max (), vr1->min (), strict_overflow_p);
1507       if ((comp == LT_EXPR && tst == -1)
1508             || (comp == LE_EXPR && (tst == -1 || tst == 0)))
1509           return boolean_true_node;
1510 
1511       /* If VR0 is to the right of VR1, return false.  */
1512       tst = compare_values_warnv (vr0->min (), vr1->max (), strict_overflow_p);
1513       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
1514             || (comp == LE_EXPR && tst == 1))
1515           return boolean_false_node;
1516 
1517       /* Otherwise, we don't know.  */
1518       return NULL_TREE;
1519     }
1520 
1521   gcc_unreachable ();
1522 }
1523 
1524 /* Given a value range VR, a value VAL and a comparison code COMP, return
1525    BOOLEAN_TRUE_NODE if VR COMP VAL always returns true for all the
1526    values in VR.  Return BOOLEAN_FALSE_NODE if the comparison
1527    always returns false.  Return NULL_TREE if it is not always
1528    possible to determine the value of the comparison.  Also set
1529    *STRICT_OVERFLOW_P to indicate whether comparision evaluation
1530    assumed signed overflow is undefined.  */
1531 
1532 static tree
compare_range_with_value(enum tree_code comp,const value_range * vr,tree val,bool * strict_overflow_p)1533 compare_range_with_value (enum tree_code comp, const value_range *vr,
1534                                 tree val, bool *strict_overflow_p)
1535 {
1536   if (vr->varying_p () || vr->undefined_p ())
1537     return NULL_TREE;
1538 
1539   /* Anti-ranges need to be handled separately.  */
1540   if (vr->kind () == VR_ANTI_RANGE)
1541     {
1542       /* For anti-ranges, the only predicates that we can compute at
1543            compile time are equality and inequality.  */
1544       if (comp == GT_EXPR
1545             || comp == GE_EXPR
1546             || comp == LT_EXPR
1547             || comp == LE_EXPR)
1548           return NULL_TREE;
1549 
1550       /* ~[VAL_1, VAL_2] OP VAL is known if VAL_1 <= VAL <= VAL_2.  */
1551       if (!vr->may_contain_p (val))
1552           return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
1553 
1554       return NULL_TREE;
1555     }
1556 
1557   if (comp == EQ_EXPR)
1558     {
1559       /* EQ_EXPR may only be computed if VR represents exactly
1560            one value.  */
1561       if (compare_values_warnv (vr->min (), vr->max (), strict_overflow_p) == 0)
1562           {
1563             int cmp = compare_values_warnv (vr->min (), val, strict_overflow_p);
1564             if (cmp == 0)
1565               return boolean_true_node;
1566             else if (cmp == -1 || cmp == 1 || cmp == 2)
1567               return boolean_false_node;
1568           }
1569       else if (compare_values_warnv (val, vr->min (), strict_overflow_p) == -1
1570                  || compare_values_warnv (vr->max (), val, strict_overflow_p) == -1)
1571           return boolean_false_node;
1572 
1573       return NULL_TREE;
1574     }
1575   else if (comp == NE_EXPR)
1576     {
1577       /* If VAL is not inside VR, then they are always different.  */
1578       if (compare_values_warnv (vr->max (), val, strict_overflow_p) == -1
1579             || compare_values_warnv (vr->min (), val, strict_overflow_p) == 1)
1580           return boolean_true_node;
1581 
1582       /* If VR represents exactly one value equal to VAL, then return
1583            false.  */
1584       if (compare_values_warnv (vr->min (), vr->max (), strict_overflow_p) == 0
1585             && compare_values_warnv (vr->min (), val, strict_overflow_p) == 0)
1586           return boolean_false_node;
1587 
1588       /* Otherwise, they may or may not be different.  */
1589       return NULL_TREE;
1590     }
1591   else if (comp == LT_EXPR || comp == LE_EXPR)
1592     {
1593       int tst;
1594 
1595       /* If VR is to the left of VAL, return true.  */
1596       tst = compare_values_warnv (vr->max (), val, strict_overflow_p);
1597       if ((comp == LT_EXPR && tst == -1)
1598             || (comp == LE_EXPR && (tst == -1 || tst == 0)))
1599           return boolean_true_node;
1600 
1601       /* If VR is to the right of VAL, return false.  */
1602       tst = compare_values_warnv (vr->min (), val, strict_overflow_p);
1603       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
1604             || (comp == LE_EXPR && tst == 1))
1605           return boolean_false_node;
1606 
1607       /* Otherwise, we don't know.  */
1608       return NULL_TREE;
1609     }
1610   else if (comp == GT_EXPR || comp == GE_EXPR)
1611     {
1612       int tst;
1613 
1614       /* If VR is to the right of VAL, return true.  */
1615       tst = compare_values_warnv (vr->min (), val, strict_overflow_p);
1616       if ((comp == GT_EXPR && tst == 1)
1617             || (comp == GE_EXPR && (tst == 0 || tst == 1)))
1618           return boolean_true_node;
1619 
1620       /* If VR is to the left of VAL, return false.  */
1621       tst = compare_values_warnv (vr->max (), val, strict_overflow_p);
1622       if ((comp == GT_EXPR && (tst == -1 || tst == 0))
1623             || (comp == GE_EXPR && tst == -1))
1624           return boolean_false_node;
1625 
1626       /* Otherwise, we don't know.  */
1627       return NULL_TREE;
1628     }
1629 
1630   gcc_unreachable ();
1631 }
1632 
1633 /* Given a VAR in STMT within LOOP, determine the bounds of the
1634    variable and store it in MIN/MAX and return TRUE.  If no bounds
1635    could be determined, return FALSE.  */
1636 
1637 bool
bounds_of_var_in_loop(tree * min,tree * max,range_query * query,class loop * loop,gimple * stmt,tree var)1638 bounds_of_var_in_loop (tree *min, tree *max, range_query *query,
1639                            class loop *loop, gimple *stmt, tree var)
1640 {
1641   tree init, step, chrec, tmin, tmax, type = TREE_TYPE (var);
1642   enum ev_direction dir;
1643 
1644   chrec = instantiate_parameters (loop, analyze_scalar_evolution (loop, var));
1645 
1646   /* Like in PR19590, scev can return a constant function.  */
1647   if (is_gimple_min_invariant (chrec))
1648     {
1649       *min = *max = chrec;
1650       goto fix_overflow;
1651     }
1652 
1653   if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
1654     return false;
1655 
1656   init = initial_condition_in_loop_num (chrec, loop->num);
1657   step = evolution_part_in_loop_num (chrec, loop->num);
1658 
1659   if (!init || !step)
1660     return false;
1661 
1662   /* If INIT is an SSA with a singleton range, set INIT to said
1663      singleton, otherwise leave INIT alone.  */
1664   if (TREE_CODE (init) == SSA_NAME)
1665     query->get_value_range (init, stmt)->singleton_p (&init);
1666   /* Likewise for step.  */
1667   if (TREE_CODE (step) == SSA_NAME)
1668     query->get_value_range (step, stmt)->singleton_p (&step);
1669 
1670   /* If STEP is symbolic, we can't know whether INIT will be the
1671      minimum or maximum value in the range.  Also, unless INIT is
1672      a simple expression, compare_values and possibly other functions
1673      in tree-vrp won't be able to handle it.  */
1674   if (step == NULL_TREE
1675       || !is_gimple_min_invariant (step)
1676       || !valid_value_p (init))
1677     return false;
1678 
1679   dir = scev_direction (chrec);
1680   if (/* Do not adjust ranges if we do not know whether the iv increases
1681            or decreases,  ... */
1682       dir == EV_DIR_UNKNOWN
1683       /* ... or if it may wrap.  */
1684       || scev_probably_wraps_p (NULL_TREE, init, step, stmt,
1685                                         get_chrec_loop (chrec), true))
1686     return false;
1687 
1688   if (POINTER_TYPE_P (type) || !TYPE_MIN_VALUE (type))
1689     tmin = lower_bound_in_type (type, type);
1690   else
1691     tmin = TYPE_MIN_VALUE (type);
1692   if (POINTER_TYPE_P (type) || !TYPE_MAX_VALUE (type))
1693     tmax = upper_bound_in_type (type, type);
1694   else
1695     tmax = TYPE_MAX_VALUE (type);
1696 
1697   /* Try to use estimated number of iterations for the loop to constrain the
1698      final value in the evolution.  */
1699   if (TREE_CODE (step) == INTEGER_CST
1700       && is_gimple_val (init)
1701       && (TREE_CODE (init) != SSA_NAME
1702             || query->get_value_range (init, stmt)->kind () == VR_RANGE))
1703     {
1704       widest_int nit;
1705 
1706       /* We are only entering here for loop header PHI nodes, so using
1707            the number of latch executions is the correct thing to use.  */
1708       if (max_loop_iterations (loop, &nit))
1709           {
1710             signop sgn = TYPE_SIGN (TREE_TYPE (step));
1711             wi::overflow_type overflow;
1712 
1713             widest_int wtmp = wi::mul (wi::to_widest (step), nit, sgn,
1714                                              &overflow);
1715             /* If the multiplication overflowed we can't do a meaningful
1716                adjustment.  Likewise if the result doesn't fit in the type
1717                of the induction variable.  For a signed type we have to
1718                check whether the result has the expected signedness which
1719                is that of the step as number of iterations is unsigned.  */
1720             if (!overflow
1721                 && wi::fits_to_tree_p (wtmp, TREE_TYPE (init))
1722                 && (sgn == UNSIGNED
1723                       || wi::gts_p (wtmp, 0) == wi::gts_p (wi::to_wide (step), 0)))
1724               {
1725                 value_range maxvr, vr0, vr1;
1726                 if (TREE_CODE (init) == SSA_NAME)
1727                     vr0 = *(query->get_value_range (init, stmt));
1728                 else if (is_gimple_min_invariant (init))
1729                     vr0.set (init);
1730                 else
1731                     vr0.set_varying (TREE_TYPE (init));
1732                 tree tem = wide_int_to_tree (TREE_TYPE (init), wtmp);
1733                 vr1.set (tem, tem);
1734                 range_fold_binary_expr (&maxvr, PLUS_EXPR,
1735                                               TREE_TYPE (init), &vr0, &vr1);
1736 
1737                 /* Likewise if the addition did.  */
1738                 if (maxvr.kind () == VR_RANGE)
1739                     {
1740                       value_range initvr;
1741 
1742                       if (TREE_CODE (init) == SSA_NAME)
1743                         initvr = *(query->get_value_range (init, stmt));
1744                       else if (is_gimple_min_invariant (init))
1745                         initvr.set (init);
1746                       else
1747                         return false;
1748 
1749                       /* Check if init + nit * step overflows.  Though we checked
1750                          scev {init, step}_loop doesn't wrap, it is not enough
1751                          because the loop may exit immediately.  Overflow could
1752                          happen in the plus expression in this case.  */
1753                       if ((dir == EV_DIR_DECREASES
1754                            && compare_values (maxvr.min (), initvr.min ()) != -1)
1755                           || (dir == EV_DIR_GROWS
1756                                 && compare_values (maxvr.max (), initvr.max ()) != 1))
1757                         return false;
1758 
1759                       tmin = maxvr.min ();
1760                       tmax = maxvr.max ();
1761                     }
1762               }
1763           }
1764     }
1765 
1766   *min = tmin;
1767   *max = tmax;
1768   if (dir == EV_DIR_DECREASES)
1769     *max = init;
1770   else
1771     *min = init;
1772 
1773  fix_overflow:
1774   /* Even for valid range info, sometimes overflow flag will leak in.
1775      As GIMPLE IL should have no constants with TREE_OVERFLOW set, we
1776      drop them.  */
1777   if (TREE_OVERFLOW_P (*min))
1778     *min = drop_tree_overflow (*min);
1779   if (TREE_OVERFLOW_P (*max))
1780     *max = drop_tree_overflow (*max);
1781 
1782   gcc_checking_assert (compare_values (*min, *max) != 1);
1783   return true;
1784 }
1785 
1786 /* Given a range VR, a LOOP and a variable VAR, determine whether it
1787    would be profitable to adjust VR using scalar evolution information
1788    for VAR.  If so, update VR with the new limits.  */
1789 
1790 void
adjust_range_with_scev(value_range_equiv * vr,class loop * loop,gimple * stmt,tree var)1791 vr_values::adjust_range_with_scev (value_range_equiv *vr, class loop *loop,
1792                                            gimple *stmt, tree var)
1793 {
1794   tree min, max;
1795   if (bounds_of_var_in_loop (&min, &max, this, loop, stmt, var))
1796     {
1797       if (vr->undefined_p () || vr->varying_p ())
1798           {
1799             /* For VARYING or UNDEFINED ranges, just about anything we get
1800                from scalar evolutions should be better.  */
1801             vr->update (min, max);
1802           }
1803       else if (vr->kind () == VR_RANGE)
1804           {
1805             /* Start with the input range... */
1806             tree vrmin = vr->min ();
1807             tree vrmax = vr->max ();
1808 
1809             /* ...and narrow it down with what we got from SCEV.  */
1810             if (compare_values (min, vrmin) == 1)
1811               vrmin = min;
1812             if (compare_values (max, vrmax) == -1)
1813               vrmax = max;
1814 
1815             vr->update (vrmin, vrmax);
1816           }
1817       else if (vr->kind () == VR_ANTI_RANGE)
1818           {
1819             /* ?? As an enhancement, if VR, MIN, and MAX are constants, one
1820                could just intersect VR with a range of [MIN,MAX].  */
1821           }
1822     }
1823 }
1824 
1825 /* Dump value ranges of all SSA_NAMEs to FILE.  */
1826 
1827 void
dump(FILE * file)1828 vr_values::dump (FILE *file)
1829 {
1830   size_t i;
1831 
1832   for (i = 0; i < num_vr_values; i++)
1833     {
1834       if (vr_value[i] && ssa_name (i))
1835           {
1836             print_generic_expr (file, ssa_name (i));
1837             fprintf (file, ": ");
1838             dump_value_range (file, vr_value[i]);
1839             fprintf (file, "\n");
1840           }
1841     }
1842 
1843   fprintf (file, "\n");
1844 }
1845 
1846 /* Initialize VRP lattice.  */
1847 
vr_values()1848 vr_values::vr_values () : simplifier (this)
1849 {
1850   values_propagated = false;
1851   num_vr_values = num_ssa_names * 2;
1852   vr_value = XCNEWVEC (value_range_equiv *, num_vr_values);
1853   vr_phi_edge_counts = XCNEWVEC (int, num_ssa_names);
1854   bitmap_obstack_initialize (&vrp_equiv_obstack);
1855 }
1856 
1857 /* Free VRP lattice.  */
1858 
~vr_values()1859 vr_values::~vr_values ()
1860 {
1861   /* Free allocated memory.  */
1862   free (vr_value);
1863   free (vr_phi_edge_counts);
1864   bitmap_obstack_release (&vrp_equiv_obstack);
1865 
1866   /* So that we can distinguish between VRP data being available
1867      and not available.  */
1868   vr_value = NULL;
1869   vr_phi_edge_counts = NULL;
1870 }
1871 
1872 
1873 /* A hack.  */
1874 static class vr_values *x_vr_values;
1875 
1876 /* Return the singleton value-range for NAME or NAME.  */
1877 
1878 static inline tree
vrp_valueize(tree name)1879 vrp_valueize (tree name)
1880 {
1881   if (TREE_CODE (name) == SSA_NAME)
1882     {
1883       const value_range_equiv *vr = x_vr_values->get_value_range (name);
1884       if (vr->kind () == VR_RANGE
1885             && (TREE_CODE (vr->min ()) == SSA_NAME
1886                 || is_gimple_min_invariant (vr->min ()))
1887             && vrp_operand_equal_p (vr->min (), vr->max ()))
1888           return vr->min ();
1889     }
1890   return name;
1891 }
1892 
1893 /* Return the singleton value-range for NAME if that is a constant
1894    but signal to not follow SSA edges.  */
1895 
1896 static inline tree
vrp_valueize_1(tree name)1897 vrp_valueize_1 (tree name)
1898 {
1899   if (TREE_CODE (name) == SSA_NAME)
1900     {
1901       /* If the definition may be simulated again we cannot follow
1902          this SSA edge as the SSA propagator does not necessarily
1903            re-visit the use.  */
1904       gimple *def_stmt = SSA_NAME_DEF_STMT (name);
1905       if (!gimple_nop_p (def_stmt)
1906             && prop_simulate_again_p (def_stmt))
1907           return NULL_TREE;
1908       const value_range_equiv *vr = x_vr_values->get_value_range (name);
1909       tree singleton;
1910       if (vr->singleton_p (&singleton))
1911           return singleton;
1912     }
1913   return name;
1914 }
1915 
1916 /* Given STMT, an assignment or call, return its LHS if the type
1917    of the LHS is suitable for VRP analysis, else return NULL_TREE.  */
1918 
1919 tree
get_output_for_vrp(gimple * stmt)1920 get_output_for_vrp (gimple *stmt)
1921 {
1922   if (!is_gimple_assign (stmt) && !is_gimple_call (stmt))
1923     return NULL_TREE;
1924 
1925   /* We only keep track of ranges in integral and pointer types.  */
1926   tree lhs = gimple_get_lhs (stmt);
1927   if (TREE_CODE (lhs) == SSA_NAME
1928       && ((INTEGRAL_TYPE_P (TREE_TYPE (lhs))
1929              /* It is valid to have NULL MIN/MAX values on a type.  See
1930                 build_range_type.  */
1931              && TYPE_MIN_VALUE (TREE_TYPE (lhs))
1932              && TYPE_MAX_VALUE (TREE_TYPE (lhs)))
1933             || POINTER_TYPE_P (TREE_TYPE (lhs))))
1934     return lhs;
1935 
1936   return NULL_TREE;
1937 }
1938 
1939 /* Visit assignment STMT.  If it produces an interesting range, record
1940    the range in VR and set LHS to OUTPUT_P.  */
1941 
1942 void
vrp_visit_assignment_or_call(gimple * stmt,tree * output_p,value_range_equiv * vr)1943 vr_values::vrp_visit_assignment_or_call (gimple *stmt, tree *output_p,
1944                                                    value_range_equiv *vr)
1945 {
1946   tree lhs = get_output_for_vrp (stmt);
1947   *output_p = lhs;
1948 
1949   /* We only keep track of ranges in integral and pointer types.  */
1950   if (lhs)
1951     {
1952       enum gimple_code code = gimple_code (stmt);
1953 
1954       /* Try folding the statement to a constant first.  */
1955       x_vr_values = this;
1956       tree tem = gimple_fold_stmt_to_constant_1 (stmt, vrp_valueize,
1957                                                              vrp_valueize_1);
1958       x_vr_values = NULL;
1959       if (tem)
1960           {
1961             if (TREE_CODE (tem) == SSA_NAME
1962                 && (SSA_NAME_IS_DEFAULT_DEF (tem)
1963                       || ! prop_simulate_again_p (SSA_NAME_DEF_STMT (tem))))
1964               {
1965                 extract_range_from_ssa_name (vr, tem);
1966                 return;
1967               }
1968             else if (is_gimple_min_invariant (tem))
1969               {
1970                 vr->set (tem);
1971                 return;
1972               }
1973           }
1974       /* Then dispatch to value-range extracting functions.  */
1975       if (code == GIMPLE_CALL)
1976           extract_range_basic (vr, stmt);
1977       else
1978           extract_range_from_assignment (vr, as_a <gassign *> (stmt));
1979     }
1980 }
1981 
1982 /* Helper that gets the value range of the SSA_NAME with version I
1983    or a symbolic range containing the SSA_NAME only if the value range
1984    is varying or undefined.  Uses TEM as storage for the alternate range.  */
1985 
1986 const value_range_equiv *
get_vr_for_comparison(int i,value_range_equiv * tem,gimple * s)1987 simplify_using_ranges::get_vr_for_comparison (int i, value_range_equiv *tem,
1988                                                         gimple *s)
1989 {
1990   /* Shallow-copy equiv bitmap.  */
1991   const value_range_equiv *vr = query->get_value_range (ssa_name (i), s);
1992 
1993   /* If name N_i does not have a valid range, use N_i as its own
1994      range.  This allows us to compare against names that may
1995      have N_i in their ranges.  */
1996   if (vr->varying_p () || vr->undefined_p ())
1997     {
1998       tem->set (ssa_name (i));
1999       return tem;
2000     }
2001 
2002   return vr;
2003 }
2004 
2005 /* Compare all the value ranges for names equivalent to VAR with VAL
2006    using comparison code COMP.  Return the same value returned by
2007    compare_range_with_value, including the setting of
2008    *STRICT_OVERFLOW_P.  */
2009 
2010 tree
compare_name_with_value(enum tree_code comp,tree var,tree val,bool * strict_overflow_p,bool use_equiv_p,gimple * s)2011 simplify_using_ranges::compare_name_with_value
2012                                         (enum tree_code comp, tree var, tree val,
2013                                          bool *strict_overflow_p, bool use_equiv_p,
2014                                          gimple *s)
2015 {
2016   /* Get the set of equivalences for VAR.  */
2017   bitmap e = query->get_value_range (var, s)->equiv ();
2018 
2019   /* Start at -1.  Set it to 0 if we do a comparison without relying
2020      on overflow, or 1 if all comparisons rely on overflow.  */
2021   int used_strict_overflow = -1;
2022 
2023   /* Compare vars' value range with val.  */
2024   value_range_equiv tem_vr;
2025   const value_range_equiv *equiv_vr
2026     = get_vr_for_comparison (SSA_NAME_VERSION (var), &tem_vr, s);
2027   bool sop = false;
2028   tree retval = compare_range_with_value (comp, equiv_vr, val, &sop);
2029   if (retval)
2030     used_strict_overflow = sop ? 1 : 0;
2031 
2032   /* If the equiv set is empty we have done all work we need to do.  */
2033   if (e == NULL)
2034     {
2035       if (retval && used_strict_overflow > 0)
2036           *strict_overflow_p = true;
2037       return retval;
2038     }
2039 
2040   unsigned i;
2041   bitmap_iterator bi;
2042   EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
2043     {
2044       tree name = ssa_name (i);
2045       if (!name)
2046           continue;
2047 
2048       if (!use_equiv_p
2049             && !SSA_NAME_IS_DEFAULT_DEF (name)
2050             && prop_simulate_again_p (SSA_NAME_DEF_STMT (name)))
2051           continue;
2052 
2053       equiv_vr = get_vr_for_comparison (i, &tem_vr, s);
2054       sop = false;
2055       tree t = compare_range_with_value (comp, equiv_vr, val, &sop);
2056       if (t)
2057           {
2058             /* If we get different answers from different members
2059                of the equivalence set this check must be in a dead
2060                code region.  Folding it to a trap representation
2061                would be correct here.  For now just return don't-know.  */
2062             if (retval != NULL
2063                 && t != retval)
2064               {
2065                 retval = NULL_TREE;
2066                 break;
2067               }
2068             retval = t;
2069 
2070             if (!sop)
2071               used_strict_overflow = 0;
2072             else if (used_strict_overflow < 0)
2073               used_strict_overflow = 1;
2074           }
2075     }
2076 
2077   if (retval && used_strict_overflow > 0)
2078     *strict_overflow_p = true;
2079 
2080   return retval;
2081 }
2082 
2083 
2084 /* Given a comparison code COMP and names N1 and N2, compare all the
2085    ranges equivalent to N1 against all the ranges equivalent to N2
2086    to determine the value of N1 COMP N2.  Return the same value
2087    returned by compare_ranges.  Set *STRICT_OVERFLOW_P to indicate
2088    whether we relied on undefined signed overflow in the comparison.  */
2089 
2090 
2091 tree
compare_names(enum tree_code comp,tree n1,tree n2,bool * strict_overflow_p,gimple * s)2092 simplify_using_ranges::compare_names (enum tree_code comp, tree n1, tree n2,
2093                                               bool *strict_overflow_p, gimple *s)
2094 {
2095   /* Compare the ranges of every name equivalent to N1 against the
2096      ranges of every name equivalent to N2.  */
2097   bitmap e1 = query->get_value_range (n1, s)->equiv ();
2098   bitmap e2 = query->get_value_range (n2, s)->equiv ();
2099 
2100   /* Use the fake bitmaps if e1 or e2 are not available.  */
2101   static bitmap s_e1 = NULL, s_e2 = NULL;
2102   static bitmap_obstack *s_obstack = NULL;
2103   if (s_obstack == NULL)
2104     {
2105       s_obstack = XNEW (bitmap_obstack);
2106       bitmap_obstack_initialize (s_obstack);
2107       s_e1 = BITMAP_ALLOC (s_obstack);
2108       s_e2 = BITMAP_ALLOC (s_obstack);
2109     }
2110   if (e1 == NULL)
2111     e1 = s_e1;
2112   if (e2 == NULL)
2113     e2 = s_e2;
2114 
2115   /* Add N1 and N2 to their own set of equivalences to avoid
2116      duplicating the body of the loop just to check N1 and N2
2117      ranges.  */
2118   bitmap_set_bit (e1, SSA_NAME_VERSION (n1));
2119   bitmap_set_bit (e2, SSA_NAME_VERSION (n2));
2120 
2121   /* If the equivalence sets have a common intersection, then the two
2122      names can be compared without checking their ranges.  */
2123   if (bitmap_intersect_p (e1, e2))
2124     {
2125       bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
2126       bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
2127 
2128       return (comp == EQ_EXPR || comp == GE_EXPR || comp == LE_EXPR)
2129                ? boolean_true_node
2130                : boolean_false_node;
2131     }
2132 
2133   /* Start at -1.  Set it to 0 if we do a comparison without relying
2134      on overflow, or 1 if all comparisons rely on overflow.  */
2135   int used_strict_overflow = -1;
2136 
2137   /* Otherwise, compare all the equivalent ranges.  First, add N1 and
2138      N2 to their own set of equivalences to avoid duplicating the body
2139      of the loop just to check N1 and N2 ranges.  */
2140   bitmap_iterator bi1;
2141   unsigned i1;
2142   EXECUTE_IF_SET_IN_BITMAP (e1, 0, i1, bi1)
2143     {
2144       if (!ssa_name (i1))
2145           continue;
2146 
2147       value_range_equiv tem_vr1;
2148       const value_range_equiv *vr1 = get_vr_for_comparison (i1, &tem_vr1, s);
2149 
2150       tree t = NULL_TREE, retval = NULL_TREE;
2151       bitmap_iterator bi2;
2152       unsigned i2;
2153       EXECUTE_IF_SET_IN_BITMAP (e2, 0, i2, bi2)
2154           {
2155             if (!ssa_name (i2))
2156               continue;
2157 
2158             bool sop = false;
2159 
2160             value_range_equiv tem_vr2;
2161             const value_range_equiv *vr2 = get_vr_for_comparison (i2, &tem_vr2,
2162                                                                                 s);
2163 
2164             t = compare_ranges (comp, vr1, vr2, &sop);
2165             if (t)
2166               {
2167                 /* If we get different answers from different members
2168                      of the equivalence set this check must be in a dead
2169                      code region.  Folding it to a trap representation
2170                      would be correct here.  For now just return don't-know.  */
2171                 if (retval != NULL && t != retval)
2172                     {
2173                       bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
2174                       bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
2175                       return NULL_TREE;
2176                     }
2177                 retval = t;
2178 
2179                 if (!sop)
2180                     used_strict_overflow = 0;
2181                 else if (used_strict_overflow < 0)
2182                     used_strict_overflow = 1;
2183               }
2184           }
2185 
2186       if (retval)
2187           {
2188             bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
2189             bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
2190             if (used_strict_overflow > 0)
2191               *strict_overflow_p = true;
2192             return retval;
2193           }
2194     }
2195 
2196   /* None of the equivalent ranges are useful in computing this
2197      comparison.  */
2198   bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
2199   bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
2200   return NULL_TREE;
2201 }
2202 
2203 /* Helper function for vrp_evaluate_conditional_warnv & other
2204    optimizers.  */
2205 
2206 tree
vrp_evaluate_conditional_warnv_with_ops_using_ranges(enum tree_code code,tree op0,tree op1,bool * strict_overflow_p,gimple * s)2207 simplify_using_ranges::vrp_evaluate_conditional_warnv_with_ops_using_ranges
2208     (enum tree_code code, tree op0, tree op1, bool * strict_overflow_p,
2209      gimple *s)
2210 {
2211   const value_range_equiv *vr0, *vr1;
2212   vr0 = (TREE_CODE (op0) == SSA_NAME) ? query->get_value_range (op0, s) : NULL;
2213   vr1 = (TREE_CODE (op1) == SSA_NAME) ? query->get_value_range (op1, s) : NULL;
2214 
2215   tree res = NULL_TREE;
2216   if (vr0 && vr1)
2217     res = compare_ranges (code, vr0, vr1, strict_overflow_p);
2218   if (!res && vr0)
2219     res = compare_range_with_value (code, vr0, op1, strict_overflow_p);
2220   if (!res && vr1)
2221     res = (compare_range_with_value
2222               (swap_tree_comparison (code), vr1, op0, strict_overflow_p));
2223   return res;
2224 }
2225 
2226 /* Helper function for vrp_evaluate_conditional_warnv. */
2227 
2228 tree
vrp_evaluate_conditional_warnv_with_ops(gimple * stmt,enum tree_code code,tree op0,tree op1,bool use_equiv_p,bool * strict_overflow_p,bool * only_ranges)2229 simplify_using_ranges::vrp_evaluate_conditional_warnv_with_ops
2230                                                             (gimple *stmt,
2231                                                              enum tree_code code,
2232                                                              tree op0, tree op1,
2233                                                              bool use_equiv_p,
2234                                                              bool *strict_overflow_p,
2235                                                              bool *only_ranges)
2236 {
2237   tree ret;
2238   if (only_ranges)
2239     *only_ranges = true;
2240 
2241   /* We only deal with integral and pointer types.  */
2242   if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
2243       && !POINTER_TYPE_P (TREE_TYPE (op0)))
2244     return NULL_TREE;
2245 
2246   /* If OP0 CODE OP1 is an overflow comparison, if it can be expressed
2247      as a simple equality test, then prefer that over its current form
2248      for evaluation.
2249 
2250      An overflow test which collapses to an equality test can always be
2251      expressed as a comparison of one argument against zero.  Overflow
2252      occurs when the chosen argument is zero and does not occur if the
2253      chosen argument is not zero.  */
2254   tree x;
2255   if (overflow_comparison_p (code, op0, op1, use_equiv_p, &x))
2256     {
2257       wide_int max = wi::max_value (TYPE_PRECISION (TREE_TYPE (op0)), UNSIGNED);
2258       /* B = A - 1; if (A < B) -> B = A - 1; if (A == 0)
2259          B = A - 1; if (A > B) -> B = A - 1; if (A != 0)
2260          B = A + 1; if (B < A) -> B = A + 1; if (B == 0)
2261          B = A + 1; if (B > A) -> B = A + 1; if (B != 0) */
2262       if (integer_zerop (x))
2263           {
2264             op1 = x;
2265             code = (code == LT_EXPR || code == LE_EXPR) ? EQ_EXPR : NE_EXPR;
2266           }
2267       /* B = A + 1; if (A > B) -> B = A + 1; if (B == 0)
2268          B = A + 1; if (A < B) -> B = A + 1; if (B != 0)
2269          B = A - 1; if (B > A) -> B = A - 1; if (A == 0)
2270          B = A - 1; if (B < A) -> B = A - 1; if (A != 0) */
2271       else if (wi::to_wide (x) == max - 1)
2272           {
2273             op0 = op1;
2274             op1 = wide_int_to_tree (TREE_TYPE (op0), 0);
2275             code = (code == GT_EXPR || code == GE_EXPR) ? EQ_EXPR : NE_EXPR;
2276           }
2277       else
2278           {
2279             value_range vro, vri;
2280             if (code == GT_EXPR || code == GE_EXPR)
2281               {
2282                 vro.set (TYPE_MIN_VALUE (TREE_TYPE (op0)), x, VR_ANTI_RANGE);
2283                 vri.set (TYPE_MIN_VALUE (TREE_TYPE (op0)), x);
2284               }
2285             else if (code == LT_EXPR || code == LE_EXPR)
2286               {
2287                 vro.set (TYPE_MIN_VALUE (TREE_TYPE (op0)), x);
2288                 vri.set (TYPE_MIN_VALUE (TREE_TYPE (op0)), x, VR_ANTI_RANGE);
2289               }
2290             else
2291               gcc_unreachable ();
2292             const value_range_equiv *vr0 = query->get_value_range (op0, stmt);
2293             /* If vro, the range for OP0 to pass the overflow test, has
2294                no intersection with *vr0, OP0's known range, then the
2295                overflow test can't pass, so return the node for false.
2296                If it is the inverted range, vri, that has no
2297                intersection, then the overflow test must pass, so return
2298                the node for true.  In other cases, we could proceed with
2299                a simplified condition comparing OP0 and X, with LE_EXPR
2300                for previously LE_ or LT_EXPR and GT_EXPR otherwise, but
2301                the comments next to the enclosing if suggest it's not
2302                generally profitable to do so.  */
2303             vro.intersect (vr0);
2304             if (vro.undefined_p ())
2305               return boolean_false_node;
2306             vri.intersect (vr0);
2307             if (vri.undefined_p ())
2308               return boolean_true_node;
2309           }
2310     }
2311 
2312   if ((ret = vrp_evaluate_conditional_warnv_with_ops_using_ranges
2313                  (code, op0, op1, strict_overflow_p, stmt)))
2314     return ret;
2315   if (only_ranges)
2316     *only_ranges = false;
2317   /* Do not use compare_names during propagation, it's quadratic.  */
2318   if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME
2319       && use_equiv_p)
2320     return compare_names (code, op0, op1, strict_overflow_p, stmt);
2321   else if (TREE_CODE (op0) == SSA_NAME)
2322     return compare_name_with_value (code, op0, op1,
2323                                             strict_overflow_p, use_equiv_p, stmt);
2324   else if (TREE_CODE (op1) == SSA_NAME)
2325     return compare_name_with_value (swap_tree_comparison (code), op1, op0,
2326                                             strict_overflow_p, use_equiv_p, stmt);
2327   return NULL_TREE;
2328 }
2329 
2330 /* Given (CODE OP0 OP1) within STMT, try to simplify it based on value range
2331    information.  Return NULL if the conditional cannot be evaluated.
2332    The ranges of all the names equivalent with the operands in COND
2333    will be used when trying to compute the value.  If the result is
2334    based on undefined signed overflow, issue a warning if
2335    appropriate.  */
2336 
2337 tree
vrp_evaluate_conditional(tree_code code,tree op0,tree op1,gimple * stmt)2338 simplify_using_ranges::vrp_evaluate_conditional (tree_code code, tree op0,
2339                                                              tree op1, gimple *stmt)
2340 {
2341   bool sop;
2342   tree ret;
2343   bool only_ranges;
2344 
2345   /* Some passes and foldings leak constants with overflow flag set
2346      into the IL.  Avoid doing wrong things with these and bail out.  */
2347   if ((TREE_CODE (op0) == INTEGER_CST
2348        && TREE_OVERFLOW (op0))
2349       || (TREE_CODE (op1) == INTEGER_CST
2350             && TREE_OVERFLOW (op1)))
2351     return NULL_TREE;
2352 
2353   sop = false;
2354   ret = vrp_evaluate_conditional_warnv_with_ops (stmt, code, op0, op1, true,
2355                                                              &sop, &only_ranges);
2356 
2357   if (ret && sop)
2358     {
2359       enum warn_strict_overflow_code wc;
2360       const char* warnmsg;
2361 
2362       if (is_gimple_min_invariant (ret))
2363           {
2364             wc = WARN_STRICT_OVERFLOW_CONDITIONAL;
2365             warnmsg = G_("assuming signed overflow does not occur when "
2366                            "simplifying conditional to constant");
2367           }
2368       else
2369           {
2370             wc = WARN_STRICT_OVERFLOW_COMPARISON;
2371             warnmsg = G_("assuming signed overflow does not occur when "
2372                            "simplifying conditional");
2373           }
2374 
2375       if (issue_strict_overflow_warning (wc))
2376           {
2377             location_t location;
2378 
2379             if (!gimple_has_location (stmt))
2380               location = input_location;
2381             else
2382               location = gimple_location (stmt);
2383             warning_at (location, OPT_Wstrict_overflow, "%s", warnmsg);
2384           }
2385     }
2386 
2387   if (warn_type_limits
2388       && ret && only_ranges
2389       && TREE_CODE_CLASS (code) == tcc_comparison
2390       && TREE_CODE (op0) == SSA_NAME)
2391     {
2392       /* If the comparison is being folded and the operand on the LHS
2393            is being compared against a constant value that is outside of
2394            the natural range of OP0's type, then the predicate will
2395            always fold regardless of the value of OP0.  If -Wtype-limits
2396            was specified, emit a warning.  */
2397       tree type = TREE_TYPE (op0);
2398       const value_range_equiv *vr0 = query->get_value_range (op0, stmt);
2399 
2400       if (vr0->varying_p ()
2401             && INTEGRAL_TYPE_P (type)
2402             && is_gimple_min_invariant (op1))
2403           {
2404             location_t location;
2405 
2406             if (!gimple_has_location (stmt))
2407               location = input_location;
2408             else
2409               location = gimple_location (stmt);
2410 
2411             warning_at (location, OPT_Wtype_limits,
2412                           integer_zerop (ret)
2413                           ? G_("comparison always false "
2414                            "due to limited range of data type")
2415                           : G_("comparison always true "
2416                            "due to limited range of data type"));
2417           }
2418     }
2419 
2420   return ret;
2421 }
2422 
2423 
2424 /* Visit conditional statement STMT.  If we can determine which edge
2425    will be taken out of STMT's basic block, record it in
2426    *TAKEN_EDGE_P.  Otherwise, set *TAKEN_EDGE_P to NULL.  */
2427 
2428 void
vrp_visit_cond_stmt(gcond * stmt,edge * taken_edge_p)2429 simplify_using_ranges::vrp_visit_cond_stmt (gcond *stmt, edge *taken_edge_p)
2430 {
2431   tree val;
2432 
2433   *taken_edge_p = NULL;
2434 
2435   if (dump_file && (dump_flags & TDF_DETAILS))
2436     {
2437       tree use;
2438       ssa_op_iter i;
2439 
2440       fprintf (dump_file, "\nVisiting conditional with predicate: ");
2441       print_gimple_stmt (dump_file, stmt, 0);
2442       fprintf (dump_file, "\nWith known ranges\n");
2443 
2444       FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
2445           {
2446             fprintf (dump_file, "\t");
2447             print_generic_expr (dump_file, use);
2448             fprintf (dump_file, ": ");
2449             dump_value_range (dump_file, query->get_value_range (use, stmt));
2450           }
2451 
2452       fprintf (dump_file, "\n");
2453     }
2454 
2455   /* Compute the value of the predicate COND by checking the known
2456      ranges of each of its operands.
2457 
2458      Note that we cannot evaluate all the equivalent ranges here
2459      because those ranges may not yet be final and with the current
2460      propagation strategy, we cannot determine when the value ranges
2461      of the names in the equivalence set have changed.
2462 
2463      For instance, given the following code fragment
2464 
2465         i_5 = PHI <8, i_13>
2466           ...
2467           i_14 = ASSERT_EXPR <i_5, i_5 != 0>
2468           if (i_14 == 1)
2469             ...
2470 
2471      Assume that on the first visit to i_14, i_5 has the temporary
2472      range [8, 8] because the second argument to the PHI function is
2473      not yet executable.  We derive the range ~[0, 0] for i_14 and the
2474      equivalence set { i_5 }.  So, when we visit 'if (i_14 == 1)' for
2475      the first time, since i_14 is equivalent to the range [8, 8], we
2476      determine that the predicate is always false.
2477 
2478      On the next round of propagation, i_13 is determined to be
2479      VARYING, which causes i_5 to drop down to VARYING.  So, another
2480      visit to i_14 is scheduled.  In this second visit, we compute the
2481      exact same range and equivalence set for i_14, namely ~[0, 0] and
2482      { i_5 }.  But we did not have the previous range for i_5
2483      registered, so vrp_visit_assignment thinks that the range for
2484      i_14 has not changed.  Therefore, the predicate 'if (i_14 == 1)'
2485      is not visited again, which stops propagation from visiting
2486      statements in the THEN clause of that if().
2487 
2488      To properly fix this we would need to keep the previous range
2489      value for the names in the equivalence set.  This way we would've
2490      discovered that from one visit to the other i_5 changed from
2491      range [8, 8] to VR_VARYING.
2492 
2493      However, fixing this apparent limitation may not be worth the
2494      additional checking.  Testing on several code bases (GCC, DLV,
2495      MICO, TRAMP3D and SPEC2000) showed that doing this results in
2496      4 more predicates folded in SPEC.  */
2497 
2498   bool sop;
2499   val = vrp_evaluate_conditional_warnv_with_ops (stmt,
2500                                                              gimple_cond_code (stmt),
2501                                                              gimple_cond_lhs (stmt),
2502                                                              gimple_cond_rhs (stmt),
2503                                                              false, &sop, NULL);
2504   if (val)
2505     *taken_edge_p = find_taken_edge (gimple_bb (stmt), val);
2506 
2507   if (dump_file && (dump_flags & TDF_DETAILS))
2508     {
2509       fprintf (dump_file, "\nPredicate evaluates to: ");
2510       if (val == NULL_TREE)
2511           fprintf (dump_file, "DON'T KNOW\n");
2512       else
2513           print_generic_stmt (dump_file, val);
2514     }
2515 }
2516 
2517 /* Searches the case label vector VEC for the ranges of CASE_LABELs that are
2518    used in range VR.  The indices are placed in MIN_IDX1, MAX_IDX, MIN_IDX2 and
2519    MAX_IDX2.  If the ranges of CASE_LABELs are empty then MAX_IDX1 < MIN_IDX1.
2520    Returns true if the default label is not needed.  */
2521 
2522 static bool
find_case_label_ranges(gswitch * stmt,const value_range * vr,size_t * min_idx1,size_t * max_idx1,size_t * min_idx2,size_t * max_idx2)2523 find_case_label_ranges (gswitch *stmt, const value_range *vr,
2524                               size_t *min_idx1, size_t *max_idx1,
2525                               size_t *min_idx2, size_t *max_idx2)
2526 {
2527   size_t i, j, k, l;
2528   unsigned int n = gimple_switch_num_labels (stmt);
2529   bool take_default;
2530   tree case_low, case_high;
2531   tree min = vr->min (), max = vr->max ();
2532 
2533   gcc_checking_assert (!vr->varying_p () && !vr->undefined_p ());
2534 
2535   take_default = !find_case_label_range (stmt, min, max, &i, &j);
2536 
2537   /* Set second range to empty.  */
2538   *min_idx2 = 1;
2539   *max_idx2 = 0;
2540 
2541   if (vr->kind () == VR_RANGE)
2542     {
2543       *min_idx1 = i;
2544       *max_idx1 = j;
2545       return !take_default;
2546     }
2547 
2548   /* Set first range to all case labels.  */
2549   *min_idx1 = 1;
2550   *max_idx1 = n - 1;
2551 
2552   if (i > j)
2553     return false;
2554 
2555   /* Make sure all the values of case labels [i , j] are contained in
2556      range [MIN, MAX].  */
2557   case_low = CASE_LOW (gimple_switch_label (stmt, i));
2558   case_high = CASE_HIGH (gimple_switch_label (stmt, j));
2559   if (tree_int_cst_compare (case_low, min) < 0)
2560     i += 1;
2561   if (case_high != NULL_TREE
2562       && tree_int_cst_compare (max, case_high) < 0)
2563     j -= 1;
2564 
2565   if (i > j)
2566     return false;
2567 
2568   /* If the range spans case labels [i, j], the corresponding anti-range spans
2569      the labels [1, i - 1] and [j + 1, n -  1].  */
2570   k = j + 1;
2571   l = n - 1;
2572   if (k > l)
2573     {
2574       k = 1;
2575       l = 0;
2576     }
2577 
2578   j = i - 1;
2579   i = 1;
2580   if (i > j)
2581     {
2582       i = k;
2583       j = l;
2584       k = 1;
2585       l = 0;
2586     }
2587 
2588   *min_idx1 = i;
2589   *max_idx1 = j;
2590   *min_idx2 = k;
2591   *max_idx2 = l;
2592   return false;
2593 }
2594 
2595 /* Visit switch statement STMT.  If we can determine which edge
2596    will be taken out of STMT's basic block, record it in
2597    *TAKEN_EDGE_P.  Otherwise, *TAKEN_EDGE_P set to NULL.  */
2598 
2599 void
vrp_visit_switch_stmt(gswitch * stmt,edge * taken_edge_p)2600 vr_values::vrp_visit_switch_stmt (gswitch *stmt, edge *taken_edge_p)
2601 {
2602   tree op, val;
2603   const value_range_equiv *vr;
2604   size_t i = 0, j = 0, k, l;
2605   bool take_default;
2606 
2607   *taken_edge_p = NULL;
2608   op = gimple_switch_index (stmt);
2609   if (TREE_CODE (op) != SSA_NAME)
2610     return;
2611 
2612   vr = get_value_range (op);
2613   if (dump_file && (dump_flags & TDF_DETAILS))
2614     {
2615       fprintf (dump_file, "\nVisiting switch expression with operand ");
2616       print_generic_expr (dump_file, op);
2617       fprintf (dump_file, " with known range ");
2618       dump_value_range (dump_file, vr);
2619       fprintf (dump_file, "\n");
2620     }
2621 
2622   if (vr->undefined_p ()
2623       || vr->varying_p ()
2624       || vr->symbolic_p ())
2625     return;
2626 
2627   /* Find the single edge that is taken from the switch expression.  */
2628   take_default = !find_case_label_ranges (stmt, vr, &i, &j, &k, &l);
2629 
2630   /* Check if the range spans no CASE_LABEL. If so, we only reach the default
2631      label */
2632   if (j < i)
2633     {
2634       gcc_assert (take_default);
2635       val = gimple_switch_default_label (stmt);
2636     }
2637   else
2638     {
2639       /* Check if labels with index i to j and maybe the default label
2640            are all reaching the same label.  */
2641 
2642       val = gimple_switch_label (stmt, i);
2643       if (take_default
2644             && CASE_LABEL (gimple_switch_default_label (stmt))
2645             != CASE_LABEL (val))
2646           {
2647             if (dump_file && (dump_flags & TDF_DETAILS))
2648               fprintf (dump_file, "  not a single destination for this "
2649                          "range\n");
2650             return;
2651           }
2652       for (++i; i <= j; ++i)
2653         {
2654           if (CASE_LABEL (gimple_switch_label (stmt, i)) != CASE_LABEL (val))
2655               {
2656                 if (dump_file && (dump_flags & TDF_DETAILS))
2657                     fprintf (dump_file, "  not a single destination for this "
2658                                "range\n");
2659                 return;
2660               }
2661         }
2662       for (; k <= l; ++k)
2663         {
2664           if (CASE_LABEL (gimple_switch_label (stmt, k)) != CASE_LABEL (val))
2665               {
2666                 if (dump_file && (dump_flags & TDF_DETAILS))
2667                     fprintf (dump_file, "  not a single destination for this "
2668                                "range\n");
2669                 return;
2670               }
2671         }
2672     }
2673 
2674   *taken_edge_p = find_edge (gimple_bb (stmt),
2675                                    label_to_block (cfun, CASE_LABEL (val)));
2676 
2677   if (dump_file && (dump_flags & TDF_DETAILS))
2678     {
2679       fprintf (dump_file, "  will take edge to ");
2680       print_generic_stmt (dump_file, CASE_LABEL (val));
2681     }
2682 }
2683 
2684 
2685 /* Evaluate statement STMT.  If the statement produces a useful range,
2686    set VR and corepsponding OUTPUT_P.
2687 
2688    If STMT is a conditional branch and we can determine its truth
2689    value, the taken edge is recorded in *TAKEN_EDGE_P.  */
2690 
2691 void
extract_range_from_stmt(gimple * stmt,edge * taken_edge_p,tree * output_p,value_range_equiv * vr)2692 vr_values::extract_range_from_stmt (gimple *stmt, edge *taken_edge_p,
2693                                             tree *output_p, value_range_equiv *vr)
2694 {
2695 
2696   if (dump_file && (dump_flags & TDF_DETAILS))
2697     {
2698       fprintf (dump_file, "\nextract_range_from_stmt visiting:\n");
2699       print_gimple_stmt (dump_file, stmt, 0, dump_flags);
2700     }
2701 
2702   if (!stmt_interesting_for_vrp (stmt))
2703     gcc_assert (stmt_ends_bb_p (stmt));
2704   else if (is_gimple_assign (stmt) || is_gimple_call (stmt))
2705     vrp_visit_assignment_or_call (stmt, output_p, vr);
2706   else if (gimple_code (stmt) == GIMPLE_COND)
2707     simplifier.vrp_visit_cond_stmt (as_a <gcond *> (stmt), taken_edge_p);
2708   else if (gimple_code (stmt) == GIMPLE_SWITCH)
2709     vrp_visit_switch_stmt (as_a <gswitch *> (stmt), taken_edge_p);
2710 }
2711 
2712 /* Visit all arguments for PHI node PHI that flow through executable
2713    edges.  If a valid value range can be derived from all the incoming
2714    value ranges, set a new range in VR_RESULT.  */
2715 
2716 void
extract_range_from_phi_node(gphi * phi,value_range_equiv * vr_result)2717 vr_values::extract_range_from_phi_node (gphi *phi,
2718                                                   value_range_equiv *vr_result)
2719 {
2720   tree lhs = PHI_RESULT (phi);
2721   const value_range_equiv *lhs_vr = get_value_range (lhs);
2722   bool first = true;
2723   int old_edges;
2724   class loop *l;
2725 
2726   if (dump_file && (dump_flags & TDF_DETAILS))
2727     {
2728       fprintf (dump_file, "\nVisiting PHI node: ");
2729       print_gimple_stmt (dump_file, phi, 0, dump_flags);
2730     }
2731 
2732   bool may_simulate_backedge_again = false;
2733   int edges = 0;
2734   for (size_t i = 0; i < gimple_phi_num_args (phi); i++)
2735     {
2736       edge e = gimple_phi_arg_edge (phi, i);
2737 
2738       if (dump_file && (dump_flags & TDF_DETAILS))
2739           {
2740             fprintf (dump_file,
2741                 "    Argument #%d (%d -> %d %sexecutable)\n",
2742                 (int) i, e->src->index, e->dest->index,
2743                 (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
2744           }
2745 
2746       if (e->flags & EDGE_EXECUTABLE)
2747           {
2748             value_range_equiv vr_arg_tem;
2749             const value_range_equiv *vr_arg = &vr_arg_tem;
2750 
2751             ++edges;
2752 
2753             tree arg = PHI_ARG_DEF (phi, i);
2754             if (TREE_CODE (arg) == SSA_NAME)
2755               {
2756                 /* See if we are eventually going to change one of the args.  */
2757                 gimple *def_stmt = SSA_NAME_DEF_STMT (arg);
2758                 if (! gimple_nop_p (def_stmt)
2759                       && prop_simulate_again_p (def_stmt)
2760                       && e->flags & EDGE_DFS_BACK)
2761                     may_simulate_backedge_again = true;
2762 
2763                 const value_range_equiv *vr_arg_ = get_value_range (arg);
2764                 /* Do not allow equivalences or symbolic ranges to leak in from
2765                      backedges.  That creates invalid equivalencies.
2766                      See PR53465 and PR54767.  */
2767                 if (e->flags & EDGE_DFS_BACK)
2768                     {
2769                       if (!vr_arg_->varying_p () && !vr_arg_->undefined_p ())
2770                         {
2771                           vr_arg_tem.set (vr_arg_->min (), vr_arg_->max (), NULL,
2772                                               vr_arg_->kind ());
2773                           if (vr_arg_tem.symbolic_p ())
2774                               vr_arg_tem.set_varying (TREE_TYPE (arg));
2775                         }
2776                       else
2777                         vr_arg = vr_arg_;
2778                     }
2779                 /* If the non-backedge arguments range is VR_VARYING then
2780                      we can still try recording a simple equivalence.  */
2781                 else if (vr_arg_->varying_p ())
2782                     vr_arg_tem.set (arg);
2783                 else
2784                     vr_arg = vr_arg_;
2785               }
2786             else
2787               {
2788                 if (TREE_OVERFLOW_P (arg))
2789                     arg = drop_tree_overflow (arg);
2790 
2791                 vr_arg_tem.set (arg);
2792               }
2793 
2794             if (dump_file && (dump_flags & TDF_DETAILS))
2795               {
2796                 fprintf (dump_file, "\t");
2797                 print_generic_expr (dump_file, arg, dump_flags);
2798                 fprintf (dump_file, ": ");
2799                 dump_value_range (dump_file, vr_arg);
2800                 fprintf (dump_file, "\n");
2801               }
2802 
2803             if (first)
2804               vr_result->deep_copy (vr_arg);
2805             else
2806               vr_result->union_ (vr_arg);
2807             first = false;
2808 
2809             if (vr_result->varying_p ())
2810               break;
2811           }
2812     }
2813 
2814   if (vr_result->varying_p ())
2815     goto varying;
2816   else if (vr_result->undefined_p ())
2817     goto update_range;
2818 
2819   old_edges = vr_phi_edge_counts[SSA_NAME_VERSION (lhs)];
2820   vr_phi_edge_counts[SSA_NAME_VERSION (lhs)] = edges;
2821 
2822   /* To prevent infinite iterations in the algorithm, derive ranges
2823      when the new value is slightly bigger or smaller than the
2824      previous one.  We don't do this if we have seen a new executable
2825      edge; this helps us avoid an infinity for conditionals
2826      which are not in a loop.  If the old value-range was VR_UNDEFINED
2827      use the updated range and iterate one more time.  If we will not
2828      simulate this PHI again via the backedge allow us to iterate.  */
2829   if (edges > 0
2830       && gimple_phi_num_args (phi) > 1
2831       && edges == old_edges
2832       && !lhs_vr->undefined_p ()
2833       && may_simulate_backedge_again)
2834     {
2835       /* Compare old and new ranges, fall back to varying if the
2836          values are not comparable.  */
2837       int cmp_min = compare_values (lhs_vr->min (), vr_result->min ());
2838       if (cmp_min == -2)
2839           goto varying;
2840       int cmp_max = compare_values (lhs_vr->max (), vr_result->max ());
2841       if (cmp_max == -2)
2842           goto varying;
2843 
2844       /* For non VR_RANGE or for pointers fall back to varying if
2845            the range changed.  */
2846       if ((lhs_vr->kind () != VR_RANGE || vr_result->kind () != VR_RANGE
2847              || POINTER_TYPE_P (TREE_TYPE (lhs)))
2848             && (cmp_min != 0 || cmp_max != 0))
2849           goto varying;
2850 
2851       /* If the new minimum is larger than the previous one
2852            retain the old value.  If the new minimum value is smaller
2853            than the previous one and not -INF go all the way to -INF + 1.
2854            In the first case, to avoid infinite bouncing between different
2855            minimums, and in the other case to avoid iterating millions of
2856            times to reach -INF.  Going to -INF + 1 also lets the following
2857            iteration compute whether there will be any overflow, at the
2858            expense of one additional iteration.  */
2859       tree new_min = vr_result->min ();
2860       tree new_max = vr_result->max ();
2861       if (cmp_min < 0)
2862           new_min = lhs_vr->min ();
2863       else if (cmp_min > 0
2864                  && (TREE_CODE (vr_result->min ()) != INTEGER_CST
2865                        || tree_int_cst_lt (vrp_val_min (vr_result->type ()),
2866                                                vr_result->min ())))
2867           new_min = int_const_binop (PLUS_EXPR,
2868                                            vrp_val_min (vr_result->type ()),
2869                                            build_int_cst (vr_result->type (), 1));
2870 
2871       /* Similarly for the maximum value.  */
2872       if (cmp_max > 0)
2873           new_max = lhs_vr->max ();
2874       else if (cmp_max < 0
2875                  && (TREE_CODE (vr_result->max ()) != INTEGER_CST
2876                        || tree_int_cst_lt (vr_result->max (),
2877                                                vrp_val_max (vr_result->type ()))))
2878           new_max = int_const_binop (MINUS_EXPR,
2879                                            vrp_val_max (vr_result->type ()),
2880                                            build_int_cst (vr_result->type (), 1));
2881 
2882       vr_result->update (new_min, new_max, vr_result->kind ());
2883 
2884       /* If we dropped either bound to +-INF then if this is a loop
2885            PHI node SCEV may known more about its value-range.  */
2886       if (cmp_min > 0 || cmp_min < 0
2887              || cmp_max < 0 || cmp_max > 0)
2888           goto scev_check;
2889 
2890       goto infinite_check;
2891     }
2892 
2893   goto update_range;
2894 
2895 varying:
2896   vr_result->set_varying (TREE_TYPE (lhs));
2897 
2898 scev_check:
2899   /* If this is a loop PHI node SCEV may known more about its value-range.
2900      scev_check can be reached from two paths, one is a fall through from above
2901      "varying" label, the other is direct goto from code block which tries to
2902      avoid infinite simulation.  */
2903   if (scev_initialized_p ()
2904       && (l = loop_containing_stmt (phi))
2905       && l->header == gimple_bb (phi))
2906     adjust_range_with_scev (vr_result, l, phi, lhs);
2907 
2908 infinite_check:
2909   /* If we will end up with a (-INF, +INF) range, set it to
2910      VARYING.  Same if the previous max value was invalid for
2911      the type and we end up with vr_result.min > vr_result.max.  */
2912   if ((!vr_result->varying_p () && !vr_result->undefined_p ())
2913       && !((vrp_val_is_max (vr_result->max ()) && vrp_val_is_min (vr_result->min ()))
2914              || compare_values (vr_result->min (), vr_result->max ()) > 0))
2915     ;
2916   else
2917     vr_result->set_varying (TREE_TYPE (lhs));
2918 
2919   /* If the new range is different than the previous value, keep
2920      iterating.  */
2921 update_range:
2922   return;
2923 }
2924 
2925 /* Simplify boolean operations if the source is known
2926    to be already a boolean.  */
2927 bool
simplify_truth_ops_using_ranges(gimple_stmt_iterator * gsi,gimple * stmt)2928 simplify_using_ranges::simplify_truth_ops_using_ranges
2929                                                   (gimple_stmt_iterator *gsi,
2930                                                    gimple *stmt)
2931 {
2932   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
2933   tree lhs, op0, op1;
2934   bool need_conversion;
2935 
2936   /* We handle only !=/== case here.  */
2937   gcc_assert (rhs_code == EQ_EXPR || rhs_code == NE_EXPR);
2938 
2939   op0 = gimple_assign_rhs1 (stmt);
2940   if (!op_with_boolean_value_range_p (op0, stmt))
2941     return false;
2942 
2943   op1 = gimple_assign_rhs2 (stmt);
2944   if (!op_with_boolean_value_range_p (op1, stmt))
2945     return false;
2946 
2947   /* Reduce number of cases to handle to NE_EXPR.  As there is no
2948      BIT_XNOR_EXPR we cannot replace A == B with a single statement.  */
2949   if (rhs_code == EQ_EXPR)
2950     {
2951       if (TREE_CODE (op1) == INTEGER_CST)
2952           op1 = int_const_binop (BIT_XOR_EXPR, op1,
2953                                      build_int_cst (TREE_TYPE (op1), 1));
2954       else
2955           return false;
2956     }
2957 
2958   lhs = gimple_assign_lhs (stmt);
2959   need_conversion
2960     = !useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (op0));
2961 
2962   /* Make sure to not sign-extend a 1-bit 1 when converting the result.  */
2963   if (need_conversion
2964       && !TYPE_UNSIGNED (TREE_TYPE (op0))
2965       && TYPE_PRECISION (TREE_TYPE (op0)) == 1
2966       && TYPE_PRECISION (TREE_TYPE (lhs)) > 1)
2967     return false;
2968 
2969   /* For A != 0 we can substitute A itself.  */
2970   if (integer_zerop (op1))
2971     gimple_assign_set_rhs_with_ops (gsi,
2972                                             need_conversion
2973                                             ? NOP_EXPR : TREE_CODE (op0), op0);
2974   /* For A != B we substitute A ^ B.  Either with conversion.  */
2975   else if (need_conversion)
2976     {
2977       tree tem = make_ssa_name (TREE_TYPE (op0));
2978       gassign *newop
2979           = gimple_build_assign (tem, BIT_XOR_EXPR, op0, op1);
2980       gsi_insert_before (gsi, newop, GSI_SAME_STMT);
2981       if (INTEGRAL_TYPE_P (TREE_TYPE (tem))
2982             && TYPE_PRECISION (TREE_TYPE (tem)) > 1)
2983           set_range_info (tem, VR_RANGE,
2984                               wi::zero (TYPE_PRECISION (TREE_TYPE (tem))),
2985                               wi::one (TYPE_PRECISION (TREE_TYPE (tem))));
2986       gimple_assign_set_rhs_with_ops (gsi, NOP_EXPR, tem);
2987     }
2988   /* Or without.  */
2989   else
2990     gimple_assign_set_rhs_with_ops (gsi, BIT_XOR_EXPR, op0, op1);
2991   update_stmt (gsi_stmt (*gsi));
2992   fold_stmt (gsi, follow_single_use_edges);
2993 
2994   return true;
2995 }
2996 
2997 /* Simplify a division or modulo operator to a right shift or bitwise and
2998    if the first operand is unsigned or is greater than zero and the second
2999    operand is an exact power of two.  For TRUNC_MOD_EXPR op0 % op1 with
3000    constant op1 (op1min = op1) or with op1 in [op1min, op1max] range,
3001    optimize it into just op0 if op0's range is known to be a subset of
3002    [-op1min + 1, op1min - 1] for signed and [0, op1min - 1] for unsigned
3003    modulo.  */
3004 
3005 bool
simplify_div_or_mod_using_ranges(gimple_stmt_iterator * gsi,gimple * stmt)3006 simplify_using_ranges::simplify_div_or_mod_using_ranges
3007                                                   (gimple_stmt_iterator *gsi,
3008                                                    gimple *stmt)
3009 {
3010   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3011   tree val = NULL;
3012   tree op0 = gimple_assign_rhs1 (stmt);
3013   tree op1 = gimple_assign_rhs2 (stmt);
3014   tree op0min = NULL_TREE, op0max = NULL_TREE;
3015   tree op1min = op1;
3016   const value_range *vr = NULL;
3017 
3018   if (TREE_CODE (op0) == INTEGER_CST)
3019     {
3020       op0min = op0;
3021       op0max = op0;
3022     }
3023   else
3024     {
3025       vr = query->get_value_range (op0, stmt);
3026       if (range_int_cst_p (vr))
3027           {
3028             op0min = vr->min ();
3029             op0max = vr->max ();
3030           }
3031     }
3032 
3033   if (rhs_code == TRUNC_MOD_EXPR
3034       && TREE_CODE (op1) == SSA_NAME)
3035     {
3036       const value_range_equiv *vr1 = query->get_value_range (op1, stmt);
3037       if (range_int_cst_p (vr1))
3038           op1min = vr1->min ();
3039     }
3040   if (rhs_code == TRUNC_MOD_EXPR
3041       && TREE_CODE (op1min) == INTEGER_CST
3042       && tree_int_cst_sgn (op1min) == 1
3043       && op0max
3044       && tree_int_cst_lt (op0max, op1min))
3045     {
3046       if (TYPE_UNSIGNED (TREE_TYPE (op0))
3047             || tree_int_cst_sgn (op0min) >= 0
3048             || tree_int_cst_lt (fold_unary (NEGATE_EXPR, TREE_TYPE (op1min), op1min),
3049                                     op0min))
3050           {
3051             /* If op0 already has the range op0 % op1 has,
3052                then TRUNC_MOD_EXPR won't change anything.  */
3053             gimple_assign_set_rhs_from_tree (gsi, op0);
3054             return true;
3055           }
3056     }
3057 
3058   if (TREE_CODE (op0) != SSA_NAME)
3059     return false;
3060 
3061   if (!integer_pow2p (op1))
3062     {
3063       /* X % -Y can be only optimized into X % Y either if
3064            X is not INT_MIN, or Y is not -1.  Fold it now, as after
3065            remove_range_assertions the range info might be not available
3066            anymore.  */
3067       if (rhs_code == TRUNC_MOD_EXPR
3068             && fold_stmt (gsi, follow_single_use_edges))
3069           return true;
3070       return false;
3071     }
3072 
3073   if (TYPE_UNSIGNED (TREE_TYPE (op0)))
3074     val = integer_one_node;
3075   else
3076     {
3077       bool sop = false;
3078 
3079       val = compare_range_with_value (GE_EXPR, vr, integer_zero_node, &sop);
3080 
3081       if (val
3082             && sop
3083             && integer_onep (val)
3084             && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
3085           {
3086             location_t location;
3087 
3088             if (!gimple_has_location (stmt))
3089               location = input_location;
3090             else
3091               location = gimple_location (stmt);
3092             warning_at (location, OPT_Wstrict_overflow,
3093                           "assuming signed overflow does not occur when "
3094                           "simplifying %</%> or %<%%%> to %<>>%> or %<&%>");
3095           }
3096     }
3097 
3098   if (val && integer_onep (val))
3099     {
3100       tree t;
3101 
3102       if (rhs_code == TRUNC_DIV_EXPR)
3103           {
3104             t = build_int_cst (integer_type_node, tree_log2 (op1));
3105             gimple_assign_set_rhs_code (stmt, RSHIFT_EXPR);
3106             gimple_assign_set_rhs1 (stmt, op0);
3107             gimple_assign_set_rhs2 (stmt, t);
3108           }
3109       else
3110           {
3111             t = build_int_cst (TREE_TYPE (op1), 1);
3112             t = int_const_binop (MINUS_EXPR, op1, t);
3113             t = fold_convert (TREE_TYPE (op0), t);
3114 
3115             gimple_assign_set_rhs_code (stmt, BIT_AND_EXPR);
3116             gimple_assign_set_rhs1 (stmt, op0);
3117             gimple_assign_set_rhs2 (stmt, t);
3118           }
3119 
3120       update_stmt (stmt);
3121       fold_stmt (gsi, follow_single_use_edges);
3122       return true;
3123     }
3124 
3125   return false;
3126 }
3127 
3128 /* Simplify a min or max if the ranges of the two operands are
3129    disjoint.   Return true if we do simplify.  */
3130 
3131 bool
simplify_min_or_max_using_ranges(gimple_stmt_iterator * gsi,gimple * stmt)3132 simplify_using_ranges::simplify_min_or_max_using_ranges
3133                                         (gimple_stmt_iterator *gsi,
3134                                          gimple *stmt)
3135 {
3136   tree op0 = gimple_assign_rhs1 (stmt);
3137   tree op1 = gimple_assign_rhs2 (stmt);
3138   bool sop = false;
3139   tree val;
3140 
3141   val = (vrp_evaluate_conditional_warnv_with_ops_using_ranges
3142            (LE_EXPR, op0, op1, &sop, stmt));
3143   if (!val)
3144     {
3145       sop = false;
3146       val = (vrp_evaluate_conditional_warnv_with_ops_using_ranges
3147                (LT_EXPR, op0, op1, &sop, stmt));
3148     }
3149 
3150   if (val)
3151     {
3152       if (sop && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
3153           {
3154             location_t location;
3155 
3156             if (!gimple_has_location (stmt))
3157               location = input_location;
3158             else
3159               location = gimple_location (stmt);
3160             warning_at (location, OPT_Wstrict_overflow,
3161                           "assuming signed overflow does not occur when "
3162                           "simplifying %<min/max (X,Y)%> to %<X%> or %<Y%>");
3163           }
3164 
3165       /* VAL == TRUE -> OP0 < or <= op1
3166            VAL == FALSE -> OP0 > or >= op1.  */
3167       tree res = ((gimple_assign_rhs_code (stmt) == MAX_EXPR)
3168                       == integer_zerop (val)) ? op0 : op1;
3169       gimple_assign_set_rhs_from_tree (gsi, res);
3170       return true;
3171     }
3172 
3173   return false;
3174 }
3175 
3176 /* If the operand to an ABS_EXPR is >= 0, then eliminate the
3177    ABS_EXPR.  If the operand is <= 0, then simplify the
3178    ABS_EXPR into a NEGATE_EXPR.  */
3179 
3180 bool
simplify_abs_using_ranges(gimple_stmt_iterator * gsi,gimple * stmt)3181 simplify_using_ranges::simplify_abs_using_ranges (gimple_stmt_iterator *gsi,
3182                                                               gimple *stmt)
3183 {
3184   tree op = gimple_assign_rhs1 (stmt);
3185   const value_range *vr = query->get_value_range (op, stmt);
3186 
3187   if (vr)
3188     {
3189       tree val = NULL;
3190       bool sop = false;
3191 
3192       val = compare_range_with_value (LE_EXPR, vr, integer_zero_node, &sop);
3193       if (!val)
3194           {
3195             /* The range is neither <= 0 nor > 0.  Now see if it is
3196                either < 0 or >= 0.  */
3197             sop = false;
3198             val = compare_range_with_value (LT_EXPR, vr, integer_zero_node,
3199                                                     &sop);
3200           }
3201 
3202       if (val)
3203           {
3204             if (sop && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
3205               {
3206                 location_t location;
3207 
3208                 if (!gimple_has_location (stmt))
3209                     location = input_location;
3210                 else
3211                     location = gimple_location (stmt);
3212                 warning_at (location, OPT_Wstrict_overflow,
3213                                 "assuming signed overflow does not occur when "
3214                                 "simplifying %<abs (X)%> to %<X%> or %<-X%>");
3215               }
3216 
3217             gimple_assign_set_rhs1 (stmt, op);
3218             if (integer_zerop (val))
3219               gimple_assign_set_rhs_code (stmt, SSA_NAME);
3220             else
3221               gimple_assign_set_rhs_code (stmt, NEGATE_EXPR);
3222             update_stmt (stmt);
3223             fold_stmt (gsi, follow_single_use_edges);
3224             return true;
3225           }
3226     }
3227 
3228   return false;
3229 }
3230 
3231 /* value_range wrapper for wi_set_zero_nonzero_bits.
3232 
3233    Return TRUE if VR was a constant range and we were able to compute
3234    the bit masks.  */
3235 
3236 static bool
vr_set_zero_nonzero_bits(const tree expr_type,const value_range * vr,wide_int * may_be_nonzero,wide_int * must_be_nonzero)3237 vr_set_zero_nonzero_bits (const tree expr_type,
3238                                 const value_range *vr,
3239                                 wide_int *may_be_nonzero,
3240                                 wide_int *must_be_nonzero)
3241 {
3242   if (range_int_cst_p (vr))
3243     {
3244       wi_set_zero_nonzero_bits (expr_type,
3245                                         wi::to_wide (vr->min ()),
3246                                         wi::to_wide (vr->max ()),
3247                                         *may_be_nonzero, *must_be_nonzero);
3248       return true;
3249     }
3250   *may_be_nonzero = wi::minus_one (TYPE_PRECISION (expr_type));
3251   *must_be_nonzero = wi::zero (TYPE_PRECISION (expr_type));
3252   return false;
3253 }
3254 
3255 /* Optimize away redundant BIT_AND_EXPR and BIT_IOR_EXPR.
3256    If all the bits that are being cleared by & are already
3257    known to be zero from VR, or all the bits that are being
3258    set by | are already known to be one from VR, the bit
3259    operation is redundant.  */
3260 
3261 bool
simplify_bit_ops_using_ranges(gimple_stmt_iterator * gsi,gimple * stmt)3262 simplify_using_ranges::simplify_bit_ops_using_ranges
3263                                         (gimple_stmt_iterator *gsi,
3264                                          gimple *stmt)
3265 {
3266   tree op0 = gimple_assign_rhs1 (stmt);
3267   tree op1 = gimple_assign_rhs2 (stmt);
3268   tree op = NULL_TREE;
3269   value_range vr0, vr1;
3270   wide_int may_be_nonzero0, may_be_nonzero1;
3271   wide_int must_be_nonzero0, must_be_nonzero1;
3272   wide_int mask;
3273 
3274   if (TREE_CODE (op0) == SSA_NAME)
3275     vr0 = *(query->get_value_range (op0, stmt));
3276   else if (is_gimple_min_invariant (op0))
3277     vr0.set (op0);
3278   else
3279     return false;
3280 
3281   if (TREE_CODE (op1) == SSA_NAME)
3282     vr1 = *(query->get_value_range (op1, stmt));
3283   else if (is_gimple_min_invariant (op1))
3284     vr1.set (op1);
3285   else
3286     return false;
3287 
3288   if (!vr_set_zero_nonzero_bits (TREE_TYPE (op0), &vr0, &may_be_nonzero0,
3289                                          &must_be_nonzero0))
3290     return false;
3291   if (!vr_set_zero_nonzero_bits (TREE_TYPE (op1), &vr1, &may_be_nonzero1,
3292                                          &must_be_nonzero1))
3293     return false;
3294 
3295   switch (gimple_assign_rhs_code (stmt))
3296     {
3297     case BIT_AND_EXPR:
3298       mask = wi::bit_and_not (may_be_nonzero0, must_be_nonzero1);
3299       if (mask == 0)
3300           {
3301             op = op0;
3302             break;
3303           }
3304       mask = wi::bit_and_not (may_be_nonzero1, must_be_nonzero0);
3305       if (mask == 0)
3306           {
3307             op = op1;
3308             break;
3309           }
3310       break;
3311     case BIT_IOR_EXPR:
3312       mask = wi::bit_and_not (may_be_nonzero0, must_be_nonzero1);
3313       if (mask == 0)
3314           {
3315             op = op1;
3316             break;
3317           }
3318       mask = wi::bit_and_not (may_be_nonzero1, must_be_nonzero0);
3319       if (mask == 0)
3320           {
3321             op = op0;
3322             break;
3323           }
3324       break;
3325     default:
3326       gcc_unreachable ();
3327     }
3328 
3329   if (op == NULL_TREE)
3330     return false;
3331 
3332   gimple_assign_set_rhs_with_ops (gsi, TREE_CODE (op), op);
3333   update_stmt (gsi_stmt (*gsi));
3334   return true;
3335 }
3336 
3337 /* We are comparing trees OP0 and OP1 using COND_CODE.  OP0 has
3338    a known value range VR.
3339 
3340    If there is one and only one value which will satisfy the
3341    conditional, then return that value.  Else return NULL.
3342 
3343    If signed overflow must be undefined for the value to satisfy
3344    the conditional, then set *STRICT_OVERFLOW_P to true.  */
3345 
3346 static tree
test_for_singularity(enum tree_code cond_code,tree op0,tree op1,const value_range * vr)3347 test_for_singularity (enum tree_code cond_code, tree op0,
3348                           tree op1, const value_range *vr)
3349 {
3350   tree min = NULL;
3351   tree max = NULL;
3352 
3353   /* Extract minimum/maximum values which satisfy the conditional as it was
3354      written.  */
3355   if (cond_code == LE_EXPR || cond_code == LT_EXPR)
3356     {
3357       min = TYPE_MIN_VALUE (TREE_TYPE (op0));
3358 
3359       max = op1;
3360       if (cond_code == LT_EXPR)
3361           {
3362             tree one = build_int_cst (TREE_TYPE (op0), 1);
3363             max = fold_build2 (MINUS_EXPR, TREE_TYPE (op0), max, one);
3364             /* Signal to compare_values_warnv this expr doesn't overflow.  */
3365             if (EXPR_P (max))
3366               suppress_warning (max, OPT_Woverflow);
3367           }
3368     }
3369   else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
3370     {
3371       max = TYPE_MAX_VALUE (TREE_TYPE (op0));
3372 
3373       min = op1;
3374       if (cond_code == GT_EXPR)
3375           {
3376             tree one = build_int_cst (TREE_TYPE (op0), 1);
3377             min = fold_build2 (PLUS_EXPR, TREE_TYPE (op0), min, one);
3378             /* Signal to compare_values_warnv this expr doesn't overflow.  */
3379             if (EXPR_P (min))
3380               suppress_warning (min, OPT_Woverflow);
3381           }
3382     }
3383 
3384   /* Now refine the minimum and maximum values using any
3385      value range information we have for op0.  */
3386   if (min && max)
3387     {
3388       tree type = TREE_TYPE (op0);
3389       tree tmin = wide_int_to_tree (type, vr->lower_bound ());
3390       tree tmax = wide_int_to_tree (type, vr->upper_bound ());
3391       if (compare_values (tmin, min) == 1)
3392           min = tmin;
3393       if (compare_values (tmax, max) == -1)
3394           max = tmax;
3395 
3396       /* If the new min/max values have converged to a single value,
3397            then there is only one value which can satisfy the condition,
3398            return that value.  */
3399       if (operand_equal_p (min, max, 0) && is_gimple_min_invariant (min))
3400           return min;
3401     }
3402   return NULL;
3403 }
3404 
3405 /* Return whether the value range *VR fits in an integer type specified
3406    by PRECISION and UNSIGNED_P.  */
3407 
3408 bool
range_fits_type_p(const value_range * vr,unsigned dest_precision,signop dest_sgn)3409 range_fits_type_p (const value_range *vr,
3410                        unsigned dest_precision, signop dest_sgn)
3411 {
3412   tree src_type;
3413   unsigned src_precision;
3414   widest_int tem;
3415   signop src_sgn;
3416 
3417   /* We can only handle integral and pointer types.  */
3418   src_type = vr->type ();
3419   if (!INTEGRAL_TYPE_P (src_type)
3420       && !POINTER_TYPE_P (src_type))
3421     return false;
3422 
3423   /* An extension is fine unless VR is SIGNED and dest_sgn is UNSIGNED,
3424      and so is an identity transform.  */
3425   src_precision = TYPE_PRECISION (vr->type ());
3426   src_sgn = TYPE_SIGN (src_type);
3427   if ((src_precision < dest_precision
3428        && !(dest_sgn == UNSIGNED && src_sgn == SIGNED))
3429       || (src_precision == dest_precision && src_sgn == dest_sgn))
3430     return true;
3431 
3432   /* Now we can only handle ranges with constant bounds.  */
3433   if (!range_int_cst_p (vr))
3434     return false;
3435 
3436   /* For sign changes, the MSB of the wide_int has to be clear.
3437      An unsigned value with its MSB set cannot be represented by
3438      a signed wide_int, while a negative value cannot be represented
3439      by an unsigned wide_int.  */
3440   if (src_sgn != dest_sgn
3441       && (wi::lts_p (wi::to_wide (vr->min ()), 0)
3442             || wi::lts_p (wi::to_wide (vr->max ()), 0)))
3443     return false;
3444 
3445   /* Then we can perform the conversion on both ends and compare
3446      the result for equality.  */
3447   tem = wi::ext (wi::to_widest (vr->min ()), dest_precision, dest_sgn);
3448   if (tem != wi::to_widest (vr->min ()))
3449     return false;
3450   tem = wi::ext (wi::to_widest (vr->max ()), dest_precision, dest_sgn);
3451   if (tem != wi::to_widest (vr->max ()))
3452     return false;
3453 
3454   return true;
3455 }
3456 
3457 // Clear edge E of EDGE_EXECUTABLE (it is unexecutable). If it wasn't
3458 // previously clear, propagate to successor blocks if appropriate.
3459 
3460 void
set_and_propagate_unexecutable(edge e)3461 simplify_using_ranges::set_and_propagate_unexecutable (edge e)
3462 {
3463   // If not_executable is already set, we're done.
3464   // This works in the absence of a flag as well.
3465   if ((e->flags & m_not_executable_flag) == m_not_executable_flag)
3466     return;
3467 
3468   e->flags |= m_not_executable_flag;
3469   m_flag_set_edges.safe_push (e);
3470 
3471   // Check if the destination block needs to propagate the property.
3472   basic_block bb = e->dest;
3473 
3474   // If any incoming edge is executable, we are done.
3475   edge_iterator ei;
3476   FOR_EACH_EDGE (e, ei, bb->preds)
3477     if ((e->flags & m_not_executable_flag) == 0)
3478       return;
3479 
3480   // This block is also unexecutable, propagate to all exit edges as well.
3481   FOR_EACH_EDGE (e, ei, bb->succs)
3482     set_and_propagate_unexecutable (e);
3483 }
3484 
3485 /* If COND can be folded entirely as TRUE or FALSE, rewrite the
3486    conditional as such, and return TRUE.  */
3487 
3488 bool
fold_cond(gcond * cond)3489 simplify_using_ranges::fold_cond (gcond *cond)
3490 {
3491   int_range_max r;
3492   if (query->range_of_stmt (r, cond) && r.singleton_p ())
3493     {
3494       // COND has already been folded if arguments are constant.
3495       if (TREE_CODE (gimple_cond_lhs (cond)) != SSA_NAME
3496             && TREE_CODE (gimple_cond_rhs (cond)) != SSA_NAME)
3497           return false;
3498       if (dump_file)
3499           {
3500             fprintf (dump_file, "Folding predicate ");
3501             print_gimple_expr (dump_file, cond, 0);
3502             fprintf (dump_file, " to ");
3503           }
3504       edge e0 = EDGE_SUCC (gimple_bb (cond), 0);
3505       edge e1 = EDGE_SUCC (gimple_bb (cond), 1);
3506       if (r.zero_p ())
3507           {
3508             if (dump_file)
3509               fprintf (dump_file, "0\n");
3510             gimple_cond_make_false (cond);
3511             if (e0->flags & EDGE_TRUE_VALUE)
3512               set_and_propagate_unexecutable (e0);
3513             else
3514               set_and_propagate_unexecutable (e1);
3515           }
3516       else
3517           {
3518             if (dump_file)
3519               fprintf (dump_file, "1\n");
3520             gimple_cond_make_true (cond);
3521             if (e0->flags & EDGE_FALSE_VALUE)
3522               set_and_propagate_unexecutable (e0);
3523             else
3524               set_and_propagate_unexecutable (e1);
3525           }
3526       update_stmt (cond);
3527       return true;
3528     }
3529 
3530   /* ?? vrp_folder::fold_predicate_in() is a superset of this.  At
3531      some point we should merge all variants of this code.  */
3532   edge taken_edge;
3533   vrp_visit_cond_stmt (cond, &taken_edge);
3534 
3535   if (taken_edge)
3536     {
3537       if (taken_edge->flags & EDGE_TRUE_VALUE)
3538           {
3539             if (dump_file && (dump_flags & TDF_DETAILS))
3540               fprintf (dump_file, "\nVRP Predicate evaluates to: 1\n");
3541             gimple_cond_make_true (cond);
3542           }
3543       else if (taken_edge->flags & EDGE_FALSE_VALUE)
3544           {
3545             if (dump_file && (dump_flags & TDF_DETAILS))
3546               fprintf (dump_file, "\nVRP Predicate evaluates to: 0\n");
3547             gimple_cond_make_false (cond);
3548           }
3549       else
3550        gcc_unreachable ();
3551       update_stmt (cond);
3552       return true;
3553     }
3554   return false;
3555 }
3556 
3557 /* Simplify a conditional using a relational operator to an equality
3558    test if the range information indicates only one value can satisfy
3559    the original conditional.  */
3560 
3561 bool
simplify_cond_using_ranges_1(gcond * stmt)3562 simplify_using_ranges::simplify_cond_using_ranges_1 (gcond *stmt)
3563 {
3564   tree op0 = gimple_cond_lhs (stmt);
3565   tree op1 = gimple_cond_rhs (stmt);
3566   enum tree_code cond_code = gimple_cond_code (stmt);
3567 
3568   if (fold_cond (stmt))
3569     return true;
3570 
3571   if (cond_code != NE_EXPR
3572       && cond_code != EQ_EXPR
3573       && TREE_CODE (op0) == SSA_NAME
3574       && INTEGRAL_TYPE_P (TREE_TYPE (op0))
3575       && is_gimple_min_invariant (op1))
3576     {
3577       const value_range *vr = query->get_value_range (op0, stmt);
3578 
3579       /* If we have range information for OP0, then we might be
3580            able to simplify this conditional. */
3581       if (!vr->undefined_p () && !vr->varying_p ())
3582           {
3583             tree new_tree = test_for_singularity (cond_code, op0, op1, vr);
3584             if (new_tree)
3585               {
3586                 if (dump_file)
3587                     {
3588                       fprintf (dump_file, "Simplified relational ");
3589                       print_gimple_stmt (dump_file, stmt, 0);
3590                       fprintf (dump_file, " into ");
3591                     }
3592 
3593                 gimple_cond_set_code (stmt, EQ_EXPR);
3594                 gimple_cond_set_lhs (stmt, op0);
3595                 gimple_cond_set_rhs (stmt, new_tree);
3596 
3597                 update_stmt (stmt);
3598 
3599                 if (dump_file)
3600                     {
3601                       print_gimple_stmt (dump_file, stmt, 0);
3602                       fprintf (dump_file, "\n");
3603                     }
3604 
3605                 return true;
3606               }
3607 
3608             /* Try again after inverting the condition.  We only deal
3609                with integral types here, so no need to worry about
3610                issues with inverting FP comparisons.  */
3611             new_tree = test_for_singularity
3612                            (invert_tree_comparison (cond_code, false),
3613                               op0, op1, vr);
3614             if (new_tree)
3615               {
3616                 if (dump_file)
3617                     {
3618                       fprintf (dump_file, "Simplified relational ");
3619                       print_gimple_stmt (dump_file, stmt, 0);
3620                       fprintf (dump_file, " into ");
3621                     }
3622 
3623                 gimple_cond_set_code (stmt, NE_EXPR);
3624                 gimple_cond_set_lhs (stmt, op0);
3625                 gimple_cond_set_rhs (stmt, new_tree);
3626 
3627                 update_stmt (stmt);
3628 
3629                 if (dump_file)
3630                     {
3631                       print_gimple_stmt (dump_file, stmt, 0);
3632                       fprintf (dump_file, "\n");
3633                     }
3634 
3635                 return true;
3636               }
3637           }
3638     }
3639   // Try to simplify casted conditions.
3640   return simplify_casted_cond (stmt);
3641 }
3642 
3643 /* STMT is a conditional at the end of a basic block.
3644 
3645    If the conditional is of the form SSA_NAME op constant and the SSA_NAME
3646    was set via a type conversion, try to replace the SSA_NAME with the RHS
3647    of the type conversion.  Doing so makes the conversion dead which helps
3648    subsequent passes.  */
3649 
3650 bool
simplify_casted_cond(gcond * stmt)3651 simplify_using_ranges::simplify_casted_cond (gcond *stmt)
3652 {
3653   tree op0 = gimple_cond_lhs (stmt);
3654   tree op1 = gimple_cond_rhs (stmt);
3655 
3656   /* If we have a comparison of an SSA_NAME (OP0) against a constant,
3657      see if OP0 was set by a type conversion where the source of
3658      the conversion is another SSA_NAME with a range that fits
3659      into the range of OP0's type.
3660 
3661      If so, the conversion is redundant as the earlier SSA_NAME can be
3662      used for the comparison directly if we just massage the constant in the
3663      comparison.  */
3664   if (TREE_CODE (op0) == SSA_NAME
3665       && TREE_CODE (op1) == INTEGER_CST)
3666     {
3667       gimple *def_stmt = SSA_NAME_DEF_STMT (op0);
3668       tree innerop;
3669 
3670       if (!is_gimple_assign (def_stmt))
3671           return false;
3672 
3673       switch (gimple_assign_rhs_code (def_stmt))
3674           {
3675           CASE_CONVERT:
3676             innerop = gimple_assign_rhs1 (def_stmt);
3677             break;
3678           case VIEW_CONVERT_EXPR:
3679             innerop = TREE_OPERAND (gimple_assign_rhs1 (def_stmt), 0);
3680             if (!INTEGRAL_TYPE_P (TREE_TYPE (innerop)))
3681               return false;
3682             break;
3683           default:
3684             return false;
3685           }
3686 
3687       if (TREE_CODE (innerop) == SSA_NAME
3688             && !POINTER_TYPE_P (TREE_TYPE (innerop))
3689             && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (innerop)
3690             && desired_pro_or_demotion_p (TREE_TYPE (innerop), TREE_TYPE (op0)))
3691           {
3692             const value_range *vr = query->get_value_range (innerop);
3693 
3694             if (range_int_cst_p (vr)
3695                 && range_fits_type_p (vr,
3696                                             TYPE_PRECISION (TREE_TYPE (op0)),
3697                                             TYPE_SIGN (TREE_TYPE (op0)))
3698                 && int_fits_type_p (op1, TREE_TYPE (innerop)))
3699               {
3700                 tree newconst = fold_convert (TREE_TYPE (innerop), op1);
3701                 gimple_cond_set_lhs (stmt, innerop);
3702                 gimple_cond_set_rhs (stmt, newconst);
3703                 update_stmt (stmt);
3704                 return true;
3705               }
3706           }
3707     }
3708   return false;
3709 }
3710 
3711 /* Simplify a switch statement using the value range of the switch
3712    argument.  */
3713 
3714 bool
simplify_switch_using_ranges(gswitch * stmt)3715 simplify_using_ranges::simplify_switch_using_ranges (gswitch *stmt)
3716 {
3717   tree op = gimple_switch_index (stmt);
3718   const value_range *vr = NULL;
3719   bool take_default;
3720   edge e;
3721   edge_iterator ei;
3722   size_t i = 0, j = 0, n, n2;
3723   tree vec2;
3724   switch_update su;
3725   size_t k = 1, l = 0;
3726 
3727   if (TREE_CODE (op) == SSA_NAME)
3728     {
3729       vr = query->get_value_range (op, stmt);
3730 
3731       /* We can only handle integer ranges.  */
3732       if (vr->varying_p ()
3733             || vr->undefined_p ()
3734             || vr->symbolic_p ())
3735           return false;
3736 
3737       /* Find case label for min/max of the value range.  */
3738       take_default = !find_case_label_ranges (stmt, vr, &i, &j, &k, &l);
3739     }
3740   else if (TREE_CODE (op) == INTEGER_CST)
3741     {
3742       take_default = !find_case_label_index (stmt, 1, op, &i);
3743       if (take_default)
3744           {
3745             i = 1;
3746             j = 0;
3747           }
3748       else
3749           {
3750             j = i;
3751           }
3752     }
3753   else
3754     return false;
3755 
3756   n = gimple_switch_num_labels (stmt);
3757 
3758   /* We can truncate the case label ranges that partially overlap with OP's
3759      value range.  */
3760   size_t min_idx = 1, max_idx = 0;
3761   if (vr != NULL)
3762     find_case_label_range (stmt, vr->min (), vr->max (), &min_idx, &max_idx);
3763   if (min_idx <= max_idx)
3764     {
3765       tree min_label = gimple_switch_label (stmt, min_idx);
3766       tree max_label = gimple_switch_label (stmt, max_idx);
3767 
3768       /* Avoid changing the type of the case labels when truncating.  */
3769       tree case_label_type = TREE_TYPE (CASE_LOW (min_label));
3770       tree vr_min = fold_convert (case_label_type, vr->min ());
3771       tree vr_max = fold_convert (case_label_type, vr->max ());
3772 
3773       if (vr->kind () == VR_RANGE)
3774           {
3775             /* If OP's value range is [2,8] and the low label range is
3776                0 ... 3, truncate the label's range to 2 .. 3.  */
3777             if (tree_int_cst_compare (CASE_LOW (min_label), vr_min) < 0
3778                 && CASE_HIGH (min_label) != NULL_TREE
3779                 && tree_int_cst_compare (CASE_HIGH (min_label), vr_min) >= 0)
3780               CASE_LOW (min_label) = vr_min;
3781 
3782             /* If OP's value range is [2,8] and the high label range is
3783                7 ... 10, truncate the label's range to 7 .. 8.  */
3784             if (tree_int_cst_compare (CASE_LOW (max_label), vr_max) <= 0
3785                 && CASE_HIGH (max_label) != NULL_TREE
3786                 && tree_int_cst_compare (CASE_HIGH (max_label), vr_max) > 0)
3787               CASE_HIGH (max_label) = vr_max;
3788           }
3789       else if (vr->kind () == VR_ANTI_RANGE)
3790           {
3791             tree one_cst = build_one_cst (case_label_type);
3792 
3793             if (min_label == max_label)
3794               {
3795                 /* If OP's value range is ~[7,8] and the label's range is
3796                      7 ... 10, truncate the label's range to 9 ... 10.  */
3797                 if (tree_int_cst_compare (CASE_LOW (min_label), vr_min) == 0
3798                       && CASE_HIGH (min_label) != NULL_TREE
3799                       && tree_int_cst_compare (CASE_HIGH (min_label), vr_max) > 0)
3800                     CASE_LOW (min_label)
3801                       = int_const_binop (PLUS_EXPR, vr_max, one_cst);
3802 
3803                 /* If OP's value range is ~[7,8] and the label's range is
3804                      5 ... 8, truncate the label's range to 5 ... 6.  */
3805                 if (tree_int_cst_compare (CASE_LOW (min_label), vr_min) < 0
3806                       && CASE_HIGH (min_label) != NULL_TREE
3807                       && tree_int_cst_compare (CASE_HIGH (min_label), vr_max) == 0)
3808                     CASE_HIGH (min_label)
3809                       = int_const_binop (MINUS_EXPR, vr_min, one_cst);
3810               }
3811             else
3812               {
3813                 /* If OP's value range is ~[2,8] and the low label range is
3814                      0 ... 3, truncate the label's range to 0 ... 1.  */
3815                 if (tree_int_cst_compare (CASE_LOW (min_label), vr_min) < 0
3816                       && CASE_HIGH (min_label) != NULL_TREE
3817                       && tree_int_cst_compare (CASE_HIGH (min_label), vr_min) >= 0)
3818                     CASE_HIGH (min_label)
3819                       = int_const_binop (MINUS_EXPR, vr_min, one_cst);
3820 
3821                 /* If OP's value range is ~[2,8] and the high label range is
3822                      7 ... 10, truncate the label's range to 9 ... 10.  */
3823                 if (tree_int_cst_compare (CASE_LOW (max_label), vr_max) <= 0
3824                       && CASE_HIGH (max_label) != NULL_TREE
3825                       && tree_int_cst_compare (CASE_HIGH (max_label), vr_max) > 0)
3826                     CASE_LOW (max_label)
3827                       = int_const_binop (PLUS_EXPR, vr_max, one_cst);
3828               }
3829           }
3830 
3831       /* Canonicalize singleton case ranges.  */
3832       if (tree_int_cst_equal (CASE_LOW (min_label), CASE_HIGH (min_label)))
3833           CASE_HIGH (min_label) = NULL_TREE;
3834       if (tree_int_cst_equal (CASE_LOW (max_label), CASE_HIGH (max_label)))
3835           CASE_HIGH (max_label) = NULL_TREE;
3836     }
3837 
3838   /* We can also eliminate case labels that lie completely outside OP's value
3839      range.  */
3840 
3841   /* Bail out if this is just all edges taken.  */
3842   if (i == 1
3843       && j == n - 1
3844       && take_default)
3845     return false;
3846 
3847   /* Build a new vector of taken case labels.  */
3848   vec2 = make_tree_vec (j - i + 1 + l - k + 1 + (int)take_default);
3849   n2 = 0;
3850 
3851   /* Add the default edge, if necessary.  */
3852   if (take_default)
3853     TREE_VEC_ELT (vec2, n2++) = gimple_switch_default_label (stmt);
3854 
3855   for (; i <= j; ++i, ++n2)
3856     TREE_VEC_ELT (vec2, n2) = gimple_switch_label (stmt, i);
3857 
3858   for (; k <= l; ++k, ++n2)
3859     TREE_VEC_ELT (vec2, n2) = gimple_switch_label (stmt, k);
3860 
3861   /* Mark needed edges.  */
3862   for (i = 0; i < n2; ++i)
3863     {
3864       e = find_edge (gimple_bb (stmt),
3865                          label_to_block (cfun,
3866                                              CASE_LABEL (TREE_VEC_ELT (vec2, i))));
3867       e->aux = (void *)-1;
3868     }
3869 
3870   /* Queue not needed edges for later removal.  */
3871   FOR_EACH_EDGE (e, ei, gimple_bb (stmt)->succs)
3872     {
3873       if (e->aux == (void *)-1)
3874           {
3875             e->aux = NULL;
3876             continue;
3877           }
3878 
3879       if (dump_file && (dump_flags & TDF_DETAILS))
3880           {
3881             fprintf (dump_file, "removing unreachable case label\n");
3882           }
3883       to_remove_edges.safe_push (e);
3884       set_and_propagate_unexecutable (e);
3885       e->flags &= ~EDGE_EXECUTABLE;
3886       e->flags |= EDGE_IGNORE;
3887     }
3888 
3889   /* And queue an update for the stmt.  */
3890   su.stmt = stmt;
3891   su.vec = vec2;
3892   to_update_switch_stmts.safe_push (su);
3893   return true;
3894 }
3895 
3896 void
cleanup_edges_and_switches(void)3897 simplify_using_ranges::cleanup_edges_and_switches (void)
3898 {
3899   int i;
3900   edge e;
3901   switch_update *su;
3902 
3903   /* Clear any edges marked as not executable.  */
3904   if (m_not_executable_flag)
3905     {
3906       FOR_EACH_VEC_ELT (m_flag_set_edges, i, e)
3907           e->flags &= ~m_not_executable_flag;
3908     }
3909   /* Remove dead edges from SWITCH_EXPR optimization.  This leaves the
3910      CFG in a broken state and requires a cfg_cleanup run.  */
3911   FOR_EACH_VEC_ELT (to_remove_edges, i, e)
3912     remove_edge (e);
3913 
3914   /* Update SWITCH_EXPR case label vector.  */
3915   FOR_EACH_VEC_ELT (to_update_switch_stmts, i, su)
3916     {
3917       size_t j;
3918       size_t n = TREE_VEC_LENGTH (su->vec);
3919       tree label;
3920       gimple_switch_set_num_labels (su->stmt, n);
3921       for (j = 0; j < n; j++)
3922           gimple_switch_set_label (su->stmt, j, TREE_VEC_ELT (su->vec, j));
3923       /* As we may have replaced the default label with a regular one
3924            make sure to make it a real default label again.  This ensures
3925            optimal expansion.  */
3926       label = gimple_switch_label (su->stmt, 0);
3927       CASE_LOW (label) = NULL_TREE;
3928       CASE_HIGH (label) = NULL_TREE;
3929     }
3930 
3931   if (!to_remove_edges.is_empty ())
3932     {
3933       free_dominance_info (CDI_DOMINATORS);
3934       loops_state_set (LOOPS_NEED_FIXUP);
3935     }
3936 
3937   to_remove_edges.release ();
3938   to_update_switch_stmts.release ();
3939 }
3940 
3941 /* Simplify an integral conversion from an SSA name in STMT.  */
3942 
3943 static bool
simplify_conversion_using_ranges(gimple_stmt_iterator * gsi,gimple * stmt)3944 simplify_conversion_using_ranges (gimple_stmt_iterator *gsi, gimple *stmt)
3945 {
3946   tree innerop, middleop, finaltype;
3947   gimple *def_stmt;
3948   signop inner_sgn, middle_sgn, final_sgn;
3949   unsigned inner_prec, middle_prec, final_prec;
3950   widest_int innermin, innermed, innermax, middlemin, middlemed, middlemax;
3951 
3952   finaltype = TREE_TYPE (gimple_assign_lhs (stmt));
3953   if (!INTEGRAL_TYPE_P (finaltype))
3954     return false;
3955   middleop = gimple_assign_rhs1 (stmt);
3956   def_stmt = SSA_NAME_DEF_STMT (middleop);
3957   if (!is_gimple_assign (def_stmt)
3958       || !CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def_stmt)))
3959     return false;
3960   innerop = gimple_assign_rhs1 (def_stmt);
3961   if (TREE_CODE (innerop) != SSA_NAME
3962       || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (innerop))
3963     return false;
3964 
3965   /* Get the value-range of the inner operand.  Use global ranges in
3966      case innerop was created during substitute-and-fold.  */
3967   wide_int imin, imax;
3968   value_range vr;
3969   if (!INTEGRAL_TYPE_P (TREE_TYPE (innerop)))
3970     return false;
3971   get_range_query (cfun)->range_of_expr (vr, innerop, stmt);
3972   if (vr.undefined_p () || vr.varying_p ())
3973     return false;
3974   innermin = widest_int::from (vr.lower_bound (), TYPE_SIGN (TREE_TYPE (innerop)));
3975   innermax = widest_int::from (vr.upper_bound (), TYPE_SIGN (TREE_TYPE (innerop)));
3976 
3977   /* Simulate the conversion chain to check if the result is equal if
3978      the middle conversion is removed.  */
3979   inner_prec = TYPE_PRECISION (TREE_TYPE (innerop));
3980   middle_prec = TYPE_PRECISION (TREE_TYPE (middleop));
3981   final_prec = TYPE_PRECISION (finaltype);
3982 
3983   /* If the first conversion is not injective, the second must not
3984      be widening.  */
3985   if (wi::gtu_p (innermax - innermin,
3986                      wi::mask <widest_int> (middle_prec, false))
3987       && middle_prec < final_prec)
3988     return false;
3989   /* We also want a medium value so that we can track the effect that
3990      narrowing conversions with sign change have.  */
3991   inner_sgn = TYPE_SIGN (TREE_TYPE (innerop));
3992   if (inner_sgn == UNSIGNED)
3993     innermed = wi::shifted_mask <widest_int> (1, inner_prec - 1, false);
3994   else
3995     innermed = 0;
3996   if (wi::cmp (innermin, innermed, inner_sgn) >= 0
3997       || wi::cmp (innermed, innermax, inner_sgn) >= 0)
3998     innermed = innermin;
3999 
4000   middle_sgn = TYPE_SIGN (TREE_TYPE (middleop));
4001   middlemin = wi::ext (innermin, middle_prec, middle_sgn);
4002   middlemed = wi::ext (innermed, middle_prec, middle_sgn);
4003   middlemax = wi::ext (innermax, middle_prec, middle_sgn);
4004 
4005   /* Require that the final conversion applied to both the original
4006      and the intermediate range produces the same result.  */
4007   final_sgn = TYPE_SIGN (finaltype);
4008   if (wi::ext (middlemin, final_prec, final_sgn)
4009            != wi::ext (innermin, final_prec, final_sgn)
4010       || wi::ext (middlemed, final_prec, final_sgn)
4011            != wi::ext (innermed, final_prec, final_sgn)
4012       || wi::ext (middlemax, final_prec, final_sgn)
4013            != wi::ext (innermax, final_prec, final_sgn))
4014     return false;
4015 
4016   gimple_assign_set_rhs1 (stmt, innerop);
4017   fold_stmt (gsi, follow_single_use_edges);
4018   return true;
4019 }
4020 
4021 /* Simplify a conversion from integral SSA name to float in STMT.  */
4022 
4023 bool
simplify_float_conversion_using_ranges(gimple_stmt_iterator * gsi,gimple * stmt)4024 simplify_using_ranges::simplify_float_conversion_using_ranges
4025                                                   (gimple_stmt_iterator *gsi,
4026                                                    gimple *stmt)
4027 {
4028   tree rhs1 = gimple_assign_rhs1 (stmt);
4029   const value_range *vr = query->get_value_range (rhs1, stmt);
4030   scalar_float_mode fltmode
4031     = SCALAR_FLOAT_TYPE_MODE (TREE_TYPE (gimple_assign_lhs (stmt)));
4032   scalar_int_mode mode;
4033   tree tem;
4034   gassign *conv;
4035 
4036   /* We can only handle constant ranges.  */
4037   if (!range_int_cst_p (vr))
4038     return false;
4039 
4040   /* First check if we can use a signed type in place of an unsigned.  */
4041   scalar_int_mode rhs_mode = SCALAR_INT_TYPE_MODE (TREE_TYPE (rhs1));
4042   if (TYPE_UNSIGNED (TREE_TYPE (rhs1))
4043       && can_float_p (fltmode, rhs_mode, 0) != CODE_FOR_nothing
4044       && range_fits_type_p (vr, TYPE_PRECISION (TREE_TYPE (rhs1)), SIGNED))
4045     mode = rhs_mode;
4046   /* If we can do the conversion in the current input mode do nothing.  */
4047   else if (can_float_p (fltmode, rhs_mode,
4048                               TYPE_UNSIGNED (TREE_TYPE (rhs1))) != CODE_FOR_nothing)
4049     return false;
4050   /* Otherwise search for a mode we can use, starting from the narrowest
4051      integer mode available.  */
4052   else
4053     {
4054       mode = NARROWEST_INT_MODE;
4055       for (;;)
4056           {
4057             /* If we cannot do a signed conversion to float from mode
4058                or if the value-range does not fit in the signed type
4059                try with a wider mode.  */
4060             if (can_float_p (fltmode, mode, 0) != CODE_FOR_nothing
4061                 && range_fits_type_p (vr, GET_MODE_PRECISION (mode), SIGNED))
4062               break;
4063 
4064             /* But do not widen the input.  Instead leave that to the
4065                optabs expansion code.  */
4066             if (!GET_MODE_WIDER_MODE (mode).exists (&mode)
4067                 || GET_MODE_PRECISION (mode) > TYPE_PRECISION (TREE_TYPE (rhs1)))
4068               return false;
4069           }
4070     }
4071 
4072   /* It works, insert a truncation or sign-change before the
4073      float conversion.  */
4074   tem = make_ssa_name (build_nonstandard_integer_type
4075                                 (GET_MODE_PRECISION (mode), 0));
4076   conv = gimple_build_assign (tem, NOP_EXPR, rhs1);
4077   gsi_insert_before (gsi, conv, GSI_SAME_STMT);
4078   gimple_assign_set_rhs1 (stmt, tem);
4079   fold_stmt (gsi, follow_single_use_edges);
4080 
4081   return true;
4082 }
4083 
4084 /* Simplify an internal fn call using ranges if possible.  */
4085 
4086 bool
simplify_internal_call_using_ranges(gimple_stmt_iterator * gsi,gimple * stmt)4087 simplify_using_ranges::simplify_internal_call_using_ranges
4088                                                   (gimple_stmt_iterator *gsi,
4089                                                    gimple *stmt)
4090 {
4091   enum tree_code subcode;
4092   bool is_ubsan = false;
4093   bool ovf = false;
4094   switch (gimple_call_internal_fn (stmt))
4095     {
4096     case IFN_UBSAN_CHECK_ADD:
4097       subcode = PLUS_EXPR;
4098       is_ubsan = true;
4099       break;
4100     case IFN_UBSAN_CHECK_SUB:
4101       subcode = MINUS_EXPR;
4102       is_ubsan = true;
4103       break;
4104     case IFN_UBSAN_CHECK_MUL:
4105       subcode = MULT_EXPR;
4106       is_ubsan = true;
4107       break;
4108     case IFN_ADD_OVERFLOW:
4109       subcode = PLUS_EXPR;
4110       break;
4111     case IFN_SUB_OVERFLOW:
4112       subcode = MINUS_EXPR;
4113       break;
4114     case IFN_MUL_OVERFLOW:
4115       subcode = MULT_EXPR;
4116       break;
4117     default:
4118       return false;
4119     }
4120 
4121   tree op0 = gimple_call_arg (stmt, 0);
4122   tree op1 = gimple_call_arg (stmt, 1);
4123   tree type;
4124   if (is_ubsan)
4125     {
4126       type = TREE_TYPE (op0);
4127       if (VECTOR_TYPE_P (type))
4128           return false;
4129     }
4130   else if (gimple_call_lhs (stmt) == NULL_TREE)
4131     return false;
4132   else
4133     type = TREE_TYPE (TREE_TYPE (gimple_call_lhs (stmt)));
4134   if (!check_for_binary_op_overflow (query, subcode, type, op0, op1, &ovf, stmt)
4135       || (is_ubsan && ovf))
4136     return false;
4137 
4138   gimple *g;
4139   location_t loc = gimple_location (stmt);
4140   if (is_ubsan)
4141     g = gimple_build_assign (gimple_call_lhs (stmt), subcode, op0, op1);
4142   else
4143     {
4144       int prec = TYPE_PRECISION (type);
4145       tree utype = type;
4146       if (ovf
4147             || !useless_type_conversion_p (type, TREE_TYPE (op0))
4148             || !useless_type_conversion_p (type, TREE_TYPE (op1)))
4149           utype = build_nonstandard_integer_type (prec, 1);
4150       if (TREE_CODE (op0) == INTEGER_CST)
4151           op0 = fold_convert (utype, op0);
4152       else if (!useless_type_conversion_p (utype, TREE_TYPE (op0)))
4153           {
4154             g = gimple_build_assign (make_ssa_name (utype), NOP_EXPR, op0);
4155             gimple_set_location (g, loc);
4156             gsi_insert_before (gsi, g, GSI_SAME_STMT);
4157             op0 = gimple_assign_lhs (g);
4158           }
4159       if (TREE_CODE (op1) == INTEGER_CST)
4160           op1 = fold_convert (utype, op1);
4161       else if (!useless_type_conversion_p (utype, TREE_TYPE (op1)))
4162           {
4163             g = gimple_build_assign (make_ssa_name (utype), NOP_EXPR, op1);
4164             gimple_set_location (g, loc);
4165             gsi_insert_before (gsi, g, GSI_SAME_STMT);
4166             op1 = gimple_assign_lhs (g);
4167           }
4168       g = gimple_build_assign (make_ssa_name (utype), subcode, op0, op1);
4169       gimple_set_location (g, loc);
4170       gsi_insert_before (gsi, g, GSI_SAME_STMT);
4171       if (utype != type)
4172           {
4173             g = gimple_build_assign (make_ssa_name (type), NOP_EXPR,
4174                                            gimple_assign_lhs (g));
4175             gimple_set_location (g, loc);
4176             gsi_insert_before (gsi, g, GSI_SAME_STMT);
4177           }
4178       g = gimple_build_assign (gimple_call_lhs (stmt), COMPLEX_EXPR,
4179                                      gimple_assign_lhs (g),
4180                                      build_int_cst (type, ovf));
4181     }
4182   gimple_set_location (g, loc);
4183   gsi_replace (gsi, g, false);
4184   return true;
4185 }
4186 
4187 /* Return true if VAR is a two-valued variable.  Set a and b with the
4188    two-values when it is true.  Return false otherwise.  */
4189 
4190 bool
two_valued_val_range_p(tree var,tree * a,tree * b,gimple * s)4191 simplify_using_ranges::two_valued_val_range_p (tree var, tree *a, tree *b,
4192                                                          gimple *s)
4193 {
4194   value_range vr = *query->get_value_range (var, s);
4195   vr.normalize_symbolics ();
4196   if (vr.varying_p () || vr.undefined_p ())
4197     return false;
4198 
4199   if ((vr.num_pairs () == 1 && vr.upper_bound () - vr.lower_bound () == 1)
4200       || (vr.num_pairs () == 2
4201             && vr.lower_bound (0) == vr.upper_bound (0)
4202             && vr.lower_bound (1) == vr.upper_bound (1)))
4203     {
4204       *a = wide_int_to_tree (TREE_TYPE (var), vr.lower_bound ());
4205       *b = wide_int_to_tree (TREE_TYPE (var), vr.upper_bound ());
4206       return true;
4207     }
4208   return false;
4209 }
4210 
simplify_using_ranges(range_query * query,int not_executable_flag)4211 simplify_using_ranges::simplify_using_ranges (range_query *query,
4212                                                         int not_executable_flag)
4213   : query (query)
4214 {
4215   to_remove_edges = vNULL;
4216   to_update_switch_stmts = vNULL;
4217   m_not_executable_flag = not_executable_flag;
4218   m_flag_set_edges = vNULL;
4219 }
4220 
~simplify_using_ranges()4221 simplify_using_ranges::~simplify_using_ranges ()
4222 {
4223   cleanup_edges_and_switches ();
4224   m_flag_set_edges.release ();
4225 }
4226 
4227 /* Simplify STMT using ranges if possible.  */
4228 
4229 bool
simplify(gimple_stmt_iterator * gsi)4230 simplify_using_ranges::simplify (gimple_stmt_iterator *gsi)
4231 {
4232   gcc_checking_assert (query);
4233 
4234   gimple *stmt = gsi_stmt (*gsi);
4235   if (is_gimple_assign (stmt))
4236     {
4237       enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
4238       tree rhs1 = gimple_assign_rhs1 (stmt);
4239       tree rhs2 = gimple_assign_rhs2 (stmt);
4240       tree lhs = gimple_assign_lhs (stmt);
4241       tree val1 = NULL_TREE, val2 = NULL_TREE;
4242       use_operand_p use_p;
4243       gimple *use_stmt;
4244 
4245       /* Convert:
4246            LHS = CST BINOP VAR
4247            Where VAR is two-valued and LHS is used in GIMPLE_COND only
4248            To:
4249            LHS = VAR == VAL1 ? (CST BINOP VAL1) : (CST BINOP VAL2)
4250 
4251            Also handles:
4252            LHS = VAR BINOP CST
4253            Where VAR is two-valued and LHS is used in GIMPLE_COND only
4254            To:
4255            LHS = VAR == VAL1 ? (VAL1 BINOP CST) : (VAL2 BINOP CST) */
4256 
4257       if (TREE_CODE_CLASS (rhs_code) == tcc_binary
4258             && INTEGRAL_TYPE_P (TREE_TYPE (rhs1))
4259             && ((TREE_CODE (rhs1) == INTEGER_CST
4260                  && TREE_CODE (rhs2) == SSA_NAME)
4261                 || (TREE_CODE (rhs2) == INTEGER_CST
4262                       && TREE_CODE (rhs1) == SSA_NAME))
4263             && single_imm_use (lhs, &use_p, &use_stmt)
4264             && gimple_code (use_stmt) == GIMPLE_COND)
4265 
4266           {
4267             tree new_rhs1 = NULL_TREE;
4268             tree new_rhs2 = NULL_TREE;
4269             tree cmp_var = NULL_TREE;
4270 
4271             if (TREE_CODE (rhs2) == SSA_NAME
4272                 && two_valued_val_range_p (rhs2, &val1, &val2, stmt))
4273               {
4274                 /* Optimize RHS1 OP [VAL1, VAL2].  */
4275                 new_rhs1 = int_const_binop (rhs_code, rhs1, val1);
4276                 new_rhs2 = int_const_binop (rhs_code, rhs1, val2);
4277                 cmp_var = rhs2;
4278               }
4279             else if (TREE_CODE (rhs1) == SSA_NAME
4280                        && two_valued_val_range_p (rhs1, &val1, &val2, stmt))
4281               {
4282                 /* Optimize [VAL1, VAL2] OP RHS2.  */
4283                 new_rhs1 = int_const_binop (rhs_code, val1, rhs2);
4284                 new_rhs2 = int_const_binop (rhs_code, val2, rhs2);
4285                 cmp_var = rhs1;
4286               }
4287 
4288             /* If we could not find two-vals or the optimzation is invalid as
4289                in divide by zero, new_rhs1 / new_rhs will be NULL_TREE.  */
4290             if (new_rhs1 && new_rhs2)
4291               {
4292                 tree cond = build2 (EQ_EXPR, boolean_type_node, cmp_var, val1);
4293                 gimple_assign_set_rhs_with_ops (gsi,
4294                                                         COND_EXPR, cond,
4295                                                         new_rhs1,
4296                                                         new_rhs2);
4297                 update_stmt (gsi_stmt (*gsi));
4298                 fold_stmt (gsi, follow_single_use_edges);
4299                 return true;
4300               }
4301           }
4302 
4303       switch (rhs_code)
4304           {
4305           case EQ_EXPR:
4306           case NE_EXPR:
4307           /* Transform EQ_EXPR, NE_EXPR into BIT_XOR_EXPR or identity
4308                if the RHS is zero or one, and the LHS are known to be boolean
4309                values.  */
4310             if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
4311               return simplify_truth_ops_using_ranges (gsi, stmt);
4312             break;
4313 
4314       /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
4315            and BIT_AND_EXPR respectively if the first operand is greater
4316            than zero and the second operand is an exact power of two.
4317            Also optimize TRUNC_MOD_EXPR away if the second operand is
4318            constant and the first operand already has the right value
4319            range.  */
4320           case TRUNC_DIV_EXPR:
4321           case TRUNC_MOD_EXPR:
4322             if ((TREE_CODE (rhs1) == SSA_NAME
4323                  || TREE_CODE (rhs1) == INTEGER_CST)
4324                 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
4325               return simplify_div_or_mod_using_ranges (gsi, stmt);
4326             break;
4327 
4328       /* Transform ABS (X) into X or -X as appropriate.  */
4329           case ABS_EXPR:
4330             if (TREE_CODE (rhs1) == SSA_NAME
4331                 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
4332               return simplify_abs_using_ranges (gsi, stmt);
4333             break;
4334 
4335           case BIT_AND_EXPR:
4336           case BIT_IOR_EXPR:
4337             /* Optimize away BIT_AND_EXPR and BIT_IOR_EXPR
4338                if all the bits being cleared are already cleared or
4339                all the bits being set are already set.  */
4340             if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
4341               return simplify_bit_ops_using_ranges (gsi, stmt);
4342             break;
4343 
4344           CASE_CONVERT:
4345             if (TREE_CODE (rhs1) == SSA_NAME
4346                 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
4347               return simplify_conversion_using_ranges (gsi, stmt);
4348             break;
4349 
4350           case FLOAT_EXPR:
4351             if (TREE_CODE (rhs1) == SSA_NAME
4352                 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
4353               return simplify_float_conversion_using_ranges (gsi, stmt);
4354             break;
4355 
4356           case MIN_EXPR:
4357           case MAX_EXPR:
4358             return simplify_min_or_max_using_ranges (gsi, stmt);
4359 
4360           case RSHIFT_EXPR:
4361             {
4362               tree op0 = gimple_assign_rhs1 (stmt);
4363               tree type = TREE_TYPE (op0);
4364               int_range_max range;
4365               if (TYPE_SIGN (type) == SIGNED
4366                     && query->range_of_expr (range, op0, stmt))
4367                 {
4368                     unsigned prec = TYPE_PRECISION (TREE_TYPE (op0));
4369                     int_range<2> nzm1 (type, wi::minus_one (prec), wi::zero (prec),
4370                                            VR_ANTI_RANGE);
4371                     range.intersect (nzm1);
4372                     // If there are no ranges other than [-1, 0] remove the shift.
4373                     if (range.undefined_p ())
4374                       {
4375                         gimple_assign_set_rhs_from_tree (gsi, op0);
4376                         return true;
4377                       }
4378                     return false;
4379                 }
4380               break;
4381             }
4382           default:
4383             break;
4384           }
4385     }
4386   else if (gimple_code (stmt) == GIMPLE_COND)
4387     return simplify_cond_using_ranges_1 (as_a <gcond *> (stmt));
4388   else if (gimple_code (stmt) == GIMPLE_SWITCH)
4389     return simplify_switch_using_ranges (as_a <gswitch *> (stmt));
4390   else if (is_gimple_call (stmt)
4391              && gimple_call_internal_p (stmt))
4392     return simplify_internal_call_using_ranges (gsi, stmt);
4393 
4394   return false;
4395 }
4396 
4397 /* Set the lattice entry for VAR to VR.  */
4398 
4399 void
set_vr_value(tree var,value_range_equiv * vr)4400 vr_values::set_vr_value (tree var, value_range_equiv *vr)
4401 {
4402   if (SSA_NAME_VERSION (var) >= num_vr_values)
4403     return;
4404   vr_value[SSA_NAME_VERSION (var)] = vr;
4405 }
4406 
4407 /* Swap the lattice entry for VAR with VR and return the old entry.  */
4408 
4409 value_range_equiv *
swap_vr_value(tree var,value_range_equiv * vr)4410 vr_values::swap_vr_value (tree var, value_range_equiv *vr)
4411 {
4412   if (SSA_NAME_VERSION (var) >= num_vr_values)
4413     return NULL;
4414   std::swap (vr_value[SSA_NAME_VERSION (var)], vr);
4415   return vr;
4416 }
4417