OSDN Git Service

PR c++/49105
[pf3gnuchains/gcc-fork.git] / gcc / tree-vrp.c
1 /* Support routines for Value Range Propagation (VRP).
2    Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
3    Free Software Foundation, Inc.
4    Contributed by Diego Novillo <dnovillo@redhat.com>.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "ggc.h"
27 #include "flags.h"
28 #include "tree.h"
29 #include "basic-block.h"
30 #include "tree-flow.h"
31 #include "tree-pass.h"
32 #include "tree-dump.h"
33 #include "timevar.h"
34 #include "tree-pretty-print.h"
35 #include "gimple-pretty-print.h"
36 #include "diagnostic-core.h"
37 #include "intl.h"
38 #include "cfgloop.h"
39 #include "tree-scalar-evolution.h"
40 #include "tree-ssa-propagate.h"
41 #include "tree-chrec.h"
42 #include "gimple-fold.h"
43
44
45 /* Type of value ranges.  See value_range_d for a description of these
46    types.  */
47 enum value_range_type { VR_UNDEFINED, VR_RANGE, VR_ANTI_RANGE, VR_VARYING };
48
49 /* Range of values that can be associated with an SSA_NAME after VRP
50    has executed.  */
51 struct value_range_d
52 {
53   /* Lattice value represented by this range.  */
54   enum value_range_type type;
55
56   /* Minimum and maximum values represented by this range.  These
57      values should be interpreted as follows:
58
59         - If TYPE is VR_UNDEFINED or VR_VARYING then MIN and MAX must
60           be NULL.
61
62         - If TYPE == VR_RANGE then MIN holds the minimum value and
63           MAX holds the maximum value of the range [MIN, MAX].
64
65         - If TYPE == ANTI_RANGE the variable is known to NOT
66           take any values in the range [MIN, MAX].  */
67   tree min;
68   tree max;
69
70   /* Set of SSA names whose value ranges are equivalent to this one.
71      This set is only valid when TYPE is VR_RANGE or VR_ANTI_RANGE.  */
72   bitmap equiv;
73 };
74
75 typedef struct value_range_d value_range_t;
76
77 /* Set of SSA names found live during the RPO traversal of the function
78    for still active basic-blocks.  */
79 static sbitmap *live;
80
81 /* Return true if the SSA name NAME is live on the edge E.  */
82
83 static bool
84 live_on_edge (edge e, tree name)
85 {
86   return (live[e->dest->index]
87           && TEST_BIT (live[e->dest->index], SSA_NAME_VERSION (name)));
88 }
89
90 /* Local functions.  */
91 static int compare_values (tree val1, tree val2);
92 static int compare_values_warnv (tree val1, tree val2, bool *);
93 static void vrp_meet (value_range_t *, value_range_t *);
94 static tree vrp_evaluate_conditional_warnv_with_ops (enum tree_code,
95                                                      tree, tree, bool, bool *,
96                                                      bool *);
97
98 /* Location information for ASSERT_EXPRs.  Each instance of this
99    structure describes an ASSERT_EXPR for an SSA name.  Since a single
100    SSA name may have more than one assertion associated with it, these
101    locations are kept in a linked list attached to the corresponding
102    SSA name.  */
103 struct assert_locus_d
104 {
105   /* Basic block where the assertion would be inserted.  */
106   basic_block bb;
107
108   /* Some assertions need to be inserted on an edge (e.g., assertions
109      generated by COND_EXPRs).  In those cases, BB will be NULL.  */
110   edge e;
111
112   /* Pointer to the statement that generated this assertion.  */
113   gimple_stmt_iterator si;
114
115   /* Predicate code for the ASSERT_EXPR.  Must be COMPARISON_CLASS_P.  */
116   enum tree_code comp_code;
117
118   /* Value being compared against.  */
119   tree val;
120
121   /* Expression to compare.  */
122   tree expr;
123
124   /* Next node in the linked list.  */
125   struct assert_locus_d *next;
126 };
127
128 typedef struct assert_locus_d *assert_locus_t;
129
130 /* If bit I is present, it means that SSA name N_i has a list of
131    assertions that should be inserted in the IL.  */
132 static bitmap need_assert_for;
133
134 /* Array of locations lists where to insert assertions.  ASSERTS_FOR[I]
135    holds a list of ASSERT_LOCUS_T nodes that describe where
136    ASSERT_EXPRs for SSA name N_I should be inserted.  */
137 static assert_locus_t *asserts_for;
138
139 /* Value range array.  After propagation, VR_VALUE[I] holds the range
140    of values that SSA name N_I may take.  */
141 static value_range_t **vr_value;
142
143 /* For a PHI node which sets SSA name N_I, VR_COUNTS[I] holds the
144    number of executable edges we saw the last time we visited the
145    node.  */
146 static int *vr_phi_edge_counts;
147
148 typedef struct {
149   gimple stmt;
150   tree vec;
151 } switch_update;
152
153 static VEC (edge, heap) *to_remove_edges;
154 DEF_VEC_O(switch_update);
155 DEF_VEC_ALLOC_O(switch_update, heap);
156 static VEC (switch_update, heap) *to_update_switch_stmts;
157
158
159 /* Return the maximum value for TYPE.  */
160
161 static inline tree
162 vrp_val_max (const_tree type)
163 {
164   if (!INTEGRAL_TYPE_P (type))
165     return NULL_TREE;
166
167   return TYPE_MAX_VALUE (type);
168 }
169
170 /* Return the minimum value for TYPE.  */
171
172 static inline tree
173 vrp_val_min (const_tree type)
174 {
175   if (!INTEGRAL_TYPE_P (type))
176     return NULL_TREE;
177
178   return TYPE_MIN_VALUE (type);
179 }
180
181 /* Return whether VAL is equal to the maximum value of its type.  This
182    will be true for a positive overflow infinity.  We can't do a
183    simple equality comparison with TYPE_MAX_VALUE because C typedefs
184    and Ada subtypes can produce types whose TYPE_MAX_VALUE is not ==
185    to the integer constant with the same value in the type.  */
186
187 static inline bool
188 vrp_val_is_max (const_tree val)
189 {
190   tree type_max = vrp_val_max (TREE_TYPE (val));
191   return (val == type_max
192           || (type_max != NULL_TREE
193               && operand_equal_p (val, type_max, 0)));
194 }
195
196 /* Return whether VAL is equal to the minimum value of its type.  This
197    will be true for a negative overflow infinity.  */
198
199 static inline bool
200 vrp_val_is_min (const_tree val)
201 {
202   tree type_min = vrp_val_min (TREE_TYPE (val));
203   return (val == type_min
204           || (type_min != NULL_TREE
205               && operand_equal_p (val, type_min, 0)));
206 }
207
208
209 /* Return whether TYPE should use an overflow infinity distinct from
210    TYPE_{MIN,MAX}_VALUE.  We use an overflow infinity value to
211    represent a signed overflow during VRP computations.  An infinity
212    is distinct from a half-range, which will go from some number to
213    TYPE_{MIN,MAX}_VALUE.  */
214
215 static inline bool
216 needs_overflow_infinity (const_tree type)
217 {
218   return INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_WRAPS (type);
219 }
220
221 /* Return whether TYPE can support our overflow infinity
222    representation: we use the TREE_OVERFLOW flag, which only exists
223    for constants.  If TYPE doesn't support this, we don't optimize
224    cases which would require signed overflow--we drop them to
225    VARYING.  */
226
227 static inline bool
228 supports_overflow_infinity (const_tree type)
229 {
230   tree min = vrp_val_min (type), max = vrp_val_max (type);
231 #ifdef ENABLE_CHECKING
232   gcc_assert (needs_overflow_infinity (type));
233 #endif
234   return (min != NULL_TREE
235           && CONSTANT_CLASS_P (min)
236           && max != NULL_TREE
237           && CONSTANT_CLASS_P (max));
238 }
239
240 /* VAL is the maximum or minimum value of a type.  Return a
241    corresponding overflow infinity.  */
242
243 static inline tree
244 make_overflow_infinity (tree val)
245 {
246   gcc_checking_assert (val != NULL_TREE && CONSTANT_CLASS_P (val));
247   val = copy_node (val);
248   TREE_OVERFLOW (val) = 1;
249   return val;
250 }
251
252 /* Return a negative overflow infinity for TYPE.  */
253
254 static inline tree
255 negative_overflow_infinity (tree type)
256 {
257   gcc_checking_assert (supports_overflow_infinity (type));
258   return make_overflow_infinity (vrp_val_min (type));
259 }
260
261 /* Return a positive overflow infinity for TYPE.  */
262
263 static inline tree
264 positive_overflow_infinity (tree type)
265 {
266   gcc_checking_assert (supports_overflow_infinity (type));
267   return make_overflow_infinity (vrp_val_max (type));
268 }
269
270 /* Return whether VAL is a negative overflow infinity.  */
271
272 static inline bool
273 is_negative_overflow_infinity (const_tree val)
274 {
275   return (needs_overflow_infinity (TREE_TYPE (val))
276           && CONSTANT_CLASS_P (val)
277           && TREE_OVERFLOW (val)
278           && vrp_val_is_min (val));
279 }
280
281 /* Return whether VAL is a positive overflow infinity.  */
282
283 static inline bool
284 is_positive_overflow_infinity (const_tree val)
285 {
286   return (needs_overflow_infinity (TREE_TYPE (val))
287           && CONSTANT_CLASS_P (val)
288           && TREE_OVERFLOW (val)
289           && vrp_val_is_max (val));
290 }
291
292 /* Return whether VAL is a positive or negative overflow infinity.  */
293
294 static inline bool
295 is_overflow_infinity (const_tree val)
296 {
297   return (needs_overflow_infinity (TREE_TYPE (val))
298           && CONSTANT_CLASS_P (val)
299           && TREE_OVERFLOW (val)
300           && (vrp_val_is_min (val) || vrp_val_is_max (val)));
301 }
302
303 /* Return whether STMT has a constant rhs that is_overflow_infinity. */
304
305 static inline bool
306 stmt_overflow_infinity (gimple stmt)
307 {
308   if (is_gimple_assign (stmt)
309       && get_gimple_rhs_class (gimple_assign_rhs_code (stmt)) ==
310       GIMPLE_SINGLE_RHS)
311     return is_overflow_infinity (gimple_assign_rhs1 (stmt));
312   return false;
313 }
314
315 /* If VAL is now an overflow infinity, return VAL.  Otherwise, return
316    the same value with TREE_OVERFLOW clear.  This can be used to avoid
317    confusing a regular value with an overflow value.  */
318
319 static inline tree
320 avoid_overflow_infinity (tree val)
321 {
322   if (!is_overflow_infinity (val))
323     return val;
324
325   if (vrp_val_is_max (val))
326     return vrp_val_max (TREE_TYPE (val));
327   else
328     {
329       gcc_checking_assert (vrp_val_is_min (val));
330       return vrp_val_min (TREE_TYPE (val));
331     }
332 }
333
334
335 /* Return true if ARG is marked with the nonnull attribute in the
336    current function signature.  */
337
338 static bool
339 nonnull_arg_p (const_tree arg)
340 {
341   tree t, attrs, fntype;
342   unsigned HOST_WIDE_INT arg_num;
343
344   gcc_assert (TREE_CODE (arg) == PARM_DECL && POINTER_TYPE_P (TREE_TYPE (arg)));
345
346   /* The static chain decl is always non null.  */
347   if (arg == cfun->static_chain_decl)
348     return true;
349
350   fntype = TREE_TYPE (current_function_decl);
351   attrs = lookup_attribute ("nonnull", TYPE_ATTRIBUTES (fntype));
352
353   /* If "nonnull" wasn't specified, we know nothing about the argument.  */
354   if (attrs == NULL_TREE)
355     return false;
356
357   /* If "nonnull" applies to all the arguments, then ARG is non-null.  */
358   if (TREE_VALUE (attrs) == NULL_TREE)
359     return true;
360
361   /* Get the position number for ARG in the function signature.  */
362   for (arg_num = 1, t = DECL_ARGUMENTS (current_function_decl);
363        t;
364        t = DECL_CHAIN (t), arg_num++)
365     {
366       if (t == arg)
367         break;
368     }
369
370   gcc_assert (t == arg);
371
372   /* Now see if ARG_NUM is mentioned in the nonnull list.  */
373   for (t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
374     {
375       if (compare_tree_int (TREE_VALUE (t), arg_num) == 0)
376         return true;
377     }
378
379   return false;
380 }
381
382
383 /* Set value range VR to VR_VARYING.  */
384
385 static inline void
386 set_value_range_to_varying (value_range_t *vr)
387 {
388   vr->type = VR_VARYING;
389   vr->min = vr->max = NULL_TREE;
390   if (vr->equiv)
391     bitmap_clear (vr->equiv);
392 }
393
394
395 /* Set value range VR to {T, MIN, MAX, EQUIV}.  */
396
397 static void
398 set_value_range (value_range_t *vr, enum value_range_type t, tree min,
399                  tree max, bitmap equiv)
400 {
401 #if defined ENABLE_CHECKING
402   /* Check the validity of the range.  */
403   if (t == VR_RANGE || t == VR_ANTI_RANGE)
404     {
405       int cmp;
406
407       gcc_assert (min && max);
408
409       if (INTEGRAL_TYPE_P (TREE_TYPE (min)) && t == VR_ANTI_RANGE)
410         gcc_assert (!vrp_val_is_min (min) || !vrp_val_is_max (max));
411
412       cmp = compare_values (min, max);
413       gcc_assert (cmp == 0 || cmp == -1 || cmp == -2);
414
415       if (needs_overflow_infinity (TREE_TYPE (min)))
416         gcc_assert (!is_overflow_infinity (min)
417                     || !is_overflow_infinity (max));
418     }
419
420   if (t == VR_UNDEFINED || t == VR_VARYING)
421     gcc_assert (min == NULL_TREE && max == NULL_TREE);
422
423   if (t == VR_UNDEFINED || t == VR_VARYING)
424     gcc_assert (equiv == NULL || bitmap_empty_p (equiv));
425 #endif
426
427   vr->type = t;
428   vr->min = min;
429   vr->max = max;
430
431   /* Since updating the equivalence set involves deep copying the
432      bitmaps, only do it if absolutely necessary.  */
433   if (vr->equiv == NULL
434       && equiv != NULL)
435     vr->equiv = BITMAP_ALLOC (NULL);
436
437   if (equiv != vr->equiv)
438     {
439       if (equiv && !bitmap_empty_p (equiv))
440         bitmap_copy (vr->equiv, equiv);
441       else
442         bitmap_clear (vr->equiv);
443     }
444 }
445
446
447 /* Set value range VR to the canonical form of {T, MIN, MAX, EQUIV}.
448    This means adjusting T, MIN and MAX representing the case of a
449    wrapping range with MAX < MIN covering [MIN, type_max] U [type_min, MAX]
450    as anti-rage ~[MAX+1, MIN-1].  Likewise for wrapping anti-ranges.
451    In corner cases where MAX+1 or MIN-1 wraps this will fall back
452    to varying.
453    This routine exists to ease canonicalization in the case where we
454    extract ranges from var + CST op limit.  */
455
456 static void
457 set_and_canonicalize_value_range (value_range_t *vr, enum value_range_type t,
458                                   tree min, tree max, bitmap equiv)
459 {
460   /* Nothing to canonicalize for symbolic or unknown or varying ranges.  */
461   if ((t != VR_RANGE
462        && t != VR_ANTI_RANGE)
463       || TREE_CODE (min) != INTEGER_CST
464       || TREE_CODE (max) != INTEGER_CST)
465     {
466       set_value_range (vr, t, min, max, equiv);
467       return;
468     }
469
470   /* Wrong order for min and max, to swap them and the VR type we need
471      to adjust them.  */
472   if (tree_int_cst_lt (max, min))
473     {
474       tree one = build_int_cst (TREE_TYPE (min), 1);
475       tree tmp = int_const_binop (PLUS_EXPR, max, one);
476       max = int_const_binop (MINUS_EXPR, min, one);
477       min = tmp;
478
479       /* There's one corner case, if we had [C+1, C] before we now have
480          that again.  But this represents an empty value range, so drop
481          to varying in this case.  */
482       if (tree_int_cst_lt (max, min))
483         {
484           set_value_range_to_varying (vr);
485           return;
486         }
487
488       t = t == VR_RANGE ? VR_ANTI_RANGE : VR_RANGE;
489     }
490
491   /* Anti-ranges that can be represented as ranges should be so.  */
492   if (t == VR_ANTI_RANGE)
493     {
494       bool is_min = vrp_val_is_min (min);
495       bool is_max = vrp_val_is_max (max);
496
497       if (is_min && is_max)
498         {
499           /* We cannot deal with empty ranges, drop to varying.  */
500           set_value_range_to_varying (vr);
501           return;
502         }
503       else if (is_min
504                /* As a special exception preserve non-null ranges.  */
505                && !(TYPE_UNSIGNED (TREE_TYPE (min))
506                     && integer_zerop (max)))
507         {
508           tree one = build_int_cst (TREE_TYPE (max), 1);
509           min = int_const_binop (PLUS_EXPR, max, one);
510           max = vrp_val_max (TREE_TYPE (max));
511           t = VR_RANGE;
512         }
513       else if (is_max)
514         {
515           tree one = build_int_cst (TREE_TYPE (min), 1);
516           max = int_const_binop (MINUS_EXPR, min, one);
517           min = vrp_val_min (TREE_TYPE (min));
518           t = VR_RANGE;
519         }
520     }
521
522   set_value_range (vr, t, min, max, equiv);
523 }
524
525 /* Copy value range FROM into value range TO.  */
526
527 static inline void
528 copy_value_range (value_range_t *to, value_range_t *from)
529 {
530   set_value_range (to, from->type, from->min, from->max, from->equiv);
531 }
532
533 /* Set value range VR to a single value.  This function is only called
534    with values we get from statements, and exists to clear the
535    TREE_OVERFLOW flag so that we don't think we have an overflow
536    infinity when we shouldn't.  */
537
538 static inline void
539 set_value_range_to_value (value_range_t *vr, tree val, bitmap equiv)
540 {
541   gcc_assert (is_gimple_min_invariant (val));
542   val = avoid_overflow_infinity (val);
543   set_value_range (vr, VR_RANGE, val, val, equiv);
544 }
545
546 /* Set value range VR to a non-negative range of type TYPE.
547    OVERFLOW_INFINITY indicates whether to use an overflow infinity
548    rather than TYPE_MAX_VALUE; this should be true if we determine
549    that the range is nonnegative based on the assumption that signed
550    overflow does not occur.  */
551
552 static inline void
553 set_value_range_to_nonnegative (value_range_t *vr, tree type,
554                                 bool overflow_infinity)
555 {
556   tree zero;
557
558   if (overflow_infinity && !supports_overflow_infinity (type))
559     {
560       set_value_range_to_varying (vr);
561       return;
562     }
563
564   zero = build_int_cst (type, 0);
565   set_value_range (vr, VR_RANGE, zero,
566                    (overflow_infinity
567                     ? positive_overflow_infinity (type)
568                     : TYPE_MAX_VALUE (type)),
569                    vr->equiv);
570 }
571
572 /* Set value range VR to a non-NULL range of type TYPE.  */
573
574 static inline void
575 set_value_range_to_nonnull (value_range_t *vr, tree type)
576 {
577   tree zero = build_int_cst (type, 0);
578   set_value_range (vr, VR_ANTI_RANGE, zero, zero, vr->equiv);
579 }
580
581
582 /* Set value range VR to a NULL range of type TYPE.  */
583
584 static inline void
585 set_value_range_to_null (value_range_t *vr, tree type)
586 {
587   set_value_range_to_value (vr, build_int_cst (type, 0), vr->equiv);
588 }
589
590
591 /* Set value range VR to a range of a truthvalue of type TYPE.  */
592
593 static inline void
594 set_value_range_to_truthvalue (value_range_t *vr, tree type)
595 {
596   if (TYPE_PRECISION (type) == 1)
597     set_value_range_to_varying (vr);
598   else
599     set_value_range (vr, VR_RANGE,
600                      build_int_cst (type, 0), build_int_cst (type, 1),
601                      vr->equiv);
602 }
603
604
605 /* Set value range VR to VR_UNDEFINED.  */
606
607 static inline void
608 set_value_range_to_undefined (value_range_t *vr)
609 {
610   vr->type = VR_UNDEFINED;
611   vr->min = vr->max = NULL_TREE;
612   if (vr->equiv)
613     bitmap_clear (vr->equiv);
614 }
615
616
617 /* If abs (min) < abs (max), set VR to [-max, max], if
618    abs (min) >= abs (max), set VR to [-min, min].  */
619
620 static void
621 abs_extent_range (value_range_t *vr, tree min, tree max)
622 {
623   int cmp;
624
625   gcc_assert (TREE_CODE (min) == INTEGER_CST);
626   gcc_assert (TREE_CODE (max) == INTEGER_CST);
627   gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (min)));
628   gcc_assert (!TYPE_UNSIGNED (TREE_TYPE (min)));
629   min = fold_unary (ABS_EXPR, TREE_TYPE (min), min);
630   max = fold_unary (ABS_EXPR, TREE_TYPE (max), max);
631   if (TREE_OVERFLOW (min) || TREE_OVERFLOW (max))
632     {
633       set_value_range_to_varying (vr);
634       return;
635     }
636   cmp = compare_values (min, max);
637   if (cmp == -1)
638     min = fold_unary (NEGATE_EXPR, TREE_TYPE (min), max);
639   else if (cmp == 0 || cmp == 1)
640     {
641       max = min;
642       min = fold_unary (NEGATE_EXPR, TREE_TYPE (min), min);
643     }
644   else
645     {
646       set_value_range_to_varying (vr);
647       return;
648     }
649   set_and_canonicalize_value_range (vr, VR_RANGE, min, max, NULL);
650 }
651
652
653 /* Return value range information for VAR.
654
655    If we have no values ranges recorded (ie, VRP is not running), then
656    return NULL.  Otherwise create an empty range if none existed for VAR.  */
657
658 static value_range_t *
659 get_value_range (const_tree var)
660 {
661   value_range_t *vr;
662   tree sym;
663   unsigned ver = SSA_NAME_VERSION (var);
664
665   /* If we have no recorded ranges, then return NULL.  */
666   if (! vr_value)
667     return NULL;
668
669   vr = vr_value[ver];
670   if (vr)
671     return vr;
672
673   /* Create a default value range.  */
674   vr_value[ver] = vr = XCNEW (value_range_t);
675
676   /* Defer allocating the equivalence set.  */
677   vr->equiv = NULL;
678
679   /* If VAR is a default definition, the variable can take any value
680      in VAR's type.  */
681   sym = SSA_NAME_VAR (var);
682   if (SSA_NAME_IS_DEFAULT_DEF (var))
683     {
684       /* Try to use the "nonnull" attribute to create ~[0, 0]
685          anti-ranges for pointers.  Note that this is only valid with
686          default definitions of PARM_DECLs.  */
687       if (TREE_CODE (sym) == PARM_DECL
688           && POINTER_TYPE_P (TREE_TYPE (sym))
689           && nonnull_arg_p (sym))
690         set_value_range_to_nonnull (vr, TREE_TYPE (sym));
691       else
692         set_value_range_to_varying (vr);
693     }
694
695   return vr;
696 }
697
698 /* Return true, if VAL1 and VAL2 are equal values for VRP purposes.  */
699
700 static inline bool
701 vrp_operand_equal_p (const_tree val1, const_tree val2)
702 {
703   if (val1 == val2)
704     return true;
705   if (!val1 || !val2 || !operand_equal_p (val1, val2, 0))
706     return false;
707   if (is_overflow_infinity (val1))
708     return is_overflow_infinity (val2);
709   return true;
710 }
711
712 /* Return true, if the bitmaps B1 and B2 are equal.  */
713
714 static inline bool
715 vrp_bitmap_equal_p (const_bitmap b1, const_bitmap b2)
716 {
717   return (b1 == b2
718           || ((!b1 || bitmap_empty_p (b1))
719               && (!b2 || bitmap_empty_p (b2)))
720           || (b1 && b2
721               && bitmap_equal_p (b1, b2)));
722 }
723
724 /* Update the value range and equivalence set for variable VAR to
725    NEW_VR.  Return true if NEW_VR is different from VAR's previous
726    value.
727
728    NOTE: This function assumes that NEW_VR is a temporary value range
729    object created for the sole purpose of updating VAR's range.  The
730    storage used by the equivalence set from NEW_VR will be freed by
731    this function.  Do not call update_value_range when NEW_VR
732    is the range object associated with another SSA name.  */
733
734 static inline bool
735 update_value_range (const_tree var, value_range_t *new_vr)
736 {
737   value_range_t *old_vr;
738   bool is_new;
739
740   /* Update the value range, if necessary.  */
741   old_vr = get_value_range (var);
742   is_new = old_vr->type != new_vr->type
743            || !vrp_operand_equal_p (old_vr->min, new_vr->min)
744            || !vrp_operand_equal_p (old_vr->max, new_vr->max)
745            || !vrp_bitmap_equal_p (old_vr->equiv, new_vr->equiv);
746
747   if (is_new)
748     set_value_range (old_vr, new_vr->type, new_vr->min, new_vr->max,
749                      new_vr->equiv);
750
751   BITMAP_FREE (new_vr->equiv);
752
753   return is_new;
754 }
755
756
757 /* Add VAR and VAR's equivalence set to EQUIV.  This is the central
758    point where equivalence processing can be turned on/off.  */
759
760 static void
761 add_equivalence (bitmap *equiv, const_tree var)
762 {
763   unsigned ver = SSA_NAME_VERSION (var);
764   value_range_t *vr = vr_value[ver];
765
766   if (*equiv == NULL)
767     *equiv = BITMAP_ALLOC (NULL);
768   bitmap_set_bit (*equiv, ver);
769   if (vr && vr->equiv)
770     bitmap_ior_into (*equiv, vr->equiv);
771 }
772
773
774 /* Return true if VR is ~[0, 0].  */
775
776 static inline bool
777 range_is_nonnull (value_range_t *vr)
778 {
779   return vr->type == VR_ANTI_RANGE
780          && integer_zerop (vr->min)
781          && integer_zerop (vr->max);
782 }
783
784
785 /* Return true if VR is [0, 0].  */
786
787 static inline bool
788 range_is_null (value_range_t *vr)
789 {
790   return vr->type == VR_RANGE
791          && integer_zerop (vr->min)
792          && integer_zerop (vr->max);
793 }
794
795 /* Return true if max and min of VR are INTEGER_CST.  It's not necessary
796    a singleton.  */
797
798 static inline bool
799 range_int_cst_p (value_range_t *vr)
800 {
801   return (vr->type == VR_RANGE
802           && TREE_CODE (vr->max) == INTEGER_CST
803           && TREE_CODE (vr->min) == INTEGER_CST
804           && !TREE_OVERFLOW (vr->max)
805           && !TREE_OVERFLOW (vr->min));
806 }
807
808 /* Return true if VR is a INTEGER_CST singleton.  */
809
810 static inline bool
811 range_int_cst_singleton_p (value_range_t *vr)
812 {
813   return (range_int_cst_p (vr)
814           && tree_int_cst_equal (vr->min, vr->max));
815 }
816
817 /* Return true if value range VR involves at least one symbol.  */
818
819 static inline bool
820 symbolic_range_p (value_range_t *vr)
821 {
822   return (!is_gimple_min_invariant (vr->min)
823           || !is_gimple_min_invariant (vr->max));
824 }
825
826 /* Return true if value range VR uses an overflow infinity.  */
827
828 static inline bool
829 overflow_infinity_range_p (value_range_t *vr)
830 {
831   return (vr->type == VR_RANGE
832           && (is_overflow_infinity (vr->min)
833               || is_overflow_infinity (vr->max)));
834 }
835
836 /* Return false if we can not make a valid comparison based on VR;
837    this will be the case if it uses an overflow infinity and overflow
838    is not undefined (i.e., -fno-strict-overflow is in effect).
839    Otherwise return true, and set *STRICT_OVERFLOW_P to true if VR
840    uses an overflow infinity.  */
841
842 static bool
843 usable_range_p (value_range_t *vr, bool *strict_overflow_p)
844 {
845   gcc_assert (vr->type == VR_RANGE);
846   if (is_overflow_infinity (vr->min))
847     {
848       *strict_overflow_p = true;
849       if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (vr->min)))
850         return false;
851     }
852   if (is_overflow_infinity (vr->max))
853     {
854       *strict_overflow_p = true;
855       if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (vr->max)))
856         return false;
857     }
858   return true;
859 }
860
861
862 /* Like tree_expr_nonnegative_warnv_p, but this function uses value
863    ranges obtained so far.  */
864
865 static bool
866 vrp_expr_computes_nonnegative (tree expr, bool *strict_overflow_p)
867 {
868   return (tree_expr_nonnegative_warnv_p (expr, strict_overflow_p)
869           || (TREE_CODE (expr) == SSA_NAME
870               && ssa_name_nonnegative_p (expr)));
871 }
872
873 /* Return true if the result of assignment STMT is know to be non-negative.
874    If the return value is based on the assumption that signed overflow is
875    undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
876    *STRICT_OVERFLOW_P.*/
877
878 static bool
879 gimple_assign_nonnegative_warnv_p (gimple stmt, bool *strict_overflow_p)
880 {
881   enum tree_code code = gimple_assign_rhs_code (stmt);
882   switch (get_gimple_rhs_class (code))
883     {
884     case GIMPLE_UNARY_RHS:
885       return tree_unary_nonnegative_warnv_p (gimple_assign_rhs_code (stmt),
886                                              gimple_expr_type (stmt),
887                                              gimple_assign_rhs1 (stmt),
888                                              strict_overflow_p);
889     case GIMPLE_BINARY_RHS:
890       return tree_binary_nonnegative_warnv_p (gimple_assign_rhs_code (stmt),
891                                               gimple_expr_type (stmt),
892                                               gimple_assign_rhs1 (stmt),
893                                               gimple_assign_rhs2 (stmt),
894                                               strict_overflow_p);
895     case GIMPLE_TERNARY_RHS:
896       return false;
897     case GIMPLE_SINGLE_RHS:
898       return tree_single_nonnegative_warnv_p (gimple_assign_rhs1 (stmt),
899                                               strict_overflow_p);
900     case GIMPLE_INVALID_RHS:
901       gcc_unreachable ();
902     default:
903       gcc_unreachable ();
904     }
905 }
906
907 /* Return true if return value of call STMT is know to be non-negative.
908    If the return value is based on the assumption that signed overflow is
909    undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
910    *STRICT_OVERFLOW_P.*/
911
912 static bool
913 gimple_call_nonnegative_warnv_p (gimple stmt, bool *strict_overflow_p)
914 {
915   tree arg0 = gimple_call_num_args (stmt) > 0 ?
916     gimple_call_arg (stmt, 0) : NULL_TREE;
917   tree arg1 = gimple_call_num_args (stmt) > 1 ?
918     gimple_call_arg (stmt, 1) : NULL_TREE;
919
920   return tree_call_nonnegative_warnv_p (gimple_expr_type (stmt),
921                                         gimple_call_fndecl (stmt),
922                                         arg0,
923                                         arg1,
924                                         strict_overflow_p);
925 }
926
927 /* Return true if STMT is know to to compute a non-negative value.
928    If the return value is based on the assumption that signed overflow is
929    undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
930    *STRICT_OVERFLOW_P.*/
931
932 static bool
933 gimple_stmt_nonnegative_warnv_p (gimple stmt, bool *strict_overflow_p)
934 {
935   switch (gimple_code (stmt))
936     {
937     case GIMPLE_ASSIGN:
938       return gimple_assign_nonnegative_warnv_p (stmt, strict_overflow_p);
939     case GIMPLE_CALL:
940       return gimple_call_nonnegative_warnv_p (stmt, strict_overflow_p);
941     default:
942       gcc_unreachable ();
943     }
944 }
945
946 /* Return true if the result of assignment STMT is know to be non-zero.
947    If the return value is based on the assumption that signed overflow is
948    undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
949    *STRICT_OVERFLOW_P.*/
950
951 static bool
952 gimple_assign_nonzero_warnv_p (gimple stmt, bool *strict_overflow_p)
953 {
954   enum tree_code code = gimple_assign_rhs_code (stmt);
955   switch (get_gimple_rhs_class (code))
956     {
957     case GIMPLE_UNARY_RHS:
958       return tree_unary_nonzero_warnv_p (gimple_assign_rhs_code (stmt),
959                                          gimple_expr_type (stmt),
960                                          gimple_assign_rhs1 (stmt),
961                                          strict_overflow_p);
962     case GIMPLE_BINARY_RHS:
963       return tree_binary_nonzero_warnv_p (gimple_assign_rhs_code (stmt),
964                                           gimple_expr_type (stmt),
965                                           gimple_assign_rhs1 (stmt),
966                                           gimple_assign_rhs2 (stmt),
967                                           strict_overflow_p);
968     case GIMPLE_TERNARY_RHS:
969       return false;
970     case GIMPLE_SINGLE_RHS:
971       return tree_single_nonzero_warnv_p (gimple_assign_rhs1 (stmt),
972                                           strict_overflow_p);
973     case GIMPLE_INVALID_RHS:
974       gcc_unreachable ();
975     default:
976       gcc_unreachable ();
977     }
978 }
979
980 /* Return true if STMT is know to to compute a non-zero value.
981    If the return value is based on the assumption that signed overflow is
982    undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
983    *STRICT_OVERFLOW_P.*/
984
985 static bool
986 gimple_stmt_nonzero_warnv_p (gimple stmt, bool *strict_overflow_p)
987 {
988   switch (gimple_code (stmt))
989     {
990     case GIMPLE_ASSIGN:
991       return gimple_assign_nonzero_warnv_p (stmt, strict_overflow_p);
992     case GIMPLE_CALL:
993       return gimple_alloca_call_p (stmt);
994     default:
995       gcc_unreachable ();
996     }
997 }
998
999 /* Like tree_expr_nonzero_warnv_p, but this function uses value ranges
1000    obtained so far.  */
1001
1002 static bool
1003 vrp_stmt_computes_nonzero (gimple stmt, bool *strict_overflow_p)
1004 {
1005   if (gimple_stmt_nonzero_warnv_p (stmt, strict_overflow_p))
1006     return true;
1007
1008   /* If we have an expression of the form &X->a, then the expression
1009      is nonnull if X is nonnull.  */
1010   if (is_gimple_assign (stmt)
1011       && gimple_assign_rhs_code (stmt) == ADDR_EXPR)
1012     {
1013       tree expr = gimple_assign_rhs1 (stmt);
1014       tree base = get_base_address (TREE_OPERAND (expr, 0));
1015
1016       if (base != NULL_TREE
1017           && TREE_CODE (base) == MEM_REF
1018           && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
1019         {
1020           value_range_t *vr = get_value_range (TREE_OPERAND (base, 0));
1021           if (range_is_nonnull (vr))
1022             return true;
1023         }
1024     }
1025
1026   return false;
1027 }
1028
1029 /* Returns true if EXPR is a valid value (as expected by compare_values) --
1030    a gimple invariant, or SSA_NAME +- CST.  */
1031
1032 static bool
1033 valid_value_p (tree expr)
1034 {
1035   if (TREE_CODE (expr) == SSA_NAME)
1036     return true;
1037
1038   if (TREE_CODE (expr) == PLUS_EXPR
1039       || TREE_CODE (expr) == MINUS_EXPR)
1040     return (TREE_CODE (TREE_OPERAND (expr, 0)) == SSA_NAME
1041             && TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST);
1042
1043   return is_gimple_min_invariant (expr);
1044 }
1045
1046 /* Return
1047    1 if VAL < VAL2
1048    0 if !(VAL < VAL2)
1049    -2 if those are incomparable.  */
1050 static inline int
1051 operand_less_p (tree val, tree val2)
1052 {
1053   /* LT is folded faster than GE and others.  Inline the common case.  */
1054   if (TREE_CODE (val) == INTEGER_CST && TREE_CODE (val2) == INTEGER_CST)
1055     {
1056       if (TYPE_UNSIGNED (TREE_TYPE (val)))
1057         return INT_CST_LT_UNSIGNED (val, val2);
1058       else
1059         {
1060           if (INT_CST_LT (val, val2))
1061             return 1;
1062         }
1063     }
1064   else
1065     {
1066       tree tcmp;
1067
1068       fold_defer_overflow_warnings ();
1069
1070       tcmp = fold_binary_to_constant (LT_EXPR, boolean_type_node, val, val2);
1071
1072       fold_undefer_and_ignore_overflow_warnings ();
1073
1074       if (!tcmp
1075           || TREE_CODE (tcmp) != INTEGER_CST)
1076         return -2;
1077
1078       if (!integer_zerop (tcmp))
1079         return 1;
1080     }
1081
1082   /* val >= val2, not considering overflow infinity.  */
1083   if (is_negative_overflow_infinity (val))
1084     return is_negative_overflow_infinity (val2) ? 0 : 1;
1085   else if (is_positive_overflow_infinity (val2))
1086     return is_positive_overflow_infinity (val) ? 0 : 1;
1087
1088   return 0;
1089 }
1090
1091 /* Compare two values VAL1 and VAL2.  Return
1092
1093         -2 if VAL1 and VAL2 cannot be compared at compile-time,
1094         -1 if VAL1 < VAL2,
1095          0 if VAL1 == VAL2,
1096         +1 if VAL1 > VAL2, and
1097         +2 if VAL1 != VAL2
1098
1099    This is similar to tree_int_cst_compare but supports pointer values
1100    and values that cannot be compared at compile time.
1101
1102    If STRICT_OVERFLOW_P is not NULL, then set *STRICT_OVERFLOW_P to
1103    true if the return value is only valid if we assume that signed
1104    overflow is undefined.  */
1105
1106 static int
1107 compare_values_warnv (tree val1, tree val2, bool *strict_overflow_p)
1108 {
1109   if (val1 == val2)
1110     return 0;
1111
1112   /* Below we rely on the fact that VAL1 and VAL2 are both pointers or
1113      both integers.  */
1114   gcc_assert (POINTER_TYPE_P (TREE_TYPE (val1))
1115               == POINTER_TYPE_P (TREE_TYPE (val2)));
1116   /* Convert the two values into the same type.  This is needed because
1117      sizetype causes sign extension even for unsigned types.  */
1118   val2 = fold_convert (TREE_TYPE (val1), val2);
1119   STRIP_USELESS_TYPE_CONVERSION (val2);
1120
1121   if ((TREE_CODE (val1) == SSA_NAME
1122        || TREE_CODE (val1) == PLUS_EXPR
1123        || TREE_CODE (val1) == MINUS_EXPR)
1124       && (TREE_CODE (val2) == SSA_NAME
1125           || TREE_CODE (val2) == PLUS_EXPR
1126           || TREE_CODE (val2) == MINUS_EXPR))
1127     {
1128       tree n1, c1, n2, c2;
1129       enum tree_code code1, code2;
1130
1131       /* If VAL1 and VAL2 are of the form 'NAME [+-] CST' or 'NAME',
1132          return -1 or +1 accordingly.  If VAL1 and VAL2 don't use the
1133          same name, return -2.  */
1134       if (TREE_CODE (val1) == SSA_NAME)
1135         {
1136           code1 = SSA_NAME;
1137           n1 = val1;
1138           c1 = NULL_TREE;
1139         }
1140       else
1141         {
1142           code1 = TREE_CODE (val1);
1143           n1 = TREE_OPERAND (val1, 0);
1144           c1 = TREE_OPERAND (val1, 1);
1145           if (tree_int_cst_sgn (c1) == -1)
1146             {
1147               if (is_negative_overflow_infinity (c1))
1148                 return -2;
1149               c1 = fold_unary_to_constant (NEGATE_EXPR, TREE_TYPE (c1), c1);
1150               if (!c1)
1151                 return -2;
1152               code1 = code1 == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR;
1153             }
1154         }
1155
1156       if (TREE_CODE (val2) == SSA_NAME)
1157         {
1158           code2 = SSA_NAME;
1159           n2 = val2;
1160           c2 = NULL_TREE;
1161         }
1162       else
1163         {
1164           code2 = TREE_CODE (val2);
1165           n2 = TREE_OPERAND (val2, 0);
1166           c2 = TREE_OPERAND (val2, 1);
1167           if (tree_int_cst_sgn (c2) == -1)
1168             {
1169               if (is_negative_overflow_infinity (c2))
1170                 return -2;
1171               c2 = fold_unary_to_constant (NEGATE_EXPR, TREE_TYPE (c2), c2);
1172               if (!c2)
1173                 return -2;
1174               code2 = code2 == MINUS_EXPR ? PLUS_EXPR : MINUS_EXPR;
1175             }
1176         }
1177
1178       /* Both values must use the same name.  */
1179       if (n1 != n2)
1180         return -2;
1181
1182       if (code1 == SSA_NAME
1183           && code2 == SSA_NAME)
1184         /* NAME == NAME  */
1185         return 0;
1186
1187       /* If overflow is defined we cannot simplify more.  */
1188       if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (val1)))
1189         return -2;
1190
1191       if (strict_overflow_p != NULL
1192           && (code1 == SSA_NAME || !TREE_NO_WARNING (val1))
1193           && (code2 == SSA_NAME || !TREE_NO_WARNING (val2)))
1194         *strict_overflow_p = true;
1195
1196       if (code1 == SSA_NAME)
1197         {
1198           if (code2 == PLUS_EXPR)
1199             /* NAME < NAME + CST  */
1200             return -1;
1201           else if (code2 == MINUS_EXPR)
1202             /* NAME > NAME - CST  */
1203             return 1;
1204         }
1205       else if (code1 == PLUS_EXPR)
1206         {
1207           if (code2 == SSA_NAME)
1208             /* NAME + CST > NAME  */
1209             return 1;
1210           else if (code2 == PLUS_EXPR)
1211             /* NAME + CST1 > NAME + CST2, if CST1 > CST2  */
1212             return compare_values_warnv (c1, c2, strict_overflow_p);
1213           else if (code2 == MINUS_EXPR)
1214             /* NAME + CST1 > NAME - CST2  */
1215             return 1;
1216         }
1217       else if (code1 == MINUS_EXPR)
1218         {
1219           if (code2 == SSA_NAME)
1220             /* NAME - CST < NAME  */
1221             return -1;
1222           else if (code2 == PLUS_EXPR)
1223             /* NAME - CST1 < NAME + CST2  */
1224             return -1;
1225           else if (code2 == MINUS_EXPR)
1226             /* NAME - CST1 > NAME - CST2, if CST1 < CST2.  Notice that
1227                C1 and C2 are swapped in the call to compare_values.  */
1228             return compare_values_warnv (c2, c1, strict_overflow_p);
1229         }
1230
1231       gcc_unreachable ();
1232     }
1233
1234   /* We cannot compare non-constants.  */
1235   if (!is_gimple_min_invariant (val1) || !is_gimple_min_invariant (val2))
1236     return -2;
1237
1238   if (!POINTER_TYPE_P (TREE_TYPE (val1)))
1239     {
1240       /* We cannot compare overflowed values, except for overflow
1241          infinities.  */
1242       if (TREE_OVERFLOW (val1) || TREE_OVERFLOW (val2))
1243         {
1244           if (strict_overflow_p != NULL)
1245             *strict_overflow_p = true;
1246           if (is_negative_overflow_infinity (val1))
1247             return is_negative_overflow_infinity (val2) ? 0 : -1;
1248           else if (is_negative_overflow_infinity (val2))
1249             return 1;
1250           else if (is_positive_overflow_infinity (val1))
1251             return is_positive_overflow_infinity (val2) ? 0 : 1;
1252           else if (is_positive_overflow_infinity (val2))
1253             return -1;
1254           return -2;
1255         }
1256
1257       return tree_int_cst_compare (val1, val2);
1258     }
1259   else
1260     {
1261       tree t;
1262
1263       /* First see if VAL1 and VAL2 are not the same.  */
1264       if (val1 == val2 || operand_equal_p (val1, val2, 0))
1265         return 0;
1266
1267       /* If VAL1 is a lower address than VAL2, return -1.  */
1268       if (operand_less_p (val1, val2) == 1)
1269         return -1;
1270
1271       /* If VAL1 is a higher address than VAL2, return +1.  */
1272       if (operand_less_p (val2, val1) == 1)
1273         return 1;
1274
1275       /* If VAL1 is different than VAL2, return +2.
1276          For integer constants we either have already returned -1 or 1
1277          or they are equivalent.  We still might succeed in proving
1278          something about non-trivial operands.  */
1279       if (TREE_CODE (val1) != INTEGER_CST
1280           || TREE_CODE (val2) != INTEGER_CST)
1281         {
1282           t = fold_binary_to_constant (NE_EXPR, boolean_type_node, val1, val2);
1283           if (t && integer_onep (t))
1284             return 2;
1285         }
1286
1287       return -2;
1288     }
1289 }
1290
1291 /* Compare values like compare_values_warnv, but treat comparisons of
1292    nonconstants which rely on undefined overflow as incomparable.  */
1293
1294 static int
1295 compare_values (tree val1, tree val2)
1296 {
1297   bool sop;
1298   int ret;
1299
1300   sop = false;
1301   ret = compare_values_warnv (val1, val2, &sop);
1302   if (sop
1303       && (!is_gimple_min_invariant (val1) || !is_gimple_min_invariant (val2)))
1304     ret = -2;
1305   return ret;
1306 }
1307
1308
1309 /* Return 1 if VAL is inside value range VR (VR->MIN <= VAL <= VR->MAX),
1310           0 if VAL is not inside VR,
1311          -2 if we cannot tell either way.
1312
1313    FIXME, the current semantics of this functions are a bit quirky
1314           when taken in the context of VRP.  In here we do not care
1315           about VR's type.  If VR is the anti-range ~[3, 5] the call
1316           value_inside_range (4, VR) will return 1.
1317
1318           This is counter-intuitive in a strict sense, but the callers
1319           currently expect this.  They are calling the function
1320           merely to determine whether VR->MIN <= VAL <= VR->MAX.  The
1321           callers are applying the VR_RANGE/VR_ANTI_RANGE semantics
1322           themselves.
1323
1324           This also applies to value_ranges_intersect_p and
1325           range_includes_zero_p.  The semantics of VR_RANGE and
1326           VR_ANTI_RANGE should be encoded here, but that also means
1327           adapting the users of these functions to the new semantics.
1328
1329    Benchmark compile/20001226-1.c compilation time after changing this
1330    function.  */
1331
1332 static inline int
1333 value_inside_range (tree val, value_range_t * vr)
1334 {
1335   int cmp1, cmp2;
1336
1337   cmp1 = operand_less_p (val, vr->min);
1338   if (cmp1 == -2)
1339     return -2;
1340   if (cmp1 == 1)
1341     return 0;
1342
1343   cmp2 = operand_less_p (vr->max, val);
1344   if (cmp2 == -2)
1345     return -2;
1346
1347   return !cmp2;
1348 }
1349
1350
1351 /* Return true if value ranges VR0 and VR1 have a non-empty
1352    intersection.
1353
1354    Benchmark compile/20001226-1.c compilation time after changing this
1355    function.
1356    */
1357
1358 static inline bool
1359 value_ranges_intersect_p (value_range_t *vr0, value_range_t *vr1)
1360 {
1361   /* The value ranges do not intersect if the maximum of the first range is
1362      less than the minimum of the second range or vice versa.
1363      When those relations are unknown, we can't do any better.  */
1364   if (operand_less_p (vr0->max, vr1->min) != 0)
1365     return false;
1366   if (operand_less_p (vr1->max, vr0->min) != 0)
1367     return false;
1368   return true;
1369 }
1370
1371
1372 /* Return true if VR includes the value zero, false otherwise.  FIXME,
1373    currently this will return false for an anti-range like ~[-4, 3].
1374    This will be wrong when the semantics of value_inside_range are
1375    modified (currently the users of this function expect these
1376    semantics).  */
1377
1378 static inline bool
1379 range_includes_zero_p (value_range_t *vr)
1380 {
1381   tree zero;
1382
1383   gcc_assert (vr->type != VR_UNDEFINED
1384               && vr->type != VR_VARYING
1385               && !symbolic_range_p (vr));
1386
1387   zero = build_int_cst (TREE_TYPE (vr->min), 0);
1388   return (value_inside_range (zero, vr) == 1);
1389 }
1390
1391 /* Return true if T, an SSA_NAME, is known to be nonnegative.  Return
1392    false otherwise or if no value range information is available.  */
1393
1394 bool
1395 ssa_name_nonnegative_p (const_tree t)
1396 {
1397   value_range_t *vr = get_value_range (t);
1398
1399   if (INTEGRAL_TYPE_P (t)
1400       && TYPE_UNSIGNED (t))
1401     return true;
1402
1403   if (!vr)
1404     return false;
1405
1406   /* Testing for VR_ANTI_RANGE is not useful here as any anti-range
1407      which would return a useful value should be encoded as a VR_RANGE.  */
1408   if (vr->type == VR_RANGE)
1409     {
1410       int result = compare_values (vr->min, integer_zero_node);
1411
1412       return (result == 0 || result == 1);
1413     }
1414   return false;
1415 }
1416
1417 /* If OP has a value range with a single constant value return that,
1418    otherwise return NULL_TREE.  This returns OP itself if OP is a
1419    constant.  */
1420
1421 static tree
1422 op_with_constant_singleton_value_range (tree op)
1423 {
1424   value_range_t *vr;
1425
1426   if (is_gimple_min_invariant (op))
1427     return op;
1428
1429   if (TREE_CODE (op) != SSA_NAME)
1430     return NULL_TREE;
1431
1432   vr = get_value_range (op);
1433   if (vr->type == VR_RANGE
1434       && operand_equal_p (vr->min, vr->max, 0)
1435       && is_gimple_min_invariant (vr->min))
1436     return vr->min;
1437
1438   return NULL_TREE;
1439 }
1440
1441
1442 /* Extract value range information from an ASSERT_EXPR EXPR and store
1443    it in *VR_P.  */
1444
1445 static void
1446 extract_range_from_assert (value_range_t *vr_p, tree expr)
1447 {
1448   tree var, cond, limit, min, max, type;
1449   value_range_t *var_vr, *limit_vr;
1450   enum tree_code cond_code;
1451
1452   var = ASSERT_EXPR_VAR (expr);
1453   cond = ASSERT_EXPR_COND (expr);
1454
1455   gcc_assert (COMPARISON_CLASS_P (cond));
1456
1457   /* Find VAR in the ASSERT_EXPR conditional.  */
1458   if (var == TREE_OPERAND (cond, 0)
1459       || TREE_CODE (TREE_OPERAND (cond, 0)) == PLUS_EXPR
1460       || TREE_CODE (TREE_OPERAND (cond, 0)) == NOP_EXPR)
1461     {
1462       /* If the predicate is of the form VAR COMP LIMIT, then we just
1463          take LIMIT from the RHS and use the same comparison code.  */
1464       cond_code = TREE_CODE (cond);
1465       limit = TREE_OPERAND (cond, 1);
1466       cond = TREE_OPERAND (cond, 0);
1467     }
1468   else
1469     {
1470       /* If the predicate is of the form LIMIT COMP VAR, then we need
1471          to flip around the comparison code to create the proper range
1472          for VAR.  */
1473       cond_code = swap_tree_comparison (TREE_CODE (cond));
1474       limit = TREE_OPERAND (cond, 0);
1475       cond = TREE_OPERAND (cond, 1);
1476     }
1477
1478   limit = avoid_overflow_infinity (limit);
1479
1480   type = TREE_TYPE (limit);
1481   gcc_assert (limit != var);
1482
1483   /* For pointer arithmetic, we only keep track of pointer equality
1484      and inequality.  */
1485   if (POINTER_TYPE_P (type) && cond_code != NE_EXPR && cond_code != EQ_EXPR)
1486     {
1487       set_value_range_to_varying (vr_p);
1488       return;
1489     }
1490
1491   /* If LIMIT is another SSA name and LIMIT has a range of its own,
1492      try to use LIMIT's range to avoid creating symbolic ranges
1493      unnecessarily. */
1494   limit_vr = (TREE_CODE (limit) == SSA_NAME) ? get_value_range (limit) : NULL;
1495
1496   /* LIMIT's range is only interesting if it has any useful information.  */
1497   if (limit_vr
1498       && (limit_vr->type == VR_UNDEFINED
1499           || limit_vr->type == VR_VARYING
1500           || symbolic_range_p (limit_vr)))
1501     limit_vr = NULL;
1502
1503   /* Initially, the new range has the same set of equivalences of
1504      VAR's range.  This will be revised before returning the final
1505      value.  Since assertions may be chained via mutually exclusive
1506      predicates, we will need to trim the set of equivalences before
1507      we are done.  */
1508   gcc_assert (vr_p->equiv == NULL);
1509   add_equivalence (&vr_p->equiv, var);
1510
1511   /* Extract a new range based on the asserted comparison for VAR and
1512      LIMIT's value range.  Notice that if LIMIT has an anti-range, we
1513      will only use it for equality comparisons (EQ_EXPR).  For any
1514      other kind of assertion, we cannot derive a range from LIMIT's
1515      anti-range that can be used to describe the new range.  For
1516      instance, ASSERT_EXPR <x_2, x_2 <= b_4>.  If b_4 is ~[2, 10],
1517      then b_4 takes on the ranges [-INF, 1] and [11, +INF].  There is
1518      no single range for x_2 that could describe LE_EXPR, so we might
1519      as well build the range [b_4, +INF] for it.
1520      One special case we handle is extracting a range from a
1521      range test encoded as (unsigned)var + CST <= limit.  */
1522   if (TREE_CODE (cond) == NOP_EXPR
1523       || TREE_CODE (cond) == PLUS_EXPR)
1524     {
1525       if (TREE_CODE (cond) == PLUS_EXPR)
1526         {
1527           min = fold_build1 (NEGATE_EXPR, TREE_TYPE (TREE_OPERAND (cond, 1)),
1528                              TREE_OPERAND (cond, 1));
1529           max = int_const_binop (PLUS_EXPR, limit, min);
1530           cond = TREE_OPERAND (cond, 0);
1531         }
1532       else
1533         {
1534           min = build_int_cst (TREE_TYPE (var), 0);
1535           max = limit;
1536         }
1537
1538       /* Make sure to not set TREE_OVERFLOW on the final type
1539          conversion.  We are willingly interpreting large positive
1540          unsigned values as negative singed values here.  */
1541       min = force_fit_type_double (TREE_TYPE (var), tree_to_double_int (min),
1542                                    0, false);
1543       max = force_fit_type_double (TREE_TYPE (var), tree_to_double_int (max),
1544                                    0, false);
1545
1546       /* We can transform a max, min range to an anti-range or
1547          vice-versa.  Use set_and_canonicalize_value_range which does
1548          this for us.  */
1549       if (cond_code == LE_EXPR)
1550         set_and_canonicalize_value_range (vr_p, VR_RANGE,
1551                                           min, max, vr_p->equiv);
1552       else if (cond_code == GT_EXPR)
1553         set_and_canonicalize_value_range (vr_p, VR_ANTI_RANGE,
1554                                           min, max, vr_p->equiv);
1555       else
1556         gcc_unreachable ();
1557     }
1558   else if (cond_code == EQ_EXPR)
1559     {
1560       enum value_range_type range_type;
1561
1562       if (limit_vr)
1563         {
1564           range_type = limit_vr->type;
1565           min = limit_vr->min;
1566           max = limit_vr->max;
1567         }
1568       else
1569         {
1570           range_type = VR_RANGE;
1571           min = limit;
1572           max = limit;
1573         }
1574
1575       set_value_range (vr_p, range_type, min, max, vr_p->equiv);
1576
1577       /* When asserting the equality VAR == LIMIT and LIMIT is another
1578          SSA name, the new range will also inherit the equivalence set
1579          from LIMIT.  */
1580       if (TREE_CODE (limit) == SSA_NAME)
1581         add_equivalence (&vr_p->equiv, limit);
1582     }
1583   else if (cond_code == NE_EXPR)
1584     {
1585       /* As described above, when LIMIT's range is an anti-range and
1586          this assertion is an inequality (NE_EXPR), then we cannot
1587          derive anything from the anti-range.  For instance, if
1588          LIMIT's range was ~[0, 0], the assertion 'VAR != LIMIT' does
1589          not imply that VAR's range is [0, 0].  So, in the case of
1590          anti-ranges, we just assert the inequality using LIMIT and
1591          not its anti-range.
1592
1593          If LIMIT_VR is a range, we can only use it to build a new
1594          anti-range if LIMIT_VR is a single-valued range.  For
1595          instance, if LIMIT_VR is [0, 1], the predicate
1596          VAR != [0, 1] does not mean that VAR's range is ~[0, 1].
1597          Rather, it means that for value 0 VAR should be ~[0, 0]
1598          and for value 1, VAR should be ~[1, 1].  We cannot
1599          represent these ranges.
1600
1601          The only situation in which we can build a valid
1602          anti-range is when LIMIT_VR is a single-valued range
1603          (i.e., LIMIT_VR->MIN == LIMIT_VR->MAX).  In that case,
1604          build the anti-range ~[LIMIT_VR->MIN, LIMIT_VR->MAX].  */
1605       if (limit_vr
1606           && limit_vr->type == VR_RANGE
1607           && compare_values (limit_vr->min, limit_vr->max) == 0)
1608         {
1609           min = limit_vr->min;
1610           max = limit_vr->max;
1611         }
1612       else
1613         {
1614           /* In any other case, we cannot use LIMIT's range to build a
1615              valid anti-range.  */
1616           min = max = limit;
1617         }
1618
1619       /* If MIN and MAX cover the whole range for their type, then
1620          just use the original LIMIT.  */
1621       if (INTEGRAL_TYPE_P (type)
1622           && vrp_val_is_min (min)
1623           && vrp_val_is_max (max))
1624         min = max = limit;
1625
1626       set_value_range (vr_p, VR_ANTI_RANGE, min, max, vr_p->equiv);
1627     }
1628   else if (cond_code == LE_EXPR || cond_code == LT_EXPR)
1629     {
1630       min = TYPE_MIN_VALUE (type);
1631
1632       if (limit_vr == NULL || limit_vr->type == VR_ANTI_RANGE)
1633         max = limit;
1634       else
1635         {
1636           /* If LIMIT_VR is of the form [N1, N2], we need to build the
1637              range [MIN, N2] for LE_EXPR and [MIN, N2 - 1] for
1638              LT_EXPR.  */
1639           max = limit_vr->max;
1640         }
1641
1642       /* If the maximum value forces us to be out of bounds, simply punt.
1643          It would be pointless to try and do anything more since this
1644          all should be optimized away above us.  */
1645       if ((cond_code == LT_EXPR
1646            && compare_values (max, min) == 0)
1647           || (CONSTANT_CLASS_P (max) && TREE_OVERFLOW (max)))
1648         set_value_range_to_varying (vr_p);
1649       else
1650         {
1651           /* For LT_EXPR, we create the range [MIN, MAX - 1].  */
1652           if (cond_code == LT_EXPR)
1653             {
1654               tree one = build_int_cst (type, 1);
1655               max = fold_build2 (MINUS_EXPR, type, max, one);
1656               if (EXPR_P (max))
1657                 TREE_NO_WARNING (max) = 1;
1658             }
1659
1660           set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
1661         }
1662     }
1663   else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
1664     {
1665       max = TYPE_MAX_VALUE (type);
1666
1667       if (limit_vr == NULL || limit_vr->type == VR_ANTI_RANGE)
1668         min = limit;
1669       else
1670         {
1671           /* If LIMIT_VR is of the form [N1, N2], we need to build the
1672              range [N1, MAX] for GE_EXPR and [N1 + 1, MAX] for
1673              GT_EXPR.  */
1674           min = limit_vr->min;
1675         }
1676
1677       /* If the minimum value forces us to be out of bounds, simply punt.
1678          It would be pointless to try and do anything more since this
1679          all should be optimized away above us.  */
1680       if ((cond_code == GT_EXPR
1681            && compare_values (min, max) == 0)
1682           || (CONSTANT_CLASS_P (min) && TREE_OVERFLOW (min)))
1683         set_value_range_to_varying (vr_p);
1684       else
1685         {
1686           /* For GT_EXPR, we create the range [MIN + 1, MAX].  */
1687           if (cond_code == GT_EXPR)
1688             {
1689               tree one = build_int_cst (type, 1);
1690               min = fold_build2 (PLUS_EXPR, type, min, one);
1691               if (EXPR_P (min))
1692                 TREE_NO_WARNING (min) = 1;
1693             }
1694
1695           set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
1696         }
1697     }
1698   else
1699     gcc_unreachable ();
1700
1701   /* If VAR already had a known range, it may happen that the new
1702      range we have computed and VAR's range are not compatible.  For
1703      instance,
1704
1705         if (p_5 == NULL)
1706           p_6 = ASSERT_EXPR <p_5, p_5 == NULL>;
1707           x_7 = p_6->fld;
1708           p_8 = ASSERT_EXPR <p_6, p_6 != NULL>;
1709
1710      While the above comes from a faulty program, it will cause an ICE
1711      later because p_8 and p_6 will have incompatible ranges and at
1712      the same time will be considered equivalent.  A similar situation
1713      would arise from
1714
1715         if (i_5 > 10)
1716           i_6 = ASSERT_EXPR <i_5, i_5 > 10>;
1717           if (i_5 < 5)
1718             i_7 = ASSERT_EXPR <i_6, i_6 < 5>;
1719
1720      Again i_6 and i_7 will have incompatible ranges.  It would be
1721      pointless to try and do anything with i_7's range because
1722      anything dominated by 'if (i_5 < 5)' will be optimized away.
1723      Note, due to the wa in which simulation proceeds, the statement
1724      i_7 = ASSERT_EXPR <...> we would never be visited because the
1725      conditional 'if (i_5 < 5)' always evaluates to false.  However,
1726      this extra check does not hurt and may protect against future
1727      changes to VRP that may get into a situation similar to the
1728      NULL pointer dereference example.
1729
1730      Note that these compatibility tests are only needed when dealing
1731      with ranges or a mix of range and anti-range.  If VAR_VR and VR_P
1732      are both anti-ranges, they will always be compatible, because two
1733      anti-ranges will always have a non-empty intersection.  */
1734
1735   var_vr = get_value_range (var);
1736
1737   /* We may need to make adjustments when VR_P and VAR_VR are numeric
1738      ranges or anti-ranges.  */
1739   if (vr_p->type == VR_VARYING
1740       || vr_p->type == VR_UNDEFINED
1741       || var_vr->type == VR_VARYING
1742       || var_vr->type == VR_UNDEFINED
1743       || symbolic_range_p (vr_p)
1744       || symbolic_range_p (var_vr))
1745     return;
1746
1747   if (var_vr->type == VR_RANGE && vr_p->type == VR_RANGE)
1748     {
1749       /* If the two ranges have a non-empty intersection, we can
1750          refine the resulting range.  Since the assert expression
1751          creates an equivalency and at the same time it asserts a
1752          predicate, we can take the intersection of the two ranges to
1753          get better precision.  */
1754       if (value_ranges_intersect_p (var_vr, vr_p))
1755         {
1756           /* Use the larger of the two minimums.  */
1757           if (compare_values (vr_p->min, var_vr->min) == -1)
1758             min = var_vr->min;
1759           else
1760             min = vr_p->min;
1761
1762           /* Use the smaller of the two maximums.  */
1763           if (compare_values (vr_p->max, var_vr->max) == 1)
1764             max = var_vr->max;
1765           else
1766             max = vr_p->max;
1767
1768           set_value_range (vr_p, vr_p->type, min, max, vr_p->equiv);
1769         }
1770       else
1771         {
1772           /* The two ranges do not intersect, set the new range to
1773              VARYING, because we will not be able to do anything
1774              meaningful with it.  */
1775           set_value_range_to_varying (vr_p);
1776         }
1777     }
1778   else if ((var_vr->type == VR_RANGE && vr_p->type == VR_ANTI_RANGE)
1779            || (var_vr->type == VR_ANTI_RANGE && vr_p->type == VR_RANGE))
1780     {
1781       /* A range and an anti-range will cancel each other only if
1782          their ends are the same.  For instance, in the example above,
1783          p_8's range ~[0, 0] and p_6's range [0, 0] are incompatible,
1784          so VR_P should be set to VR_VARYING.  */
1785       if (compare_values (var_vr->min, vr_p->min) == 0
1786           && compare_values (var_vr->max, vr_p->max) == 0)
1787         set_value_range_to_varying (vr_p);
1788       else
1789         {
1790           tree min, max, anti_min, anti_max, real_min, real_max;
1791           int cmp;
1792
1793           /* We want to compute the logical AND of the two ranges;
1794              there are three cases to consider.
1795
1796
1797              1. The VR_ANTI_RANGE range is completely within the
1798                 VR_RANGE and the endpoints of the ranges are
1799                 different.  In that case the resulting range
1800                 should be whichever range is more precise.
1801                 Typically that will be the VR_RANGE.
1802
1803              2. The VR_ANTI_RANGE is completely disjoint from
1804                 the VR_RANGE.  In this case the resulting range
1805                 should be the VR_RANGE.
1806
1807              3. There is some overlap between the VR_ANTI_RANGE
1808                 and the VR_RANGE.
1809
1810                 3a. If the high limit of the VR_ANTI_RANGE resides
1811                     within the VR_RANGE, then the result is a new
1812                     VR_RANGE starting at the high limit of the
1813                     VR_ANTI_RANGE + 1 and extending to the
1814                     high limit of the original VR_RANGE.
1815
1816                 3b. If the low limit of the VR_ANTI_RANGE resides
1817                     within the VR_RANGE, then the result is a new
1818                     VR_RANGE starting at the low limit of the original
1819                     VR_RANGE and extending to the low limit of the
1820                     VR_ANTI_RANGE - 1.  */
1821           if (vr_p->type == VR_ANTI_RANGE)
1822             {
1823               anti_min = vr_p->min;
1824               anti_max = vr_p->max;
1825               real_min = var_vr->min;
1826               real_max = var_vr->max;
1827             }
1828           else
1829             {
1830               anti_min = var_vr->min;
1831               anti_max = var_vr->max;
1832               real_min = vr_p->min;
1833               real_max = vr_p->max;
1834             }
1835
1836
1837           /* Case 1, VR_ANTI_RANGE completely within VR_RANGE,
1838              not including any endpoints.  */
1839           if (compare_values (anti_max, real_max) == -1
1840               && compare_values (anti_min, real_min) == 1)
1841             {
1842               /* If the range is covering the whole valid range of
1843                  the type keep the anti-range.  */
1844               if (!vrp_val_is_min (real_min)
1845                   || !vrp_val_is_max (real_max))
1846                 set_value_range (vr_p, VR_RANGE, real_min,
1847                                  real_max, vr_p->equiv);
1848             }
1849           /* Case 2, VR_ANTI_RANGE completely disjoint from
1850              VR_RANGE.  */
1851           else if (compare_values (anti_min, real_max) == 1
1852                    || compare_values (anti_max, real_min) == -1)
1853             {
1854               set_value_range (vr_p, VR_RANGE, real_min,
1855                                real_max, vr_p->equiv);
1856             }
1857           /* Case 3a, the anti-range extends into the low
1858              part of the real range.  Thus creating a new
1859              low for the real range.  */
1860           else if (((cmp = compare_values (anti_max, real_min)) == 1
1861                     || cmp == 0)
1862                    && compare_values (anti_max, real_max) == -1)
1863             {
1864               gcc_assert (!is_positive_overflow_infinity (anti_max));
1865               if (needs_overflow_infinity (TREE_TYPE (anti_max))
1866                   && vrp_val_is_max (anti_max))
1867                 {
1868                   if (!supports_overflow_infinity (TREE_TYPE (var_vr->min)))
1869                     {
1870                       set_value_range_to_varying (vr_p);
1871                       return;
1872                     }
1873                   min = positive_overflow_infinity (TREE_TYPE (var_vr->min));
1874                 }
1875               else if (!POINTER_TYPE_P (TREE_TYPE (var_vr->min)))
1876                 min = fold_build2 (PLUS_EXPR, TREE_TYPE (var_vr->min),
1877                                    anti_max,
1878                                    build_int_cst (TREE_TYPE (var_vr->min), 1));
1879               else
1880                 min = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (var_vr->min),
1881                                    anti_max, size_int (1));
1882               max = real_max;
1883               set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
1884             }
1885           /* Case 3b, the anti-range extends into the high
1886              part of the real range.  Thus creating a new
1887              higher for the real range.  */
1888           else if (compare_values (anti_min, real_min) == 1
1889                    && ((cmp = compare_values (anti_min, real_max)) == -1
1890                        || cmp == 0))
1891             {
1892               gcc_assert (!is_negative_overflow_infinity (anti_min));
1893               if (needs_overflow_infinity (TREE_TYPE (anti_min))
1894                   && vrp_val_is_min (anti_min))
1895                 {
1896                   if (!supports_overflow_infinity (TREE_TYPE (var_vr->min)))
1897                     {
1898                       set_value_range_to_varying (vr_p);
1899                       return;
1900                     }
1901                   max = negative_overflow_infinity (TREE_TYPE (var_vr->min));
1902                 }
1903               else if (!POINTER_TYPE_P (TREE_TYPE (var_vr->min)))
1904                 max = fold_build2 (MINUS_EXPR, TREE_TYPE (var_vr->min),
1905                                    anti_min,
1906                                    build_int_cst (TREE_TYPE (var_vr->min), 1));
1907               else
1908                 max = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (var_vr->min),
1909                                    anti_min,
1910                                    size_int (-1));
1911               min = real_min;
1912               set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
1913             }
1914         }
1915     }
1916 }
1917
1918
1919 /* Extract range information from SSA name VAR and store it in VR.  If
1920    VAR has an interesting range, use it.  Otherwise, create the
1921    range [VAR, VAR] and return it.  This is useful in situations where
1922    we may have conditionals testing values of VARYING names.  For
1923    instance,
1924
1925         x_3 = y_5;
1926         if (x_3 > y_5)
1927           ...
1928
1929     Even if y_5 is deemed VARYING, we can determine that x_3 > y_5 is
1930     always false.  */
1931
1932 static void
1933 extract_range_from_ssa_name (value_range_t *vr, tree var)
1934 {
1935   value_range_t *var_vr = get_value_range (var);
1936
1937   if (var_vr->type != VR_UNDEFINED && var_vr->type != VR_VARYING)
1938     copy_value_range (vr, var_vr);
1939   else
1940     set_value_range (vr, VR_RANGE, var, var, NULL);
1941
1942   add_equivalence (&vr->equiv, var);
1943 }
1944
1945
1946 /* Wrapper around int_const_binop.  If the operation overflows and we
1947    are not using wrapping arithmetic, then adjust the result to be
1948    -INF or +INF depending on CODE, VAL1 and VAL2.  This can return
1949    NULL_TREE if we need to use an overflow infinity representation but
1950    the type does not support it.  */
1951
1952 static tree
1953 vrp_int_const_binop (enum tree_code code, tree val1, tree val2)
1954 {
1955   tree res;
1956
1957   res = int_const_binop (code, val1, val2);
1958
1959   /* If we are using unsigned arithmetic, operate symbolically
1960      on -INF and +INF as int_const_binop only handles signed overflow.  */
1961   if (TYPE_UNSIGNED (TREE_TYPE (val1)))
1962     {
1963       int checkz = compare_values (res, val1);
1964       bool overflow = false;
1965
1966       /* Ensure that res = val1 [+*] val2 >= val1
1967          or that res = val1 - val2 <= val1.  */
1968       if ((code == PLUS_EXPR
1969            && !(checkz == 1 || checkz == 0))
1970           || (code == MINUS_EXPR
1971               && !(checkz == 0 || checkz == -1)))
1972         {
1973           overflow = true;
1974         }
1975       /* Checking for multiplication overflow is done by dividing the
1976          output of the multiplication by the first input of the
1977          multiplication.  If the result of that division operation is
1978          not equal to the second input of the multiplication, then the
1979          multiplication overflowed.  */
1980       else if (code == MULT_EXPR && !integer_zerop (val1))
1981         {
1982           tree tmp = int_const_binop (TRUNC_DIV_EXPR,
1983                                       res,
1984                                       val1);
1985           int check = compare_values (tmp, val2);
1986
1987           if (check != 0)
1988             overflow = true;
1989         }
1990
1991       if (overflow)
1992         {
1993           res = copy_node (res);
1994           TREE_OVERFLOW (res) = 1;
1995         }
1996
1997     }
1998   else if (TYPE_OVERFLOW_WRAPS (TREE_TYPE (val1)))
1999     /* If the singed operation wraps then int_const_binop has done
2000        everything we want.  */
2001     ;
2002   else if ((TREE_OVERFLOW (res)
2003             && !TREE_OVERFLOW (val1)
2004             && !TREE_OVERFLOW (val2))
2005            || is_overflow_infinity (val1)
2006            || is_overflow_infinity (val2))
2007     {
2008       /* If the operation overflowed but neither VAL1 nor VAL2 are
2009          overflown, return -INF or +INF depending on the operation
2010          and the combination of signs of the operands.  */
2011       int sgn1 = tree_int_cst_sgn (val1);
2012       int sgn2 = tree_int_cst_sgn (val2);
2013
2014       if (needs_overflow_infinity (TREE_TYPE (res))
2015           && !supports_overflow_infinity (TREE_TYPE (res)))
2016         return NULL_TREE;
2017
2018       /* We have to punt on adding infinities of different signs,
2019          since we can't tell what the sign of the result should be.
2020          Likewise for subtracting infinities of the same sign.  */
2021       if (((code == PLUS_EXPR && sgn1 != sgn2)
2022            || (code == MINUS_EXPR && sgn1 == sgn2))
2023           && is_overflow_infinity (val1)
2024           && is_overflow_infinity (val2))
2025         return NULL_TREE;
2026
2027       /* Don't try to handle division or shifting of infinities.  */
2028       if ((code == TRUNC_DIV_EXPR
2029            || code == FLOOR_DIV_EXPR
2030            || code == CEIL_DIV_EXPR
2031            || code == EXACT_DIV_EXPR
2032            || code == ROUND_DIV_EXPR
2033            || code == RSHIFT_EXPR)
2034           && (is_overflow_infinity (val1)
2035               || is_overflow_infinity (val2)))
2036         return NULL_TREE;
2037
2038       /* Notice that we only need to handle the restricted set of
2039          operations handled by extract_range_from_binary_expr.
2040          Among them, only multiplication, addition and subtraction
2041          can yield overflow without overflown operands because we
2042          are working with integral types only... except in the
2043          case VAL1 = -INF and VAL2 = -1 which overflows to +INF
2044          for division too.  */
2045
2046       /* For multiplication, the sign of the overflow is given
2047          by the comparison of the signs of the operands.  */
2048       if ((code == MULT_EXPR && sgn1 == sgn2)
2049           /* For addition, the operands must be of the same sign
2050              to yield an overflow.  Its sign is therefore that
2051              of one of the operands, for example the first.  For
2052              infinite operands X + -INF is negative, not positive.  */
2053           || (code == PLUS_EXPR
2054               && (sgn1 >= 0
2055                   ? !is_negative_overflow_infinity (val2)
2056                   : is_positive_overflow_infinity (val2)))
2057           /* For subtraction, non-infinite operands must be of
2058              different signs to yield an overflow.  Its sign is
2059              therefore that of the first operand or the opposite of
2060              that of the second operand.  A first operand of 0 counts
2061              as positive here, for the corner case 0 - (-INF), which
2062              overflows, but must yield +INF.  For infinite operands 0
2063              - INF is negative, not positive.  */
2064           || (code == MINUS_EXPR
2065               && (sgn1 >= 0
2066                   ? !is_positive_overflow_infinity (val2)
2067                   : is_negative_overflow_infinity (val2)))
2068           /* We only get in here with positive shift count, so the
2069              overflow direction is the same as the sign of val1.
2070              Actually rshift does not overflow at all, but we only
2071              handle the case of shifting overflowed -INF and +INF.  */
2072           || (code == RSHIFT_EXPR
2073               && sgn1 >= 0)
2074           /* For division, the only case is -INF / -1 = +INF.  */
2075           || code == TRUNC_DIV_EXPR
2076           || code == FLOOR_DIV_EXPR
2077           || code == CEIL_DIV_EXPR
2078           || code == EXACT_DIV_EXPR
2079           || code == ROUND_DIV_EXPR)
2080         return (needs_overflow_infinity (TREE_TYPE (res))
2081                 ? positive_overflow_infinity (TREE_TYPE (res))
2082                 : TYPE_MAX_VALUE (TREE_TYPE (res)));
2083       else
2084         return (needs_overflow_infinity (TREE_TYPE (res))
2085                 ? negative_overflow_infinity (TREE_TYPE (res))
2086                 : TYPE_MIN_VALUE (TREE_TYPE (res)));
2087     }
2088
2089   return res;
2090 }
2091
2092
2093 /* For range VR compute two double_int bitmasks.  In *MAY_BE_NONZERO
2094    bitmask if some bit is unset, it means for all numbers in the range
2095    the bit is 0, otherwise it might be 0 or 1.  In *MUST_BE_NONZERO
2096    bitmask if some bit is set, it means for all numbers in the range
2097    the bit is 1, otherwise it might be 0 or 1.  */
2098
2099 static bool
2100 zero_nonzero_bits_from_vr (value_range_t *vr, double_int *may_be_nonzero,
2101                            double_int *must_be_nonzero)
2102 {
2103   if (range_int_cst_p (vr))
2104     {
2105       if (range_int_cst_singleton_p (vr))
2106         {
2107           *may_be_nonzero = tree_to_double_int (vr->min);
2108           *must_be_nonzero = *may_be_nonzero;
2109           return true;
2110         }
2111       if (tree_int_cst_sgn (vr->min) >= 0)
2112         {
2113           double_int dmin = tree_to_double_int (vr->min);
2114           double_int dmax = tree_to_double_int (vr->max);
2115           double_int xor_mask = double_int_xor (dmin, dmax);
2116           *may_be_nonzero = double_int_ior (dmin, dmax);
2117           *must_be_nonzero = double_int_and (dmin, dmax);
2118           if (xor_mask.high != 0)
2119             {
2120               unsigned HOST_WIDE_INT mask
2121                 = ((unsigned HOST_WIDE_INT) 1
2122                    << floor_log2 (xor_mask.high)) - 1;
2123               may_be_nonzero->low = ALL_ONES;
2124               may_be_nonzero->high |= mask;
2125               must_be_nonzero->low = 0;
2126               must_be_nonzero->high &= ~mask;
2127             }
2128           else if (xor_mask.low != 0)
2129             {
2130               unsigned HOST_WIDE_INT mask
2131                 = ((unsigned HOST_WIDE_INT) 1
2132                    << floor_log2 (xor_mask.low)) - 1;
2133               may_be_nonzero->low |= mask;
2134               must_be_nonzero->low &= ~mask;
2135             }
2136           return true;
2137         }
2138     }
2139   may_be_nonzero->low = ALL_ONES;
2140   may_be_nonzero->high = ALL_ONES;
2141   must_be_nonzero->low = 0;
2142   must_be_nonzero->high = 0;
2143   return false;
2144 }
2145
2146
2147 /* Extract range information from a binary expression EXPR based on
2148    the ranges of each of its operands and the expression code.  */
2149
2150 static void
2151 extract_range_from_binary_expr (value_range_t *vr,
2152                                 enum tree_code code,
2153                                 tree expr_type, tree op0, tree op1)
2154 {
2155   enum value_range_type type;
2156   tree min, max;
2157   int cmp;
2158   value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
2159   value_range_t vr1 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
2160
2161   /* Not all binary expressions can be applied to ranges in a
2162      meaningful way.  Handle only arithmetic operations.  */
2163   if (code != PLUS_EXPR
2164       && code != MINUS_EXPR
2165       && code != POINTER_PLUS_EXPR
2166       && code != MULT_EXPR
2167       && code != TRUNC_DIV_EXPR
2168       && code != FLOOR_DIV_EXPR
2169       && code != CEIL_DIV_EXPR
2170       && code != EXACT_DIV_EXPR
2171       && code != ROUND_DIV_EXPR
2172       && code != TRUNC_MOD_EXPR
2173       && code != RSHIFT_EXPR
2174       && code != MIN_EXPR
2175       && code != MAX_EXPR
2176       && code != BIT_AND_EXPR
2177       && code != BIT_IOR_EXPR
2178       && code != TRUTH_AND_EXPR
2179       && code != TRUTH_OR_EXPR)
2180     {
2181       /* We can still do constant propagation here.  */
2182       tree const_op0 = op_with_constant_singleton_value_range (op0);
2183       tree const_op1 = op_with_constant_singleton_value_range (op1);
2184       if (const_op0 || const_op1)
2185         {
2186           tree tem = fold_binary (code, expr_type,
2187                                   const_op0 ? const_op0 : op0,
2188                                   const_op1 ? const_op1 : op1);
2189           if (tem
2190               && is_gimple_min_invariant (tem)
2191               && !is_overflow_infinity (tem))
2192             {
2193               set_value_range (vr, VR_RANGE, tem, tem, NULL);
2194               return;
2195             }
2196         }
2197       set_value_range_to_varying (vr);
2198       return;
2199     }
2200
2201   /* Get value ranges for each operand.  For constant operands, create
2202      a new value range with the operand to simplify processing.  */
2203   if (TREE_CODE (op0) == SSA_NAME)
2204     vr0 = *(get_value_range (op0));
2205   else if (is_gimple_min_invariant (op0))
2206     set_value_range_to_value (&vr0, op0, NULL);
2207   else
2208     set_value_range_to_varying (&vr0);
2209
2210   if (TREE_CODE (op1) == SSA_NAME)
2211     vr1 = *(get_value_range (op1));
2212   else if (is_gimple_min_invariant (op1))
2213     set_value_range_to_value (&vr1, op1, NULL);
2214   else
2215     set_value_range_to_varying (&vr1);
2216
2217   /* If either range is UNDEFINED, so is the result.  */
2218   if (vr0.type == VR_UNDEFINED || vr1.type == VR_UNDEFINED)
2219     {
2220       set_value_range_to_undefined (vr);
2221       return;
2222     }
2223
2224   /* The type of the resulting value range defaults to VR0.TYPE.  */
2225   type = vr0.type;
2226
2227   /* Refuse to operate on VARYING ranges, ranges of different kinds
2228      and symbolic ranges.  As an exception, we allow BIT_AND_EXPR
2229      because we may be able to derive a useful range even if one of
2230      the operands is VR_VARYING or symbolic range.  Similarly for
2231      divisions.  TODO, we may be able to derive anti-ranges in
2232      some cases.  */
2233   if (code != BIT_AND_EXPR
2234       && code != TRUTH_AND_EXPR
2235       && code != TRUTH_OR_EXPR
2236       && code != TRUNC_DIV_EXPR
2237       && code != FLOOR_DIV_EXPR
2238       && code != CEIL_DIV_EXPR
2239       && code != EXACT_DIV_EXPR
2240       && code != ROUND_DIV_EXPR
2241       && code != TRUNC_MOD_EXPR
2242       && (vr0.type == VR_VARYING
2243           || vr1.type == VR_VARYING
2244           || vr0.type != vr1.type
2245           || symbolic_range_p (&vr0)
2246           || symbolic_range_p (&vr1)))
2247     {
2248       set_value_range_to_varying (vr);
2249       return;
2250     }
2251
2252   /* Now evaluate the expression to determine the new range.  */
2253   if (POINTER_TYPE_P (expr_type)
2254       || POINTER_TYPE_P (TREE_TYPE (op0))
2255       || POINTER_TYPE_P (TREE_TYPE (op1)))
2256     {
2257       if (code == MIN_EXPR || code == MAX_EXPR)
2258         {
2259           /* For MIN/MAX expressions with pointers, we only care about
2260              nullness, if both are non null, then the result is nonnull.
2261              If both are null, then the result is null. Otherwise they
2262              are varying.  */
2263           if (range_is_nonnull (&vr0) && range_is_nonnull (&vr1))
2264             set_value_range_to_nonnull (vr, expr_type);
2265           else if (range_is_null (&vr0) && range_is_null (&vr1))
2266             set_value_range_to_null (vr, expr_type);
2267           else
2268             set_value_range_to_varying (vr);
2269
2270           return;
2271         }
2272       if (code == POINTER_PLUS_EXPR)
2273         {
2274           /* For pointer types, we are really only interested in asserting
2275              whether the expression evaluates to non-NULL.  */
2276           if (range_is_nonnull (&vr0) || range_is_nonnull (&vr1))
2277             set_value_range_to_nonnull (vr, expr_type);
2278           else if (range_is_null (&vr0) && range_is_null (&vr1))
2279             set_value_range_to_null (vr, expr_type);
2280           else
2281             set_value_range_to_varying (vr);
2282         }
2283       else if (code == BIT_AND_EXPR)
2284         {
2285           /* For pointer types, we are really only interested in asserting
2286              whether the expression evaluates to non-NULL.  */
2287           if (range_is_nonnull (&vr0) && range_is_nonnull (&vr1))
2288             set_value_range_to_nonnull (vr, expr_type);
2289           else if (range_is_null (&vr0) || range_is_null (&vr1))
2290             set_value_range_to_null (vr, expr_type);
2291           else
2292             set_value_range_to_varying (vr);
2293         }
2294       else
2295         gcc_unreachable ();
2296
2297       return;
2298     }
2299
2300   /* For integer ranges, apply the operation to each end of the
2301      range and see what we end up with.  */
2302   if (code == TRUTH_AND_EXPR
2303       || code == TRUTH_OR_EXPR)
2304     {
2305       /* If one of the operands is zero, we know that the whole
2306          expression evaluates zero.  */
2307       if (code == TRUTH_AND_EXPR
2308           && ((vr0.type == VR_RANGE
2309                && integer_zerop (vr0.min)
2310                && integer_zerop (vr0.max))
2311               || (vr1.type == VR_RANGE
2312                   && integer_zerop (vr1.min)
2313                   && integer_zerop (vr1.max))))
2314         {
2315           type = VR_RANGE;
2316           min = max = build_int_cst (expr_type, 0);
2317         }
2318       /* If one of the operands is one, we know that the whole
2319          expression evaluates one.  */
2320       else if (code == TRUTH_OR_EXPR
2321                && ((vr0.type == VR_RANGE
2322                     && integer_onep (vr0.min)
2323                     && integer_onep (vr0.max))
2324                    || (vr1.type == VR_RANGE
2325                        && integer_onep (vr1.min)
2326                        && integer_onep (vr1.max))))
2327         {
2328           type = VR_RANGE;
2329           min = max = build_int_cst (expr_type, 1);
2330         }
2331       else if (vr0.type != VR_VARYING
2332                && vr1.type != VR_VARYING
2333                && vr0.type == vr1.type
2334                && !symbolic_range_p (&vr0)
2335                && !overflow_infinity_range_p (&vr0)
2336                && !symbolic_range_p (&vr1)
2337                && !overflow_infinity_range_p (&vr1))
2338         {
2339           /* Boolean expressions cannot be folded with int_const_binop.  */
2340           min = fold_binary (code, expr_type, vr0.min, vr1.min);
2341           max = fold_binary (code, expr_type, vr0.max, vr1.max);
2342         }
2343       else
2344         {
2345           /* The result of a TRUTH_*_EXPR is always true or false.  */
2346           set_value_range_to_truthvalue (vr, expr_type);
2347           return;
2348         }
2349     }
2350   else if (code == PLUS_EXPR
2351            || code == MIN_EXPR
2352            || code == MAX_EXPR)
2353     {
2354       /* If we have a PLUS_EXPR with two VR_ANTI_RANGEs, drop to
2355          VR_VARYING.  It would take more effort to compute a precise
2356          range for such a case.  For example, if we have op0 == 1 and
2357          op1 == -1 with their ranges both being ~[0,0], we would have
2358          op0 + op1 == 0, so we cannot claim that the sum is in ~[0,0].
2359          Note that we are guaranteed to have vr0.type == vr1.type at
2360          this point.  */
2361       if (vr0.type == VR_ANTI_RANGE)
2362         {
2363           if (code == PLUS_EXPR)
2364             {
2365               set_value_range_to_varying (vr);
2366               return;
2367             }
2368           /* For MIN_EXPR and MAX_EXPR with two VR_ANTI_RANGEs,
2369              the resulting VR_ANTI_RANGE is the same - intersection
2370              of the two ranges.  */
2371           min = vrp_int_const_binop (MAX_EXPR, vr0.min, vr1.min);
2372           max = vrp_int_const_binop (MIN_EXPR, vr0.max, vr1.max);
2373         }
2374       else
2375         {
2376           /* For operations that make the resulting range directly
2377              proportional to the original ranges, apply the operation to
2378              the same end of each range.  */
2379           min = vrp_int_const_binop (code, vr0.min, vr1.min);
2380           max = vrp_int_const_binop (code, vr0.max, vr1.max);
2381         }
2382
2383       /* If both additions overflowed the range kind is still correct.
2384          This happens regularly with subtracting something in unsigned
2385          arithmetic.
2386          ???  See PR30318 for all the cases we do not handle.  */
2387       if (code == PLUS_EXPR
2388           && (TREE_OVERFLOW (min) && !is_overflow_infinity (min))
2389           && (TREE_OVERFLOW (max) && !is_overflow_infinity (max)))
2390         {
2391           min = build_int_cst_wide (TREE_TYPE (min),
2392                                     TREE_INT_CST_LOW (min),
2393                                     TREE_INT_CST_HIGH (min));
2394           max = build_int_cst_wide (TREE_TYPE (max),
2395                                     TREE_INT_CST_LOW (max),
2396                                     TREE_INT_CST_HIGH (max));
2397         }
2398     }
2399   else if (code == MULT_EXPR
2400            || code == TRUNC_DIV_EXPR
2401            || code == FLOOR_DIV_EXPR
2402            || code == CEIL_DIV_EXPR
2403            || code == EXACT_DIV_EXPR
2404            || code == ROUND_DIV_EXPR
2405            || code == RSHIFT_EXPR)
2406     {
2407       tree val[4];
2408       size_t i;
2409       bool sop;
2410
2411       /* If we have an unsigned MULT_EXPR with two VR_ANTI_RANGEs,
2412          drop to VR_VARYING.  It would take more effort to compute a
2413          precise range for such a case.  For example, if we have
2414          op0 == 65536 and op1 == 65536 with their ranges both being
2415          ~[0,0] on a 32-bit machine, we would have op0 * op1 == 0, so
2416          we cannot claim that the product is in ~[0,0].  Note that we
2417          are guaranteed to have vr0.type == vr1.type at this
2418          point.  */
2419       if (code == MULT_EXPR
2420           && vr0.type == VR_ANTI_RANGE
2421           && !TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (op0)))
2422         {
2423           set_value_range_to_varying (vr);
2424           return;
2425         }
2426
2427       /* If we have a RSHIFT_EXPR with any shift values outside [0..prec-1],
2428          then drop to VR_VARYING.  Outside of this range we get undefined
2429          behavior from the shift operation.  We cannot even trust
2430          SHIFT_COUNT_TRUNCATED at this stage, because that applies to rtl
2431          shifts, and the operation at the tree level may be widened.  */
2432       if (code == RSHIFT_EXPR)
2433         {
2434           if (vr1.type == VR_ANTI_RANGE
2435               || !vrp_expr_computes_nonnegative (op1, &sop)
2436               || (operand_less_p
2437                   (build_int_cst (TREE_TYPE (vr1.max),
2438                                   TYPE_PRECISION (expr_type) - 1),
2439                    vr1.max) != 0))
2440             {
2441               set_value_range_to_varying (vr);
2442               return;
2443             }
2444         }
2445
2446       else if ((code == TRUNC_DIV_EXPR
2447                 || code == FLOOR_DIV_EXPR
2448                 || code == CEIL_DIV_EXPR
2449                 || code == EXACT_DIV_EXPR
2450                 || code == ROUND_DIV_EXPR)
2451                && (vr0.type != VR_RANGE || symbolic_range_p (&vr0)))
2452         {
2453           /* For division, if op1 has VR_RANGE but op0 does not, something
2454              can be deduced just from that range.  Say [min, max] / [4, max]
2455              gives [min / 4, max / 4] range.  */
2456           if (vr1.type == VR_RANGE
2457               && !symbolic_range_p (&vr1)
2458               && !range_includes_zero_p (&vr1))
2459             {
2460               vr0.type = type = VR_RANGE;
2461               vr0.min = vrp_val_min (TREE_TYPE (op0));
2462               vr0.max = vrp_val_max (TREE_TYPE (op1));
2463             }
2464           else
2465             {
2466               set_value_range_to_varying (vr);
2467               return;
2468             }
2469         }
2470
2471       /* For divisions, if flag_non_call_exceptions is true, we must
2472          not eliminate a division by zero.  */
2473       if ((code == TRUNC_DIV_EXPR
2474            || code == FLOOR_DIV_EXPR
2475            || code == CEIL_DIV_EXPR
2476            || code == EXACT_DIV_EXPR
2477            || code == ROUND_DIV_EXPR)
2478           && cfun->can_throw_non_call_exceptions
2479           && (vr1.type != VR_RANGE
2480               || symbolic_range_p (&vr1)
2481               || range_includes_zero_p (&vr1)))
2482         {
2483           set_value_range_to_varying (vr);
2484           return;
2485         }
2486
2487       /* For divisions, if op0 is VR_RANGE, we can deduce a range
2488          even if op1 is VR_VARYING, VR_ANTI_RANGE, symbolic or can
2489          include 0.  */
2490       if ((code == TRUNC_DIV_EXPR
2491            || code == FLOOR_DIV_EXPR
2492            || code == CEIL_DIV_EXPR
2493            || code == EXACT_DIV_EXPR
2494            || code == ROUND_DIV_EXPR)
2495           && vr0.type == VR_RANGE
2496           && (vr1.type != VR_RANGE
2497               || symbolic_range_p (&vr1)
2498               || range_includes_zero_p (&vr1)))
2499         {
2500           tree zero = build_int_cst (TREE_TYPE (vr0.min), 0);
2501           int cmp;
2502
2503           sop = false;
2504           min = NULL_TREE;
2505           max = NULL_TREE;
2506           if (vrp_expr_computes_nonnegative (op1, &sop) && !sop)
2507             {
2508               /* For unsigned division or when divisor is known
2509                  to be non-negative, the range has to cover
2510                  all numbers from 0 to max for positive max
2511                  and all numbers from min to 0 for negative min.  */
2512               cmp = compare_values (vr0.max, zero);
2513               if (cmp == -1)
2514                 max = zero;
2515               else if (cmp == 0 || cmp == 1)
2516                 max = vr0.max;
2517               else
2518                 type = VR_VARYING;
2519               cmp = compare_values (vr0.min, zero);
2520               if (cmp == 1)
2521                 min = zero;
2522               else if (cmp == 0 || cmp == -1)
2523                 min = vr0.min;
2524               else
2525                 type = VR_VARYING;
2526             }
2527           else
2528             {
2529               /* Otherwise the range is -max .. max or min .. -min
2530                  depending on which bound is bigger in absolute value,
2531                  as the division can change the sign.  */
2532               abs_extent_range (vr, vr0.min, vr0.max);
2533               return;
2534             }
2535           if (type == VR_VARYING)
2536             {
2537               set_value_range_to_varying (vr);
2538               return;
2539             }
2540         }
2541
2542       /* Multiplications and divisions are a bit tricky to handle,
2543          depending on the mix of signs we have in the two ranges, we
2544          need to operate on different values to get the minimum and
2545          maximum values for the new range.  One approach is to figure
2546          out all the variations of range combinations and do the
2547          operations.
2548
2549          However, this involves several calls to compare_values and it
2550          is pretty convoluted.  It's simpler to do the 4 operations
2551          (MIN0 OP MIN1, MIN0 OP MAX1, MAX0 OP MIN1 and MAX0 OP MAX0 OP
2552          MAX1) and then figure the smallest and largest values to form
2553          the new range.  */
2554       else
2555         {
2556           gcc_assert ((vr0.type == VR_RANGE
2557                        || (code == MULT_EXPR && vr0.type == VR_ANTI_RANGE))
2558                       && vr0.type == vr1.type);
2559
2560           /* Compute the 4 cross operations.  */
2561           sop = false;
2562           val[0] = vrp_int_const_binop (code, vr0.min, vr1.min);
2563           if (val[0] == NULL_TREE)
2564             sop = true;
2565
2566           if (vr1.max == vr1.min)
2567             val[1] = NULL_TREE;
2568           else
2569             {
2570               val[1] = vrp_int_const_binop (code, vr0.min, vr1.max);
2571               if (val[1] == NULL_TREE)
2572                 sop = true;
2573             }
2574
2575           if (vr0.max == vr0.min)
2576             val[2] = NULL_TREE;
2577           else
2578             {
2579               val[2] = vrp_int_const_binop (code, vr0.max, vr1.min);
2580               if (val[2] == NULL_TREE)
2581                 sop = true;
2582             }
2583
2584           if (vr0.min == vr0.max || vr1.min == vr1.max)
2585             val[3] = NULL_TREE;
2586           else
2587             {
2588               val[3] = vrp_int_const_binop (code, vr0.max, vr1.max);
2589               if (val[3] == NULL_TREE)
2590                 sop = true;
2591             }
2592
2593           if (sop)
2594             {
2595               set_value_range_to_varying (vr);
2596               return;
2597             }
2598
2599           /* Set MIN to the minimum of VAL[i] and MAX to the maximum
2600              of VAL[i].  */
2601           min = val[0];
2602           max = val[0];
2603           for (i = 1; i < 4; i++)
2604             {
2605               if (!is_gimple_min_invariant (min)
2606                   || (TREE_OVERFLOW (min) && !is_overflow_infinity (min))
2607                   || !is_gimple_min_invariant (max)
2608                   || (TREE_OVERFLOW (max) && !is_overflow_infinity (max)))
2609                 break;
2610
2611               if (val[i])
2612                 {
2613                   if (!is_gimple_min_invariant (val[i])
2614                       || (TREE_OVERFLOW (val[i])
2615                           && !is_overflow_infinity (val[i])))
2616                     {
2617                       /* If we found an overflowed value, set MIN and MAX
2618                          to it so that we set the resulting range to
2619                          VARYING.  */
2620                       min = max = val[i];
2621                       break;
2622                     }
2623
2624                   if (compare_values (val[i], min) == -1)
2625                     min = val[i];
2626
2627                   if (compare_values (val[i], max) == 1)
2628                     max = val[i];
2629                 }
2630             }
2631         }
2632     }
2633   else if (code == TRUNC_MOD_EXPR)
2634     {
2635       bool sop = false;
2636       if (vr1.type != VR_RANGE
2637           || symbolic_range_p (&vr1)
2638           || range_includes_zero_p (&vr1)
2639           || vrp_val_is_min (vr1.min))
2640         {
2641           set_value_range_to_varying (vr);
2642           return;
2643         }
2644       type = VR_RANGE;
2645       /* Compute MAX <|vr1.min|, |vr1.max|> - 1.  */
2646       max = fold_unary_to_constant (ABS_EXPR, TREE_TYPE (vr1.min), vr1.min);
2647       if (tree_int_cst_lt (max, vr1.max))
2648         max = vr1.max;
2649       max = int_const_binop (MINUS_EXPR, max, integer_one_node);
2650       /* If the dividend is non-negative the modulus will be
2651          non-negative as well.  */
2652       if (TYPE_UNSIGNED (TREE_TYPE (max))
2653           || (vrp_expr_computes_nonnegative (op0, &sop) && !sop))
2654         min = build_int_cst (TREE_TYPE (max), 0);
2655       else
2656         min = fold_unary_to_constant (NEGATE_EXPR, TREE_TYPE (max), max);
2657     }
2658   else if (code == MINUS_EXPR)
2659     {
2660       /* If we have a MINUS_EXPR with two VR_ANTI_RANGEs, drop to
2661          VR_VARYING.  It would take more effort to compute a precise
2662          range for such a case.  For example, if we have op0 == 1 and
2663          op1 == 1 with their ranges both being ~[0,0], we would have
2664          op0 - op1 == 0, so we cannot claim that the difference is in
2665          ~[0,0].  Note that we are guaranteed to have
2666          vr0.type == vr1.type at this point.  */
2667       if (vr0.type == VR_ANTI_RANGE)
2668         {
2669           set_value_range_to_varying (vr);
2670           return;
2671         }
2672
2673       /* For MINUS_EXPR, apply the operation to the opposite ends of
2674          each range.  */
2675       min = vrp_int_const_binop (code, vr0.min, vr1.max);
2676       max = vrp_int_const_binop (code, vr0.max, vr1.min);
2677     }
2678   else if (code == BIT_AND_EXPR || code == BIT_IOR_EXPR)
2679     {
2680       bool vr0_int_cst_singleton_p, vr1_int_cst_singleton_p;
2681       bool int_cst_range0, int_cst_range1;
2682       double_int may_be_nonzero0, may_be_nonzero1;
2683       double_int must_be_nonzero0, must_be_nonzero1;
2684
2685       vr0_int_cst_singleton_p = range_int_cst_singleton_p (&vr0);
2686       vr1_int_cst_singleton_p = range_int_cst_singleton_p (&vr1);
2687       int_cst_range0 = zero_nonzero_bits_from_vr (&vr0, &may_be_nonzero0,
2688                                                   &must_be_nonzero0);
2689       int_cst_range1 = zero_nonzero_bits_from_vr (&vr1, &may_be_nonzero1,
2690                                                   &must_be_nonzero1);
2691
2692       type = VR_RANGE;
2693       if (vr0_int_cst_singleton_p && vr1_int_cst_singleton_p)
2694         min = max = int_const_binop (code, vr0.max, vr1.max);
2695       else if (!int_cst_range0 && !int_cst_range1)
2696         {
2697           set_value_range_to_varying (vr);
2698           return;
2699         }
2700       else if (code == BIT_AND_EXPR)
2701         {
2702           min = double_int_to_tree (expr_type,
2703                                     double_int_and (must_be_nonzero0,
2704                                                     must_be_nonzero1));
2705           max = double_int_to_tree (expr_type,
2706                                     double_int_and (may_be_nonzero0,
2707                                                     may_be_nonzero1));
2708           if (TREE_OVERFLOW (min) || tree_int_cst_sgn (min) < 0)
2709             min = NULL_TREE;
2710           if (TREE_OVERFLOW (max) || tree_int_cst_sgn (max) < 0)
2711             max = NULL_TREE;
2712           if (int_cst_range0 && tree_int_cst_sgn (vr0.min) >= 0)
2713             {
2714               if (min == NULL_TREE)
2715                 min = build_int_cst (expr_type, 0);
2716               if (max == NULL_TREE || tree_int_cst_lt (vr0.max, max))
2717                 max = vr0.max;
2718             }
2719           if (int_cst_range1 && tree_int_cst_sgn (vr1.min) >= 0)
2720             {
2721               if (min == NULL_TREE)
2722                 min = build_int_cst (expr_type, 0);
2723               if (max == NULL_TREE || tree_int_cst_lt (vr1.max, max))
2724                 max = vr1.max;
2725             }
2726         }
2727       else if (!int_cst_range0
2728                || !int_cst_range1
2729                || tree_int_cst_sgn (vr0.min) < 0
2730                || tree_int_cst_sgn (vr1.min) < 0)
2731         {
2732           set_value_range_to_varying (vr);
2733           return;
2734         }
2735       else
2736         {
2737           min = double_int_to_tree (expr_type,
2738                                     double_int_ior (must_be_nonzero0,
2739                                                     must_be_nonzero1));
2740           max = double_int_to_tree (expr_type,
2741                                     double_int_ior (may_be_nonzero0,
2742                                                     may_be_nonzero1));
2743           if (TREE_OVERFLOW (min) || tree_int_cst_sgn (min) < 0)
2744             min = vr0.min;
2745           else
2746             min = vrp_int_const_binop (MAX_EXPR, min, vr0.min);
2747           if (TREE_OVERFLOW (max) || tree_int_cst_sgn (max) < 0)
2748             max = NULL_TREE;
2749           min = vrp_int_const_binop (MAX_EXPR, min, vr1.min);
2750         }
2751     }
2752   else
2753     gcc_unreachable ();
2754
2755   /* If either MIN or MAX overflowed, then set the resulting range to
2756      VARYING.  But we do accept an overflow infinity
2757      representation.  */
2758   if (min == NULL_TREE
2759       || !is_gimple_min_invariant (min)
2760       || (TREE_OVERFLOW (min) && !is_overflow_infinity (min))
2761       || max == NULL_TREE
2762       || !is_gimple_min_invariant (max)
2763       || (TREE_OVERFLOW (max) && !is_overflow_infinity (max)))
2764     {
2765       set_value_range_to_varying (vr);
2766       return;
2767     }
2768
2769   /* We punt if:
2770      1) [-INF, +INF]
2771      2) [-INF, +-INF(OVF)]
2772      3) [+-INF(OVF), +INF]
2773      4) [+-INF(OVF), +-INF(OVF)]
2774      We learn nothing when we have INF and INF(OVF) on both sides.
2775      Note that we do accept [-INF, -INF] and [+INF, +INF] without
2776      overflow.  */
2777   if ((vrp_val_is_min (min) || is_overflow_infinity (min))
2778       && (vrp_val_is_max (max) || is_overflow_infinity (max)))
2779     {
2780       set_value_range_to_varying (vr);
2781       return;
2782     }
2783
2784   cmp = compare_values (min, max);
2785   if (cmp == -2 || cmp == 1)
2786     {
2787       /* If the new range has its limits swapped around (MIN > MAX),
2788          then the operation caused one of them to wrap around, mark
2789          the new range VARYING.  */
2790       set_value_range_to_varying (vr);
2791     }
2792   else
2793     set_value_range (vr, type, min, max, NULL);
2794 }
2795
2796
2797 /* Extract range information from a unary expression EXPR based on
2798    the range of its operand and the expression code.  */
2799
2800 static void
2801 extract_range_from_unary_expr (value_range_t *vr, enum tree_code code,
2802                                tree type, tree op0)
2803 {
2804   tree min, max;
2805   int cmp;
2806   value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
2807
2808   /* Refuse to operate on certain unary expressions for which we
2809      cannot easily determine a resulting range.  */
2810   if (code == FIX_TRUNC_EXPR
2811       || code == FLOAT_EXPR
2812       || code == BIT_NOT_EXPR
2813       || code == CONJ_EXPR)
2814     {
2815       /* We can still do constant propagation here.  */
2816       if ((op0 = op_with_constant_singleton_value_range (op0)) != NULL_TREE)
2817         {
2818           tree tem = fold_unary (code, type, op0);
2819           if (tem
2820               && is_gimple_min_invariant (tem)
2821               && !is_overflow_infinity (tem))
2822             {
2823               set_value_range (vr, VR_RANGE, tem, tem, NULL);
2824               return;
2825             }
2826         }
2827       set_value_range_to_varying (vr);
2828       return;
2829     }
2830
2831   /* Get value ranges for the operand.  For constant operands, create
2832      a new value range with the operand to simplify processing.  */
2833   if (TREE_CODE (op0) == SSA_NAME)
2834     vr0 = *(get_value_range (op0));
2835   else if (is_gimple_min_invariant (op0))
2836     set_value_range_to_value (&vr0, op0, NULL);
2837   else
2838     set_value_range_to_varying (&vr0);
2839
2840   /* If VR0 is UNDEFINED, so is the result.  */
2841   if (vr0.type == VR_UNDEFINED)
2842     {
2843       set_value_range_to_undefined (vr);
2844       return;
2845     }
2846
2847   /* Refuse to operate on symbolic ranges, or if neither operand is
2848      a pointer or integral type.  */
2849   if ((!INTEGRAL_TYPE_P (TREE_TYPE (op0))
2850        && !POINTER_TYPE_P (TREE_TYPE (op0)))
2851       || (vr0.type != VR_VARYING
2852           && symbolic_range_p (&vr0)))
2853     {
2854       set_value_range_to_varying (vr);
2855       return;
2856     }
2857
2858   /* If the expression involves pointers, we are only interested in
2859      determining if it evaluates to NULL [0, 0] or non-NULL (~[0, 0]).  */
2860   if (POINTER_TYPE_P (type) || POINTER_TYPE_P (TREE_TYPE (op0)))
2861     {
2862       bool sop;
2863
2864       sop = false;
2865       if (range_is_nonnull (&vr0)
2866           || (tree_unary_nonzero_warnv_p (code, type, op0, &sop)
2867               && !sop))
2868         set_value_range_to_nonnull (vr, type);
2869       else if (range_is_null (&vr0))
2870         set_value_range_to_null (vr, type);
2871       else
2872         set_value_range_to_varying (vr);
2873
2874       return;
2875     }
2876
2877   /* Handle unary expressions on integer ranges.  */
2878   if (CONVERT_EXPR_CODE_P (code)
2879       && INTEGRAL_TYPE_P (type)
2880       && INTEGRAL_TYPE_P (TREE_TYPE (op0)))
2881     {
2882       tree inner_type = TREE_TYPE (op0);
2883       tree outer_type = type;
2884
2885       /* If VR0 is varying and we increase the type precision, assume
2886          a full range for the following transformation.  */
2887       if (vr0.type == VR_VARYING
2888           && TYPE_PRECISION (inner_type) < TYPE_PRECISION (outer_type))
2889         {
2890           vr0.type = VR_RANGE;
2891           vr0.min = TYPE_MIN_VALUE (inner_type);
2892           vr0.max = TYPE_MAX_VALUE (inner_type);
2893         }
2894
2895       /* If VR0 is a constant range or anti-range and the conversion is
2896          not truncating we can convert the min and max values and
2897          canonicalize the resulting range.  Otherwise we can do the
2898          conversion if the size of the range is less than what the
2899          precision of the target type can represent and the range is
2900          not an anti-range.  */
2901       if ((vr0.type == VR_RANGE
2902            || vr0.type == VR_ANTI_RANGE)
2903           && TREE_CODE (vr0.min) == INTEGER_CST
2904           && TREE_CODE (vr0.max) == INTEGER_CST
2905           && (!is_overflow_infinity (vr0.min)
2906               || (vr0.type == VR_RANGE
2907                   && TYPE_PRECISION (outer_type) > TYPE_PRECISION (inner_type)
2908                   && needs_overflow_infinity (outer_type)
2909                   && supports_overflow_infinity (outer_type)))
2910           && (!is_overflow_infinity (vr0.max)
2911               || (vr0.type == VR_RANGE
2912                   && TYPE_PRECISION (outer_type) > TYPE_PRECISION (inner_type)
2913                   && needs_overflow_infinity (outer_type)
2914                   && supports_overflow_infinity (outer_type)))
2915           && (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
2916               || (vr0.type == VR_RANGE
2917                   && integer_zerop (int_const_binop (RSHIFT_EXPR,
2918                        int_const_binop (MINUS_EXPR, vr0.max, vr0.min),
2919                          size_int (TYPE_PRECISION (outer_type)))))))
2920         {
2921           tree new_min, new_max;
2922           new_min = force_fit_type_double (outer_type,
2923                                            tree_to_double_int (vr0.min),
2924                                            0, false);
2925           new_max = force_fit_type_double (outer_type,
2926                                            tree_to_double_int (vr0.max),
2927                                            0, false);
2928           if (is_overflow_infinity (vr0.min))
2929             new_min = negative_overflow_infinity (outer_type);
2930           if (is_overflow_infinity (vr0.max))
2931             new_max = positive_overflow_infinity (outer_type);
2932           set_and_canonicalize_value_range (vr, vr0.type,
2933                                             new_min, new_max, NULL);
2934           return;
2935         }
2936
2937       set_value_range_to_varying (vr);
2938       return;
2939     }
2940
2941   /* Conversion of a VR_VARYING value to a wider type can result
2942      in a usable range.  So wait until after we've handled conversions
2943      before dropping the result to VR_VARYING if we had a source
2944      operand that is VR_VARYING.  */
2945   if (vr0.type == VR_VARYING)
2946     {
2947       set_value_range_to_varying (vr);
2948       return;
2949     }
2950
2951   /* Apply the operation to each end of the range and see what we end
2952      up with.  */
2953   if (code == NEGATE_EXPR
2954       && !TYPE_UNSIGNED (type))
2955     {
2956       /* NEGATE_EXPR flips the range around.  We need to treat
2957          TYPE_MIN_VALUE specially.  */
2958       if (is_positive_overflow_infinity (vr0.max))
2959         min = negative_overflow_infinity (type);
2960       else if (is_negative_overflow_infinity (vr0.max))
2961         min = positive_overflow_infinity (type);
2962       else if (!vrp_val_is_min (vr0.max))
2963         min = fold_unary_to_constant (code, type, vr0.max);
2964       else if (needs_overflow_infinity (type))
2965         {
2966           if (supports_overflow_infinity (type)
2967               && !is_overflow_infinity (vr0.min)
2968               && !vrp_val_is_min (vr0.min))
2969             min = positive_overflow_infinity (type);
2970           else
2971             {
2972               set_value_range_to_varying (vr);
2973               return;
2974             }
2975         }
2976       else
2977         min = TYPE_MIN_VALUE (type);
2978
2979       if (is_positive_overflow_infinity (vr0.min))
2980         max = negative_overflow_infinity (type);
2981       else if (is_negative_overflow_infinity (vr0.min))
2982         max = positive_overflow_infinity (type);
2983       else if (!vrp_val_is_min (vr0.min))
2984         max = fold_unary_to_constant (code, type, vr0.min);
2985       else if (needs_overflow_infinity (type))
2986         {
2987           if (supports_overflow_infinity (type))
2988             max = positive_overflow_infinity (type);
2989           else
2990             {
2991               set_value_range_to_varying (vr);
2992               return;
2993             }
2994         }
2995       else
2996         max = TYPE_MIN_VALUE (type);
2997     }
2998   else if (code == NEGATE_EXPR
2999            && TYPE_UNSIGNED (type))
3000     {
3001       if (!range_includes_zero_p (&vr0))
3002         {
3003           max = fold_unary_to_constant (code, type, vr0.min);
3004           min = fold_unary_to_constant (code, type, vr0.max);
3005         }
3006       else
3007         {
3008           if (range_is_null (&vr0))
3009             set_value_range_to_null (vr, type);
3010           else
3011             set_value_range_to_varying (vr);
3012           return;
3013         }
3014     }
3015   else if (code == ABS_EXPR
3016            && !TYPE_UNSIGNED (type))
3017     {
3018       /* -TYPE_MIN_VALUE = TYPE_MIN_VALUE with flag_wrapv so we can't get a
3019          useful range.  */
3020       if (!TYPE_OVERFLOW_UNDEFINED (type)
3021           && ((vr0.type == VR_RANGE
3022                && vrp_val_is_min (vr0.min))
3023               || (vr0.type == VR_ANTI_RANGE
3024                   && !vrp_val_is_min (vr0.min)
3025                   && !range_includes_zero_p (&vr0))))
3026         {
3027           set_value_range_to_varying (vr);
3028           return;
3029         }
3030
3031       /* ABS_EXPR may flip the range around, if the original range
3032          included negative values.  */
3033       if (is_overflow_infinity (vr0.min))
3034         min = positive_overflow_infinity (type);
3035       else if (!vrp_val_is_min (vr0.min))
3036         min = fold_unary_to_constant (code, type, vr0.min);
3037       else if (!needs_overflow_infinity (type))
3038         min = TYPE_MAX_VALUE (type);
3039       else if (supports_overflow_infinity (type))
3040         min = positive_overflow_infinity (type);
3041       else
3042         {
3043           set_value_range_to_varying (vr);
3044           return;
3045         }
3046
3047       if (is_overflow_infinity (vr0.max))
3048         max = positive_overflow_infinity (type);
3049       else if (!vrp_val_is_min (vr0.max))
3050         max = fold_unary_to_constant (code, type, vr0.max);
3051       else if (!needs_overflow_infinity (type))
3052         max = TYPE_MAX_VALUE (type);
3053       else if (supports_overflow_infinity (type)
3054                /* We shouldn't generate [+INF, +INF] as set_value_range
3055                   doesn't like this and ICEs.  */
3056                && !is_positive_overflow_infinity (min))
3057         max = positive_overflow_infinity (type);
3058       else
3059         {
3060           set_value_range_to_varying (vr);
3061           return;
3062         }
3063
3064       cmp = compare_values (min, max);
3065
3066       /* If a VR_ANTI_RANGEs contains zero, then we have
3067          ~[-INF, min(MIN, MAX)].  */
3068       if (vr0.type == VR_ANTI_RANGE)
3069         {
3070           if (range_includes_zero_p (&vr0))
3071             {
3072               /* Take the lower of the two values.  */
3073               if (cmp != 1)
3074                 max = min;
3075
3076               /* Create ~[-INF, min (abs(MIN), abs(MAX))]
3077                  or ~[-INF + 1, min (abs(MIN), abs(MAX))] when
3078                  flag_wrapv is set and the original anti-range doesn't include
3079                  TYPE_MIN_VALUE, remember -TYPE_MIN_VALUE = TYPE_MIN_VALUE.  */
3080               if (TYPE_OVERFLOW_WRAPS (type))
3081                 {
3082                   tree type_min_value = TYPE_MIN_VALUE (type);
3083
3084                   min = (vr0.min != type_min_value
3085                          ? int_const_binop (PLUS_EXPR, type_min_value,
3086                                             integer_one_node)
3087                          : type_min_value);
3088                 }
3089               else
3090                 {
3091                   if (overflow_infinity_range_p (&vr0))
3092                     min = negative_overflow_infinity (type);
3093                   else
3094                     min = TYPE_MIN_VALUE (type);
3095                 }
3096             }
3097           else
3098             {
3099               /* All else has failed, so create the range [0, INF], even for
3100                  flag_wrapv since TYPE_MIN_VALUE is in the original
3101                  anti-range.  */
3102               vr0.type = VR_RANGE;
3103               min = build_int_cst (type, 0);
3104               if (needs_overflow_infinity (type))
3105                 {
3106                   if (supports_overflow_infinity (type))
3107                     max = positive_overflow_infinity (type);
3108                   else
3109                     {
3110                       set_value_range_to_varying (vr);
3111                       return;
3112                     }
3113                 }
3114               else
3115                 max = TYPE_MAX_VALUE (type);
3116             }
3117         }
3118
3119       /* If the range contains zero then we know that the minimum value in the
3120          range will be zero.  */
3121       else if (range_includes_zero_p (&vr0))
3122         {
3123           if (cmp == 1)
3124             max = min;
3125           min = build_int_cst (type, 0);
3126         }
3127       else
3128         {
3129           /* If the range was reversed, swap MIN and MAX.  */
3130           if (cmp == 1)
3131             {
3132               tree t = min;
3133               min = max;
3134               max = t;
3135             }
3136         }
3137     }
3138   else
3139     {
3140       /* Otherwise, operate on each end of the range.  */
3141       min = fold_unary_to_constant (code, type, vr0.min);
3142       max = fold_unary_to_constant (code, type, vr0.max);
3143
3144       if (needs_overflow_infinity (type))
3145         {
3146           gcc_assert (code != NEGATE_EXPR && code != ABS_EXPR);
3147
3148           /* If both sides have overflowed, we don't know
3149              anything.  */
3150           if ((is_overflow_infinity (vr0.min)
3151                || TREE_OVERFLOW (min))
3152               && (is_overflow_infinity (vr0.max)
3153                   || TREE_OVERFLOW (max)))
3154             {
3155               set_value_range_to_varying (vr);
3156               return;
3157             }
3158
3159           if (is_overflow_infinity (vr0.min))
3160             min = vr0.min;
3161           else if (TREE_OVERFLOW (min))
3162             {
3163               if (supports_overflow_infinity (type))
3164                 min = (tree_int_cst_sgn (min) >= 0
3165                        ? positive_overflow_infinity (TREE_TYPE (min))
3166                        : negative_overflow_infinity (TREE_TYPE (min)));
3167               else
3168                 {
3169                   set_value_range_to_varying (vr);
3170                   return;
3171                 }
3172             }
3173
3174           if (is_overflow_infinity (vr0.max))
3175             max = vr0.max;
3176           else if (TREE_OVERFLOW (max))
3177             {
3178               if (supports_overflow_infinity (type))
3179                 max = (tree_int_cst_sgn (max) >= 0
3180                        ? positive_overflow_infinity (TREE_TYPE (max))
3181                        : negative_overflow_infinity (TREE_TYPE (max)));
3182               else
3183                 {
3184                   set_value_range_to_varying (vr);
3185                   return;
3186                 }
3187             }
3188         }
3189     }
3190
3191   cmp = compare_values (min, max);
3192   if (cmp == -2 || cmp == 1)
3193     {
3194       /* If the new range has its limits swapped around (MIN > MAX),
3195          then the operation caused one of them to wrap around, mark
3196          the new range VARYING.  */
3197       set_value_range_to_varying (vr);
3198     }
3199   else
3200     set_value_range (vr, vr0.type, min, max, NULL);
3201 }
3202
3203
3204 /* Extract range information from a conditional expression EXPR based on
3205    the ranges of each of its operands and the expression code.  */
3206
3207 static void
3208 extract_range_from_cond_expr (value_range_t *vr, tree expr)
3209 {
3210   tree op0, op1;
3211   value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
3212   value_range_t vr1 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
3213
3214   /* Get value ranges for each operand.  For constant operands, create
3215      a new value range with the operand to simplify processing.  */
3216   op0 = COND_EXPR_THEN (expr);
3217   if (TREE_CODE (op0) == SSA_NAME)
3218     vr0 = *(get_value_range (op0));
3219   else if (is_gimple_min_invariant (op0))
3220     set_value_range_to_value (&vr0, op0, NULL);
3221   else
3222     set_value_range_to_varying (&vr0);
3223
3224   op1 = COND_EXPR_ELSE (expr);
3225   if (TREE_CODE (op1) == SSA_NAME)
3226     vr1 = *(get_value_range (op1));
3227   else if (is_gimple_min_invariant (op1))
3228     set_value_range_to_value (&vr1, op1, NULL);
3229   else
3230     set_value_range_to_varying (&vr1);
3231
3232   /* The resulting value range is the union of the operand ranges */
3233   vrp_meet (&vr0, &vr1);
3234   copy_value_range (vr, &vr0);
3235 }
3236
3237
3238 /* Extract range information from a comparison expression EXPR based
3239    on the range of its operand and the expression code.  */
3240
3241 static void
3242 extract_range_from_comparison (value_range_t *vr, enum tree_code code,
3243                                tree type, tree op0, tree op1)
3244 {
3245   bool sop = false;
3246   tree val;
3247
3248   val = vrp_evaluate_conditional_warnv_with_ops (code, op0, op1, false, &sop,
3249                                                  NULL);
3250
3251   /* A disadvantage of using a special infinity as an overflow
3252      representation is that we lose the ability to record overflow
3253      when we don't have an infinity.  So we have to ignore a result
3254      which relies on overflow.  */
3255
3256   if (val && !is_overflow_infinity (val) && !sop)
3257     {
3258       /* Since this expression was found on the RHS of an assignment,
3259          its type may be different from _Bool.  Convert VAL to EXPR's
3260          type.  */
3261       val = fold_convert (type, val);
3262       if (is_gimple_min_invariant (val))
3263         set_value_range_to_value (vr, val, vr->equiv);
3264       else
3265         set_value_range (vr, VR_RANGE, val, val, vr->equiv);
3266     }
3267   else
3268     /* The result of a comparison is always true or false.  */
3269     set_value_range_to_truthvalue (vr, type);
3270 }
3271
3272 /* Try to derive a nonnegative or nonzero range out of STMT relying
3273    primarily on generic routines in fold in conjunction with range data.
3274    Store the result in *VR */
3275
3276 static void
3277 extract_range_basic (value_range_t *vr, gimple stmt)
3278 {
3279   bool sop = false;
3280   tree type = gimple_expr_type (stmt);
3281
3282   if (INTEGRAL_TYPE_P (type)
3283       && gimple_stmt_nonnegative_warnv_p (stmt, &sop))
3284     set_value_range_to_nonnegative (vr, type,
3285                                     sop || stmt_overflow_infinity (stmt));
3286   else if (vrp_stmt_computes_nonzero (stmt, &sop)
3287            && !sop)
3288     set_value_range_to_nonnull (vr, type);
3289   else
3290     set_value_range_to_varying (vr);
3291 }
3292
3293
3294 /* Try to compute a useful range out of assignment STMT and store it
3295    in *VR.  */
3296
3297 static void
3298 extract_range_from_assignment (value_range_t *vr, gimple stmt)
3299 {
3300   enum tree_code code = gimple_assign_rhs_code (stmt);
3301
3302   if (code == ASSERT_EXPR)
3303     extract_range_from_assert (vr, gimple_assign_rhs1 (stmt));
3304   else if (code == SSA_NAME)
3305     extract_range_from_ssa_name (vr, gimple_assign_rhs1 (stmt));
3306   else if (TREE_CODE_CLASS (code) == tcc_binary
3307            || code == TRUTH_AND_EXPR
3308            || code == TRUTH_OR_EXPR
3309            || code == TRUTH_XOR_EXPR)
3310     extract_range_from_binary_expr (vr, gimple_assign_rhs_code (stmt),
3311                                     gimple_expr_type (stmt),
3312                                     gimple_assign_rhs1 (stmt),
3313                                     gimple_assign_rhs2 (stmt));
3314   else if (TREE_CODE_CLASS (code) == tcc_unary)
3315     extract_range_from_unary_expr (vr, gimple_assign_rhs_code (stmt),
3316                                    gimple_expr_type (stmt),
3317                                    gimple_assign_rhs1 (stmt));
3318   else if (code == COND_EXPR)
3319     extract_range_from_cond_expr (vr, gimple_assign_rhs1 (stmt));
3320   else if (TREE_CODE_CLASS (code) == tcc_comparison)
3321     extract_range_from_comparison (vr, gimple_assign_rhs_code (stmt),
3322                                    gimple_expr_type (stmt),
3323                                    gimple_assign_rhs1 (stmt),
3324                                    gimple_assign_rhs2 (stmt));
3325   else if (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS
3326            && is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))
3327     set_value_range_to_value (vr, gimple_assign_rhs1 (stmt), NULL);
3328   else
3329     set_value_range_to_varying (vr);
3330
3331   if (vr->type == VR_VARYING)
3332     extract_range_basic (vr, stmt);
3333 }
3334
3335 /* Given a range VR, a LOOP and a variable VAR, determine whether it
3336    would be profitable to adjust VR using scalar evolution information
3337    for VAR.  If so, update VR with the new limits.  */
3338
3339 static void
3340 adjust_range_with_scev (value_range_t *vr, struct loop *loop,
3341                         gimple stmt, tree var)
3342 {
3343   tree init, step, chrec, tmin, tmax, min, max, type, tem;
3344   enum ev_direction dir;
3345
3346   /* TODO.  Don't adjust anti-ranges.  An anti-range may provide
3347      better opportunities than a regular range, but I'm not sure.  */
3348   if (vr->type == VR_ANTI_RANGE)
3349     return;
3350
3351   chrec = instantiate_parameters (loop, analyze_scalar_evolution (loop, var));
3352
3353   /* Like in PR19590, scev can return a constant function.  */
3354   if (is_gimple_min_invariant (chrec))
3355     {
3356       set_value_range_to_value (vr, chrec, vr->equiv);
3357       return;
3358     }
3359
3360   if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
3361     return;
3362
3363   init = initial_condition_in_loop_num (chrec, loop->num);
3364   tem = op_with_constant_singleton_value_range (init);
3365   if (tem)
3366     init = tem;
3367   step = evolution_part_in_loop_num (chrec, loop->num);
3368   tem = op_with_constant_singleton_value_range (step);
3369   if (tem)
3370     step = tem;
3371
3372   /* If STEP is symbolic, we can't know whether INIT will be the
3373      minimum or maximum value in the range.  Also, unless INIT is
3374      a simple expression, compare_values and possibly other functions
3375      in tree-vrp won't be able to handle it.  */
3376   if (step == NULL_TREE
3377       || !is_gimple_min_invariant (step)
3378       || !valid_value_p (init))
3379     return;
3380
3381   dir = scev_direction (chrec);
3382   if (/* Do not adjust ranges if we do not know whether the iv increases
3383          or decreases,  ... */
3384       dir == EV_DIR_UNKNOWN
3385       /* ... or if it may wrap.  */
3386       || scev_probably_wraps_p (init, step, stmt, get_chrec_loop (chrec),
3387                                 true))
3388     return;
3389
3390   /* We use TYPE_MIN_VALUE and TYPE_MAX_VALUE here instead of
3391      negative_overflow_infinity and positive_overflow_infinity,
3392      because we have concluded that the loop probably does not
3393      wrap.  */
3394
3395   type = TREE_TYPE (var);
3396   if (POINTER_TYPE_P (type) || !TYPE_MIN_VALUE (type))
3397     tmin = lower_bound_in_type (type, type);
3398   else
3399     tmin = TYPE_MIN_VALUE (type);
3400   if (POINTER_TYPE_P (type) || !TYPE_MAX_VALUE (type))
3401     tmax = upper_bound_in_type (type, type);
3402   else
3403     tmax = TYPE_MAX_VALUE (type);
3404
3405   /* Try to use estimated number of iterations for the loop to constrain the
3406      final value in the evolution.
3407      We are interested in the number of executions of the latch, while
3408      nb_iterations_upper_bound includes the last execution of the exit test.  */
3409   if (TREE_CODE (step) == INTEGER_CST
3410       && loop->any_upper_bound
3411       && !double_int_zero_p (loop->nb_iterations_upper_bound)
3412       && is_gimple_val (init)
3413       && (TREE_CODE (init) != SSA_NAME
3414           || get_value_range (init)->type == VR_RANGE))
3415     {
3416       value_range_t maxvr = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
3417       double_int dtmp;
3418       bool unsigned_p = TYPE_UNSIGNED (TREE_TYPE (step));
3419       int overflow = 0;
3420
3421       dtmp = double_int_mul_with_sign (tree_to_double_int (step),
3422                                        double_int_sub (
3423                                            loop->nb_iterations_upper_bound,
3424                                            double_int_one),
3425                                        unsigned_p, &overflow);
3426       tem = double_int_to_tree (TREE_TYPE (init), dtmp);
3427       /* If the multiplication overflowed we can't do a meaningful
3428          adjustment.  */
3429       if (!overflow && double_int_equal_p (dtmp, tree_to_double_int (tem)))
3430         {
3431           extract_range_from_binary_expr (&maxvr, PLUS_EXPR,
3432                                           TREE_TYPE (init), init, tem);
3433           /* Likewise if the addition did.  */
3434           if (maxvr.type == VR_RANGE)
3435             {
3436               tmin = maxvr.min;
3437               tmax = maxvr.max;
3438             }
3439         }
3440     }
3441
3442   if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
3443     {
3444       min = tmin;
3445       max = tmax;
3446
3447       /* For VARYING or UNDEFINED ranges, just about anything we get
3448          from scalar evolutions should be better.  */
3449
3450       if (dir == EV_DIR_DECREASES)
3451         max = init;
3452       else
3453         min = init;
3454
3455       /* If we would create an invalid range, then just assume we
3456          know absolutely nothing.  This may be over-conservative,
3457          but it's clearly safe, and should happen only in unreachable
3458          parts of code, or for invalid programs.  */
3459       if (compare_values (min, max) == 1)
3460         return;
3461
3462       set_value_range (vr, VR_RANGE, min, max, vr->equiv);
3463     }
3464   else if (vr->type == VR_RANGE)
3465     {
3466       min = vr->min;
3467       max = vr->max;
3468
3469       if (dir == EV_DIR_DECREASES)
3470         {
3471           /* INIT is the maximum value.  If INIT is lower than VR->MAX
3472              but no smaller than VR->MIN, set VR->MAX to INIT.  */
3473           if (compare_values (init, max) == -1)
3474             max = init;
3475
3476           /* According to the loop information, the variable does not
3477              overflow.  If we think it does, probably because of an
3478              overflow due to arithmetic on a different INF value,
3479              reset now.  */
3480           if (is_negative_overflow_infinity (min)
3481               || compare_values (min, tmin) == -1)
3482             min = tmin;
3483
3484         }
3485       else
3486         {
3487           /* If INIT is bigger than VR->MIN, set VR->MIN to INIT.  */
3488           if (compare_values (init, min) == 1)
3489             min = init;
3490
3491           if (is_positive_overflow_infinity (max)
3492               || compare_values (tmax, max) == -1)
3493             max = tmax;
3494         }
3495
3496       /* If we just created an invalid range with the minimum
3497          greater than the maximum, we fail conservatively.
3498          This should happen only in unreachable
3499          parts of code, or for invalid programs.  */
3500       if (compare_values (min, max) == 1)
3501         return;
3502
3503       set_value_range (vr, VR_RANGE, min, max, vr->equiv);
3504     }
3505 }
3506
3507 /* Return true if VAR may overflow at STMT.  This checks any available
3508    loop information to see if we can determine that VAR does not
3509    overflow.  */
3510
3511 static bool
3512 vrp_var_may_overflow (tree var, gimple stmt)
3513 {
3514   struct loop *l;
3515   tree chrec, init, step;
3516
3517   if (current_loops == NULL)
3518     return true;
3519
3520   l = loop_containing_stmt (stmt);
3521   if (l == NULL
3522       || !loop_outer (l))
3523     return true;
3524
3525   chrec = instantiate_parameters (l, analyze_scalar_evolution (l, var));
3526   if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
3527     return true;
3528
3529   init = initial_condition_in_loop_num (chrec, l->num);
3530   step = evolution_part_in_loop_num (chrec, l->num);
3531
3532   if (step == NULL_TREE
3533       || !is_gimple_min_invariant (step)
3534       || !valid_value_p (init))
3535     return true;
3536
3537   /* If we get here, we know something useful about VAR based on the
3538      loop information.  If it wraps, it may overflow.  */
3539
3540   if (scev_probably_wraps_p (init, step, stmt, get_chrec_loop (chrec),
3541                              true))
3542     return true;
3543
3544   if (dump_file && (dump_flags & TDF_DETAILS) != 0)
3545     {
3546       print_generic_expr (dump_file, var, 0);
3547       fprintf (dump_file, ": loop information indicates does not overflow\n");
3548     }
3549
3550   return false;
3551 }
3552
3553
3554 /* Given two numeric value ranges VR0, VR1 and a comparison code COMP:
3555
3556    - Return BOOLEAN_TRUE_NODE if VR0 COMP VR1 always returns true for
3557      all the values in the ranges.
3558
3559    - Return BOOLEAN_FALSE_NODE if the comparison always returns false.
3560
3561    - Return NULL_TREE if it is not always possible to determine the
3562      value of the comparison.
3563
3564    Also set *STRICT_OVERFLOW_P to indicate whether a range with an
3565    overflow infinity was used in the test.  */
3566
3567
3568 static tree
3569 compare_ranges (enum tree_code comp, value_range_t *vr0, value_range_t *vr1,
3570                 bool *strict_overflow_p)
3571 {
3572   /* VARYING or UNDEFINED ranges cannot be compared.  */
3573   if (vr0->type == VR_VARYING
3574       || vr0->type == VR_UNDEFINED
3575       || vr1->type == VR_VARYING
3576       || vr1->type == VR_UNDEFINED)
3577     return NULL_TREE;
3578
3579   /* Anti-ranges need to be handled separately.  */
3580   if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
3581     {
3582       /* If both are anti-ranges, then we cannot compute any
3583          comparison.  */
3584       if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
3585         return NULL_TREE;
3586
3587       /* These comparisons are never statically computable.  */
3588       if (comp == GT_EXPR
3589           || comp == GE_EXPR
3590           || comp == LT_EXPR
3591           || comp == LE_EXPR)
3592         return NULL_TREE;
3593
3594       /* Equality can be computed only between a range and an
3595          anti-range.  ~[VAL1, VAL2] == [VAL1, VAL2] is always false.  */
3596       if (vr0->type == VR_RANGE)
3597         {
3598           /* To simplify processing, make VR0 the anti-range.  */
3599           value_range_t *tmp = vr0;
3600           vr0 = vr1;
3601           vr1 = tmp;
3602         }
3603
3604       gcc_assert (comp == NE_EXPR || comp == EQ_EXPR);
3605
3606       if (compare_values_warnv (vr0->min, vr1->min, strict_overflow_p) == 0
3607           && compare_values_warnv (vr0->max, vr1->max, strict_overflow_p) == 0)
3608         return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
3609
3610       return NULL_TREE;
3611     }
3612
3613   if (!usable_range_p (vr0, strict_overflow_p)
3614       || !usable_range_p (vr1, strict_overflow_p))
3615     return NULL_TREE;
3616
3617   /* Simplify processing.  If COMP is GT_EXPR or GE_EXPR, switch the
3618      operands around and change the comparison code.  */
3619   if (comp == GT_EXPR || comp == GE_EXPR)
3620     {
3621       value_range_t *tmp;
3622       comp = (comp == GT_EXPR) ? LT_EXPR : LE_EXPR;
3623       tmp = vr0;
3624       vr0 = vr1;
3625       vr1 = tmp;
3626     }
3627
3628   if (comp == EQ_EXPR)
3629     {
3630       /* Equality may only be computed if both ranges represent
3631          exactly one value.  */
3632       if (compare_values_warnv (vr0->min, vr0->max, strict_overflow_p) == 0
3633           && compare_values_warnv (vr1->min, vr1->max, strict_overflow_p) == 0)
3634         {
3635           int cmp_min = compare_values_warnv (vr0->min, vr1->min,
3636                                               strict_overflow_p);
3637           int cmp_max = compare_values_warnv (vr0->max, vr1->max,
3638                                               strict_overflow_p);
3639           if (cmp_min == 0 && cmp_max == 0)
3640             return boolean_true_node;
3641           else if (cmp_min != -2 && cmp_max != -2)
3642             return boolean_false_node;
3643         }
3644       /* If [V0_MIN, V1_MAX] < [V1_MIN, V1_MAX] then V0 != V1.  */
3645       else if (compare_values_warnv (vr0->min, vr1->max,
3646                                      strict_overflow_p) == 1
3647                || compare_values_warnv (vr1->min, vr0->max,
3648                                         strict_overflow_p) == 1)
3649         return boolean_false_node;
3650
3651       return NULL_TREE;
3652     }
3653   else if (comp == NE_EXPR)
3654     {
3655       int cmp1, cmp2;
3656
3657       /* If VR0 is completely to the left or completely to the right
3658          of VR1, they are always different.  Notice that we need to
3659          make sure that both comparisons yield similar results to
3660          avoid comparing values that cannot be compared at
3661          compile-time.  */
3662       cmp1 = compare_values_warnv (vr0->max, vr1->min, strict_overflow_p);
3663       cmp2 = compare_values_warnv (vr0->min, vr1->max, strict_overflow_p);
3664       if ((cmp1 == -1 && cmp2 == -1) || (cmp1 == 1 && cmp2 == 1))
3665         return boolean_true_node;
3666
3667       /* If VR0 and VR1 represent a single value and are identical,
3668          return false.  */
3669       else if (compare_values_warnv (vr0->min, vr0->max,
3670                                      strict_overflow_p) == 0
3671                && compare_values_warnv (vr1->min, vr1->max,
3672                                         strict_overflow_p) == 0
3673                && compare_values_warnv (vr0->min, vr1->min,
3674                                         strict_overflow_p) == 0
3675                && compare_values_warnv (vr0->max, vr1->max,
3676                                         strict_overflow_p) == 0)
3677         return boolean_false_node;
3678
3679       /* Otherwise, they may or may not be different.  */
3680       else
3681         return NULL_TREE;
3682     }
3683   else if (comp == LT_EXPR || comp == LE_EXPR)
3684     {
3685       int tst;
3686
3687       /* If VR0 is to the left of VR1, return true.  */
3688       tst = compare_values_warnv (vr0->max, vr1->min, strict_overflow_p);
3689       if ((comp == LT_EXPR && tst == -1)
3690           || (comp == LE_EXPR && (tst == -1 || tst == 0)))
3691         {
3692           if (overflow_infinity_range_p (vr0)
3693               || overflow_infinity_range_p (vr1))
3694             *strict_overflow_p = true;
3695           return boolean_true_node;
3696         }
3697
3698       /* If VR0 is to the right of VR1, return false.  */
3699       tst = compare_values_warnv (vr0->min, vr1->max, strict_overflow_p);
3700       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
3701           || (comp == LE_EXPR && tst == 1))
3702         {
3703           if (overflow_infinity_range_p (vr0)
3704               || overflow_infinity_range_p (vr1))
3705             *strict_overflow_p = true;
3706           return boolean_false_node;
3707         }
3708
3709       /* Otherwise, we don't know.  */
3710       return NULL_TREE;
3711     }
3712
3713   gcc_unreachable ();
3714 }
3715
3716
3717 /* Given a value range VR, a value VAL and a comparison code COMP, return
3718    BOOLEAN_TRUE_NODE if VR COMP VAL always returns true for all the
3719    values in VR.  Return BOOLEAN_FALSE_NODE if the comparison
3720    always returns false.  Return NULL_TREE if it is not always
3721    possible to determine the value of the comparison.  Also set
3722    *STRICT_OVERFLOW_P to indicate whether a range with an overflow
3723    infinity was used in the test.  */
3724
3725 static tree
3726 compare_range_with_value (enum tree_code comp, value_range_t *vr, tree val,
3727                           bool *strict_overflow_p)
3728 {
3729   if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
3730     return NULL_TREE;
3731
3732   /* Anti-ranges need to be handled separately.  */
3733   if (vr->type == VR_ANTI_RANGE)
3734     {
3735       /* For anti-ranges, the only predicates that we can compute at
3736          compile time are equality and inequality.  */
3737       if (comp == GT_EXPR
3738           || comp == GE_EXPR
3739           || comp == LT_EXPR
3740           || comp == LE_EXPR)
3741         return NULL_TREE;
3742
3743       /* ~[VAL_1, VAL_2] OP VAL is known if VAL_1 <= VAL <= VAL_2.  */
3744       if (value_inside_range (val, vr) == 1)
3745         return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
3746
3747       return NULL_TREE;
3748     }
3749
3750   if (!usable_range_p (vr, strict_overflow_p))
3751     return NULL_TREE;
3752
3753   if (comp == EQ_EXPR)
3754     {
3755       /* EQ_EXPR may only be computed if VR represents exactly
3756          one value.  */
3757       if (compare_values_warnv (vr->min, vr->max, strict_overflow_p) == 0)
3758         {
3759           int cmp = compare_values_warnv (vr->min, val, strict_overflow_p);
3760           if (cmp == 0)
3761             return boolean_true_node;
3762           else if (cmp == -1 || cmp == 1 || cmp == 2)
3763             return boolean_false_node;
3764         }
3765       else if (compare_values_warnv (val, vr->min, strict_overflow_p) == -1
3766                || compare_values_warnv (vr->max, val, strict_overflow_p) == -1)
3767         return boolean_false_node;
3768
3769       return NULL_TREE;
3770     }
3771   else if (comp == NE_EXPR)
3772     {
3773       /* If VAL is not inside VR, then they are always different.  */
3774       if (compare_values_warnv (vr->max, val, strict_overflow_p) == -1
3775           || compare_values_warnv (vr->min, val, strict_overflow_p) == 1)
3776         return boolean_true_node;
3777
3778       /* If VR represents exactly one value equal to VAL, then return
3779          false.  */
3780       if (compare_values_warnv (vr->min, vr->max, strict_overflow_p) == 0
3781           && compare_values_warnv (vr->min, val, strict_overflow_p) == 0)
3782         return boolean_false_node;
3783
3784       /* Otherwise, they may or may not be different.  */
3785       return NULL_TREE;
3786     }
3787   else if (comp == LT_EXPR || comp == LE_EXPR)
3788     {
3789       int tst;
3790
3791       /* If VR is to the left of VAL, return true.  */
3792       tst = compare_values_warnv (vr->max, val, strict_overflow_p);
3793       if ((comp == LT_EXPR && tst == -1)
3794           || (comp == LE_EXPR && (tst == -1 || tst == 0)))
3795         {
3796           if (overflow_infinity_range_p (vr))
3797             *strict_overflow_p = true;
3798           return boolean_true_node;
3799         }
3800
3801       /* If VR is to the right of VAL, return false.  */
3802       tst = compare_values_warnv (vr->min, val, strict_overflow_p);
3803       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
3804           || (comp == LE_EXPR && tst == 1))
3805         {
3806           if (overflow_infinity_range_p (vr))
3807             *strict_overflow_p = true;
3808           return boolean_false_node;
3809         }
3810
3811       /* Otherwise, we don't know.  */
3812       return NULL_TREE;
3813     }
3814   else if (comp == GT_EXPR || comp == GE_EXPR)
3815     {
3816       int tst;
3817
3818       /* If VR is to the right of VAL, return true.  */
3819       tst = compare_values_warnv (vr->min, val, strict_overflow_p);
3820       if ((comp == GT_EXPR && tst == 1)
3821           || (comp == GE_EXPR && (tst == 0 || tst == 1)))
3822         {
3823           if (overflow_infinity_range_p (vr))
3824             *strict_overflow_p = true;
3825           return boolean_true_node;
3826         }
3827
3828       /* If VR is to the left of VAL, return false.  */
3829       tst = compare_values_warnv (vr->max, val, strict_overflow_p);
3830       if ((comp == GT_EXPR && (tst == -1 || tst == 0))
3831           || (comp == GE_EXPR && tst == -1))
3832         {
3833           if (overflow_infinity_range_p (vr))
3834             *strict_overflow_p = true;
3835           return boolean_false_node;
3836         }
3837
3838       /* Otherwise, we don't know.  */
3839       return NULL_TREE;
3840     }
3841
3842   gcc_unreachable ();
3843 }
3844
3845
3846 /* Debugging dumps.  */
3847
3848 void dump_value_range (FILE *, value_range_t *);
3849 void debug_value_range (value_range_t *);
3850 void dump_all_value_ranges (FILE *);
3851 void debug_all_value_ranges (void);
3852 void dump_vr_equiv (FILE *, bitmap);
3853 void debug_vr_equiv (bitmap);
3854
3855
3856 /* Dump value range VR to FILE.  */
3857
3858 void
3859 dump_value_range (FILE *file, value_range_t *vr)
3860 {
3861   if (vr == NULL)
3862     fprintf (file, "[]");
3863   else if (vr->type == VR_UNDEFINED)
3864     fprintf (file, "UNDEFINED");
3865   else if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
3866     {
3867       tree type = TREE_TYPE (vr->min);
3868
3869       fprintf (file, "%s[", (vr->type == VR_ANTI_RANGE) ? "~" : "");
3870
3871       if (is_negative_overflow_infinity (vr->min))
3872         fprintf (file, "-INF(OVF)");
3873       else if (INTEGRAL_TYPE_P (type)
3874                && !TYPE_UNSIGNED (type)
3875                && vrp_val_is_min (vr->min))
3876         fprintf (file, "-INF");
3877       else
3878         print_generic_expr (file, vr->min, 0);
3879
3880       fprintf (file, ", ");
3881
3882       if (is_positive_overflow_infinity (vr->max))
3883         fprintf (file, "+INF(OVF)");
3884       else if (INTEGRAL_TYPE_P (type)
3885                && vrp_val_is_max (vr->max))
3886         fprintf (file, "+INF");
3887       else
3888         print_generic_expr (file, vr->max, 0);
3889
3890       fprintf (file, "]");
3891
3892       if (vr->equiv)
3893         {
3894           bitmap_iterator bi;
3895           unsigned i, c = 0;
3896
3897           fprintf (file, "  EQUIVALENCES: { ");
3898
3899           EXECUTE_IF_SET_IN_BITMAP (vr->equiv, 0, i, bi)
3900             {
3901               print_generic_expr (file, ssa_name (i), 0);
3902               fprintf (file, " ");
3903               c++;
3904             }
3905
3906           fprintf (file, "} (%u elements)", c);
3907         }
3908     }
3909   else if (vr->type == VR_VARYING)
3910     fprintf (file, "VARYING");
3911   else
3912     fprintf (file, "INVALID RANGE");
3913 }
3914
3915
3916 /* Dump value range VR to stderr.  */
3917
3918 DEBUG_FUNCTION void
3919 debug_value_range (value_range_t *vr)
3920 {
3921   dump_value_range (stderr, vr);
3922   fprintf (stderr, "\n");
3923 }
3924
3925
3926 /* Dump value ranges of all SSA_NAMEs to FILE.  */
3927
3928 void
3929 dump_all_value_ranges (FILE *file)
3930 {
3931   size_t i;
3932
3933   for (i = 0; i < num_ssa_names; i++)
3934     {
3935       if (vr_value[i])
3936         {
3937           print_generic_expr (file, ssa_name (i), 0);
3938           fprintf (file, ": ");
3939           dump_value_range (file, vr_value[i]);
3940           fprintf (file, "\n");
3941         }
3942     }
3943
3944   fprintf (file, "\n");
3945 }
3946
3947
3948 /* Dump all value ranges to stderr.  */
3949
3950 DEBUG_FUNCTION void
3951 debug_all_value_ranges (void)
3952 {
3953   dump_all_value_ranges (stderr);
3954 }
3955
3956
3957 /* Given a COND_EXPR COND of the form 'V OP W', and an SSA name V,
3958    create a new SSA name N and return the assertion assignment
3959    'V = ASSERT_EXPR <V, V OP W>'.  */
3960
3961 static gimple
3962 build_assert_expr_for (tree cond, tree v)
3963 {
3964   tree n;
3965   gimple assertion;
3966
3967   gcc_assert (TREE_CODE (v) == SSA_NAME);
3968   n = duplicate_ssa_name (v, NULL);
3969
3970   if (COMPARISON_CLASS_P (cond))
3971     {
3972       tree a = build2 (ASSERT_EXPR, TREE_TYPE (v), v, cond);
3973       assertion = gimple_build_assign (n, a);
3974     }
3975   else if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
3976     {
3977       /* Given !V, build the assignment N = false.  */
3978       tree op0 = TREE_OPERAND (cond, 0);
3979       gcc_assert (op0 == v);
3980       assertion = gimple_build_assign (n, boolean_false_node);
3981     }
3982   else if (TREE_CODE (cond) == SSA_NAME)
3983     {
3984       /* Given V, build the assignment N = true.  */
3985       gcc_assert (v == cond);
3986       assertion = gimple_build_assign (n, boolean_true_node);
3987     }
3988   else
3989     gcc_unreachable ();
3990
3991   SSA_NAME_DEF_STMT (n) = assertion;
3992
3993   /* The new ASSERT_EXPR, creates a new SSA name that replaces the
3994      operand of the ASSERT_EXPR. Register the new name and the old one
3995      in the replacement table so that we can fix the SSA web after
3996      adding all the ASSERT_EXPRs.  */
3997   register_new_name_mapping (n, v);
3998
3999   return assertion;
4000 }
4001
4002
4003 /* Return false if EXPR is a predicate expression involving floating
4004    point values.  */
4005
4006 static inline bool
4007 fp_predicate (gimple stmt)
4008 {
4009   GIMPLE_CHECK (stmt, GIMPLE_COND);
4010
4011   return FLOAT_TYPE_P (TREE_TYPE (gimple_cond_lhs (stmt)));
4012 }
4013
4014
4015 /* If the range of values taken by OP can be inferred after STMT executes,
4016    return the comparison code (COMP_CODE_P) and value (VAL_P) that
4017    describes the inferred range.  Return true if a range could be
4018    inferred.  */
4019
4020 static bool
4021 infer_value_range (gimple stmt, tree op, enum tree_code *comp_code_p, tree *val_p)
4022 {
4023   *val_p = NULL_TREE;
4024   *comp_code_p = ERROR_MARK;
4025
4026   /* Do not attempt to infer anything in names that flow through
4027      abnormal edges.  */
4028   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
4029     return false;
4030
4031   /* Similarly, don't infer anything from statements that may throw
4032      exceptions.  */
4033   if (stmt_could_throw_p (stmt))
4034     return false;
4035
4036   /* If STMT is the last statement of a basic block with no
4037      successors, there is no point inferring anything about any of its
4038      operands.  We would not be able to find a proper insertion point
4039      for the assertion, anyway.  */
4040   if (stmt_ends_bb_p (stmt) && EDGE_COUNT (gimple_bb (stmt)->succs) == 0)
4041     return false;
4042
4043   /* We can only assume that a pointer dereference will yield
4044      non-NULL if -fdelete-null-pointer-checks is enabled.  */
4045   if (flag_delete_null_pointer_checks
4046       && POINTER_TYPE_P (TREE_TYPE (op))
4047       && gimple_code (stmt) != GIMPLE_ASM)
4048     {
4049       unsigned num_uses, num_loads, num_stores;
4050
4051       count_uses_and_derefs (op, stmt, &num_uses, &num_loads, &num_stores);
4052       if (num_loads + num_stores > 0)
4053         {
4054           *val_p = build_int_cst (TREE_TYPE (op), 0);
4055           *comp_code_p = NE_EXPR;
4056           return true;
4057         }
4058     }
4059
4060   return false;
4061 }
4062
4063
4064 void dump_asserts_for (FILE *, tree);
4065 void debug_asserts_for (tree);
4066 void dump_all_asserts (FILE *);
4067 void debug_all_asserts (void);
4068
4069 /* Dump all the registered assertions for NAME to FILE.  */
4070
4071 void
4072 dump_asserts_for (FILE *file, tree name)
4073 {
4074   assert_locus_t loc;
4075
4076   fprintf (file, "Assertions to be inserted for ");
4077   print_generic_expr (file, name, 0);
4078   fprintf (file, "\n");
4079
4080   loc = asserts_for[SSA_NAME_VERSION (name)];
4081   while (loc)
4082     {
4083       fprintf (file, "\t");
4084       print_gimple_stmt (file, gsi_stmt (loc->si), 0, 0);
4085       fprintf (file, "\n\tBB #%d", loc->bb->index);
4086       if (loc->e)
4087         {
4088           fprintf (file, "\n\tEDGE %d->%d", loc->e->src->index,
4089                    loc->e->dest->index);
4090           dump_edge_info (file, loc->e, 0);
4091         }
4092       fprintf (file, "\n\tPREDICATE: ");
4093       print_generic_expr (file, name, 0);
4094       fprintf (file, " %s ", tree_code_name[(int)loc->comp_code]);
4095       print_generic_expr (file, loc->val, 0);
4096       fprintf (file, "\n\n");
4097       loc = loc->next;
4098     }
4099
4100   fprintf (file, "\n");
4101 }
4102
4103
4104 /* Dump all the registered assertions for NAME to stderr.  */
4105
4106 DEBUG_FUNCTION void
4107 debug_asserts_for (tree name)
4108 {
4109   dump_asserts_for (stderr, name);
4110 }
4111
4112
4113 /* Dump all the registered assertions for all the names to FILE.  */
4114
4115 void
4116 dump_all_asserts (FILE *file)
4117 {
4118   unsigned i;
4119   bitmap_iterator bi;
4120
4121   fprintf (file, "\nASSERT_EXPRs to be inserted\n\n");
4122   EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
4123     dump_asserts_for (file, ssa_name (i));
4124   fprintf (file, "\n");
4125 }
4126
4127
4128 /* Dump all the registered assertions for all the names to stderr.  */
4129
4130 DEBUG_FUNCTION void
4131 debug_all_asserts (void)
4132 {
4133   dump_all_asserts (stderr);
4134 }
4135
4136
4137 /* If NAME doesn't have an ASSERT_EXPR registered for asserting
4138    'EXPR COMP_CODE VAL' at a location that dominates block BB or
4139    E->DEST, then register this location as a possible insertion point
4140    for ASSERT_EXPR <NAME, EXPR COMP_CODE VAL>.
4141
4142    BB, E and SI provide the exact insertion point for the new
4143    ASSERT_EXPR.  If BB is NULL, then the ASSERT_EXPR is to be inserted
4144    on edge E.  Otherwise, if E is NULL, the ASSERT_EXPR is inserted on
4145    BB.  If SI points to a COND_EXPR or a SWITCH_EXPR statement, then E
4146    must not be NULL.  */
4147
4148 static void
4149 register_new_assert_for (tree name, tree expr,
4150                          enum tree_code comp_code,
4151                          tree val,
4152                          basic_block bb,
4153                          edge e,
4154                          gimple_stmt_iterator si)
4155 {
4156   assert_locus_t n, loc, last_loc;
4157   basic_block dest_bb;
4158
4159   gcc_checking_assert (bb == NULL || e == NULL);
4160
4161   if (e == NULL)
4162     gcc_checking_assert (gimple_code (gsi_stmt (si)) != GIMPLE_COND
4163                          && gimple_code (gsi_stmt (si)) != GIMPLE_SWITCH);
4164
4165   /* Never build an assert comparing against an integer constant with
4166      TREE_OVERFLOW set.  This confuses our undefined overflow warning
4167      machinery.  */
4168   if (TREE_CODE (val) == INTEGER_CST
4169       && TREE_OVERFLOW (val))
4170     val = build_int_cst_wide (TREE_TYPE (val),
4171                               TREE_INT_CST_LOW (val), TREE_INT_CST_HIGH (val));
4172
4173   /* The new assertion A will be inserted at BB or E.  We need to
4174      determine if the new location is dominated by a previously
4175      registered location for A.  If we are doing an edge insertion,
4176      assume that A will be inserted at E->DEST.  Note that this is not
4177      necessarily true.
4178
4179      If E is a critical edge, it will be split.  But even if E is
4180      split, the new block will dominate the same set of blocks that
4181      E->DEST dominates.
4182
4183      The reverse, however, is not true, blocks dominated by E->DEST
4184      will not be dominated by the new block created to split E.  So,
4185      if the insertion location is on a critical edge, we will not use
4186      the new location to move another assertion previously registered
4187      at a block dominated by E->DEST.  */
4188   dest_bb = (bb) ? bb : e->dest;
4189
4190   /* If NAME already has an ASSERT_EXPR registered for COMP_CODE and
4191      VAL at a block dominating DEST_BB, then we don't need to insert a new
4192      one.  Similarly, if the same assertion already exists at a block
4193      dominated by DEST_BB and the new location is not on a critical
4194      edge, then update the existing location for the assertion (i.e.,
4195      move the assertion up in the dominance tree).
4196
4197      Note, this is implemented as a simple linked list because there
4198      should not be more than a handful of assertions registered per
4199      name.  If this becomes a performance problem, a table hashed by
4200      COMP_CODE and VAL could be implemented.  */
4201   loc = asserts_for[SSA_NAME_VERSION (name)];
4202   last_loc = loc;
4203   while (loc)
4204     {
4205       if (loc->comp_code == comp_code
4206           && (loc->val == val
4207               || operand_equal_p (loc->val, val, 0))
4208           && (loc->expr == expr
4209               || operand_equal_p (loc->expr, expr, 0)))
4210         {
4211           /* If the assertion NAME COMP_CODE VAL has already been
4212              registered at a basic block that dominates DEST_BB, then
4213              we don't need to insert the same assertion again.  Note
4214              that we don't check strict dominance here to avoid
4215              replicating the same assertion inside the same basic
4216              block more than once (e.g., when a pointer is
4217              dereferenced several times inside a block).
4218
4219              An exception to this rule are edge insertions.  If the
4220              new assertion is to be inserted on edge E, then it will
4221              dominate all the other insertions that we may want to
4222              insert in DEST_BB.  So, if we are doing an edge
4223              insertion, don't do this dominance check.  */
4224           if (e == NULL
4225               && dominated_by_p (CDI_DOMINATORS, dest_bb, loc->bb))
4226             return;
4227
4228           /* Otherwise, if E is not a critical edge and DEST_BB
4229              dominates the existing location for the assertion, move
4230              the assertion up in the dominance tree by updating its
4231              location information.  */
4232           if ((e == NULL || !EDGE_CRITICAL_P (e))
4233               && dominated_by_p (CDI_DOMINATORS, loc->bb, dest_bb))
4234             {
4235               loc->bb = dest_bb;
4236               loc->e = e;
4237               loc->si = si;
4238               return;
4239             }
4240         }
4241
4242       /* Update the last node of the list and move to the next one.  */
4243       last_loc = loc;
4244       loc = loc->next;
4245     }
4246
4247   /* If we didn't find an assertion already registered for
4248      NAME COMP_CODE VAL, add a new one at the end of the list of
4249      assertions associated with NAME.  */
4250   n = XNEW (struct assert_locus_d);
4251   n->bb = dest_bb;
4252   n->e = e;
4253   n->si = si;
4254   n->comp_code = comp_code;
4255   n->val = val;
4256   n->expr = expr;
4257   n->next = NULL;
4258
4259   if (last_loc)
4260     last_loc->next = n;
4261   else
4262     asserts_for[SSA_NAME_VERSION (name)] = n;
4263
4264   bitmap_set_bit (need_assert_for, SSA_NAME_VERSION (name));
4265 }
4266
4267 /* (COND_OP0 COND_CODE COND_OP1) is a predicate which uses NAME.
4268    Extract a suitable test code and value and store them into *CODE_P and
4269    *VAL_P so the predicate is normalized to NAME *CODE_P *VAL_P.
4270
4271    If no extraction was possible, return FALSE, otherwise return TRUE.
4272
4273    If INVERT is true, then we invert the result stored into *CODE_P.  */
4274
4275 static bool
4276 extract_code_and_val_from_cond_with_ops (tree name, enum tree_code cond_code,
4277                                          tree cond_op0, tree cond_op1,
4278                                          bool invert, enum tree_code *code_p,
4279                                          tree *val_p)
4280 {
4281   enum tree_code comp_code;
4282   tree val;
4283
4284   /* Otherwise, we have a comparison of the form NAME COMP VAL
4285      or VAL COMP NAME.  */
4286   if (name == cond_op1)
4287     {
4288       /* If the predicate is of the form VAL COMP NAME, flip
4289          COMP around because we need to register NAME as the
4290          first operand in the predicate.  */
4291       comp_code = swap_tree_comparison (cond_code);
4292       val = cond_op0;
4293     }
4294   else
4295     {
4296       /* The comparison is of the form NAME COMP VAL, so the
4297          comparison code remains unchanged.  */
4298       comp_code = cond_code;
4299       val = cond_op1;
4300     }
4301
4302   /* Invert the comparison code as necessary.  */
4303   if (invert)
4304     comp_code = invert_tree_comparison (comp_code, 0);
4305
4306   /* VRP does not handle float types.  */
4307   if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (val)))
4308     return false;
4309
4310   /* Do not register always-false predicates.
4311      FIXME:  this works around a limitation in fold() when dealing with
4312      enumerations.  Given 'enum { N1, N2 } x;', fold will not
4313      fold 'if (x > N2)' to 'if (0)'.  */
4314   if ((comp_code == GT_EXPR || comp_code == LT_EXPR)
4315       && INTEGRAL_TYPE_P (TREE_TYPE (val)))
4316     {
4317       tree min = TYPE_MIN_VALUE (TREE_TYPE (val));
4318       tree max = TYPE_MAX_VALUE (TREE_TYPE (val));
4319
4320       if (comp_code == GT_EXPR
4321           && (!max
4322               || compare_values (val, max) == 0))
4323         return false;
4324
4325       if (comp_code == LT_EXPR
4326           && (!min
4327               || compare_values (val, min) == 0))
4328         return false;
4329     }
4330   *code_p = comp_code;
4331   *val_p = val;
4332   return true;
4333 }
4334
4335 /* Try to register an edge assertion for SSA name NAME on edge E for
4336    the condition COND contributing to the conditional jump pointed to by BSI.
4337    Invert the condition COND if INVERT is true.
4338    Return true if an assertion for NAME could be registered.  */
4339
4340 static bool
4341 register_edge_assert_for_2 (tree name, edge e, gimple_stmt_iterator bsi,
4342                             enum tree_code cond_code,
4343                             tree cond_op0, tree cond_op1, bool invert)
4344 {
4345   tree val;
4346   enum tree_code comp_code;
4347   bool retval = false;
4348
4349   if (!extract_code_and_val_from_cond_with_ops (name, cond_code,
4350                                                 cond_op0,
4351                                                 cond_op1,
4352                                                 invert, &comp_code, &val))
4353     return false;
4354
4355   /* Only register an ASSERT_EXPR if NAME was found in the sub-graph
4356      reachable from E.  */
4357   if (live_on_edge (e, name)
4358       && !has_single_use (name))
4359     {
4360       register_new_assert_for (name, name, comp_code, val, NULL, e, bsi);
4361       retval = true;
4362     }
4363
4364   /* In the case of NAME <= CST and NAME being defined as
4365      NAME = (unsigned) NAME2 + CST2 we can assert NAME2 >= -CST2
4366      and NAME2 <= CST - CST2.  We can do the same for NAME > CST.
4367      This catches range and anti-range tests.  */
4368   if ((comp_code == LE_EXPR
4369        || comp_code == GT_EXPR)
4370       && TREE_CODE (val) == INTEGER_CST
4371       && TYPE_UNSIGNED (TREE_TYPE (val)))
4372     {
4373       gimple def_stmt = SSA_NAME_DEF_STMT (name);
4374       tree cst2 = NULL_TREE, name2 = NULL_TREE, name3 = NULL_TREE;
4375
4376       /* Extract CST2 from the (optional) addition.  */
4377       if (is_gimple_assign (def_stmt)
4378           && gimple_assign_rhs_code (def_stmt) == PLUS_EXPR)
4379         {
4380           name2 = gimple_assign_rhs1 (def_stmt);
4381           cst2 = gimple_assign_rhs2 (def_stmt);
4382           if (TREE_CODE (name2) == SSA_NAME
4383               && TREE_CODE (cst2) == INTEGER_CST)
4384             def_stmt = SSA_NAME_DEF_STMT (name2);
4385         }
4386
4387       /* Extract NAME2 from the (optional) sign-changing cast.  */
4388       if (gimple_assign_cast_p (def_stmt))
4389         {
4390           if (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def_stmt))
4391               && ! TYPE_UNSIGNED (TREE_TYPE (gimple_assign_rhs1 (def_stmt)))
4392               && (TYPE_PRECISION (gimple_expr_type (def_stmt))
4393                   == TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (def_stmt)))))
4394             name3 = gimple_assign_rhs1 (def_stmt);
4395         }
4396
4397       /* If name3 is used later, create an ASSERT_EXPR for it.  */
4398       if (name3 != NULL_TREE
4399           && TREE_CODE (name3) == SSA_NAME
4400           && (cst2 == NULL_TREE
4401               || TREE_CODE (cst2) == INTEGER_CST)
4402           && INTEGRAL_TYPE_P (TREE_TYPE (name3))
4403           && live_on_edge (e, name3)
4404           && !has_single_use (name3))
4405         {
4406           tree tmp;
4407
4408           /* Build an expression for the range test.  */
4409           tmp = build1 (NOP_EXPR, TREE_TYPE (name), name3);
4410           if (cst2 != NULL_TREE)
4411             tmp = build2 (PLUS_EXPR, TREE_TYPE (name), tmp, cst2);
4412
4413           if (dump_file)
4414             {
4415               fprintf (dump_file, "Adding assert for ");
4416               print_generic_expr (dump_file, name3, 0);
4417               fprintf (dump_file, " from ");
4418               print_generic_expr (dump_file, tmp, 0);
4419               fprintf (dump_file, "\n");
4420             }
4421
4422           register_new_assert_for (name3, tmp, comp_code, val, NULL, e, bsi);
4423
4424           retval = true;
4425         }
4426
4427       /* If name2 is used later, create an ASSERT_EXPR for it.  */
4428       if (name2 != NULL_TREE
4429           && TREE_CODE (name2) == SSA_NAME
4430           && TREE_CODE (cst2) == INTEGER_CST
4431           && INTEGRAL_TYPE_P (TREE_TYPE (name2))
4432           && live_on_edge (e, name2)
4433           && !has_single_use (name2))
4434         {
4435           tree tmp;
4436
4437           /* Build an expression for the range test.  */
4438           tmp = name2;
4439           if (TREE_TYPE (name) != TREE_TYPE (name2))
4440             tmp = build1 (NOP_EXPR, TREE_TYPE (name), tmp);
4441           if (cst2 != NULL_TREE)
4442             tmp = build2 (PLUS_EXPR, TREE_TYPE (name), tmp, cst2);
4443
4444           if (dump_file)
4445             {
4446               fprintf (dump_file, "Adding assert for ");
4447               print_generic_expr (dump_file, name2, 0);
4448               fprintf (dump_file, " from ");
4449               print_generic_expr (dump_file, tmp, 0);
4450               fprintf (dump_file, "\n");
4451             }
4452
4453           register_new_assert_for (name2, tmp, comp_code, val, NULL, e, bsi);
4454
4455           retval = true;
4456         }
4457     }
4458
4459   return retval;
4460 }
4461
4462 /* OP is an operand of a truth value expression which is known to have
4463    a particular value.  Register any asserts for OP and for any
4464    operands in OP's defining statement.
4465
4466    If CODE is EQ_EXPR, then we want to register OP is zero (false),
4467    if CODE is NE_EXPR, then we want to register OP is nonzero (true).   */
4468
4469 static bool
4470 register_edge_assert_for_1 (tree op, enum tree_code code,
4471                             edge e, gimple_stmt_iterator bsi)
4472 {
4473   bool retval = false;
4474   gimple op_def;
4475   tree val;
4476   enum tree_code rhs_code;
4477
4478   /* We only care about SSA_NAMEs.  */
4479   if (TREE_CODE (op) != SSA_NAME)
4480     return false;
4481
4482   /* We know that OP will have a zero or nonzero value.  If OP is used
4483      more than once go ahead and register an assert for OP.
4484
4485      The FOUND_IN_SUBGRAPH support is not helpful in this situation as
4486      it will always be set for OP (because OP is used in a COND_EXPR in
4487      the subgraph).  */
4488   if (!has_single_use (op))
4489     {
4490       val = build_int_cst (TREE_TYPE (op), 0);
4491       register_new_assert_for (op, op, code, val, NULL, e, bsi);
4492       retval = true;
4493     }
4494
4495   /* Now look at how OP is set.  If it's set from a comparison,
4496      a truth operation or some bit operations, then we may be able
4497      to register information about the operands of that assignment.  */
4498   op_def = SSA_NAME_DEF_STMT (op);
4499   if (gimple_code (op_def) != GIMPLE_ASSIGN)
4500     return retval;
4501
4502   rhs_code = gimple_assign_rhs_code (op_def);
4503
4504   if (TREE_CODE_CLASS (rhs_code) == tcc_comparison)
4505     {
4506       bool invert = (code == EQ_EXPR ? true : false);
4507       tree op0 = gimple_assign_rhs1 (op_def);
4508       tree op1 = gimple_assign_rhs2 (op_def);
4509
4510       if (TREE_CODE (op0) == SSA_NAME)
4511         retval |= register_edge_assert_for_2 (op0, e, bsi, rhs_code, op0, op1,
4512                                               invert);
4513       if (TREE_CODE (op1) == SSA_NAME)
4514         retval |= register_edge_assert_for_2 (op1, e, bsi, rhs_code, op0, op1,
4515                                               invert);
4516     }
4517   else if ((code == NE_EXPR
4518             && (gimple_assign_rhs_code (op_def) == TRUTH_AND_EXPR
4519                 || gimple_assign_rhs_code (op_def) == BIT_AND_EXPR))
4520            || (code == EQ_EXPR
4521                && (gimple_assign_rhs_code (op_def) == TRUTH_OR_EXPR
4522                    || gimple_assign_rhs_code (op_def) == BIT_IOR_EXPR)))
4523     {
4524       /* Recurse on each operand.  */
4525       retval |= register_edge_assert_for_1 (gimple_assign_rhs1 (op_def),
4526                                             code, e, bsi);
4527       retval |= register_edge_assert_for_1 (gimple_assign_rhs2 (op_def),
4528                                             code, e, bsi);
4529     }
4530   else if (gimple_assign_rhs_code (op_def) == TRUTH_NOT_EXPR)
4531     {
4532       /* Recurse, flipping CODE.  */
4533       code = invert_tree_comparison (code, false);
4534       retval |= register_edge_assert_for_1 (gimple_assign_rhs1 (op_def),
4535                                             code, e, bsi);
4536     }
4537   else if (gimple_assign_rhs_code (op_def) == SSA_NAME)
4538     {
4539       /* Recurse through the copy.  */
4540       retval |= register_edge_assert_for_1 (gimple_assign_rhs1 (op_def),
4541                                             code, e, bsi);
4542     }
4543   else if (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (op_def)))
4544     {
4545       /* Recurse through the type conversion.  */
4546       retval |= register_edge_assert_for_1 (gimple_assign_rhs1 (op_def),
4547                                             code, e, bsi);
4548     }
4549
4550   return retval;
4551 }
4552
4553 /* Try to register an edge assertion for SSA name NAME on edge E for
4554    the condition COND contributing to the conditional jump pointed to by SI.
4555    Return true if an assertion for NAME could be registered.  */
4556
4557 static bool
4558 register_edge_assert_for (tree name, edge e, gimple_stmt_iterator si,
4559                           enum tree_code cond_code, tree cond_op0,
4560                           tree cond_op1)
4561 {
4562   tree val;
4563   enum tree_code comp_code;
4564   bool retval = false;
4565   bool is_else_edge = (e->flags & EDGE_FALSE_VALUE) != 0;
4566
4567   /* Do not attempt to infer anything in names that flow through
4568      abnormal edges.  */
4569   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
4570     return false;
4571
4572   if (!extract_code_and_val_from_cond_with_ops (name, cond_code,
4573                                                 cond_op0, cond_op1,
4574                                                 is_else_edge,
4575                                                 &comp_code, &val))
4576     return false;
4577
4578   /* Register ASSERT_EXPRs for name.  */
4579   retval |= register_edge_assert_for_2 (name, e, si, cond_code, cond_op0,
4580                                         cond_op1, is_else_edge);
4581
4582
4583   /* If COND is effectively an equality test of an SSA_NAME against
4584      the value zero or one, then we may be able to assert values
4585      for SSA_NAMEs which flow into COND.  */
4586
4587   /* In the case of NAME == 1 or NAME != 0, for TRUTH_AND_EXPR defining
4588      statement of NAME we can assert both operands of the TRUTH_AND_EXPR
4589      have nonzero value.  */
4590   if (((comp_code == EQ_EXPR && integer_onep (val))
4591        || (comp_code == NE_EXPR && integer_zerop (val))))
4592     {
4593       gimple def_stmt = SSA_NAME_DEF_STMT (name);
4594
4595       if (is_gimple_assign (def_stmt)
4596           && (gimple_assign_rhs_code (def_stmt) == TRUTH_AND_EXPR
4597               || gimple_assign_rhs_code (def_stmt) == BIT_AND_EXPR))
4598         {
4599           tree op0 = gimple_assign_rhs1 (def_stmt);
4600           tree op1 = gimple_assign_rhs2 (def_stmt);
4601           retval |= register_edge_assert_for_1 (op0, NE_EXPR, e, si);
4602           retval |= register_edge_assert_for_1 (op1, NE_EXPR, e, si);
4603         }
4604     }
4605
4606   /* In the case of NAME == 0 or NAME != 1, for TRUTH_OR_EXPR defining
4607      statement of NAME we can assert both operands of the TRUTH_OR_EXPR
4608      have zero value.  */
4609   if (((comp_code == EQ_EXPR && integer_zerop (val))
4610        || (comp_code == NE_EXPR && integer_onep (val))))
4611     {
4612       gimple def_stmt = SSA_NAME_DEF_STMT (name);
4613
4614       if (is_gimple_assign (def_stmt)
4615           && (gimple_assign_rhs_code (def_stmt) == TRUTH_OR_EXPR
4616               /* For BIT_IOR_EXPR only if NAME == 0 both operands have
4617                  necessarily zero value.  */
4618               || (comp_code == EQ_EXPR
4619                   && (gimple_assign_rhs_code (def_stmt) == BIT_IOR_EXPR))))
4620         {
4621           tree op0 = gimple_assign_rhs1 (def_stmt);
4622           tree op1 = gimple_assign_rhs2 (def_stmt);
4623           retval |= register_edge_assert_for_1 (op0, EQ_EXPR, e, si);
4624           retval |= register_edge_assert_for_1 (op1, EQ_EXPR, e, si);
4625         }
4626     }
4627
4628   return retval;
4629 }
4630
4631
4632 /* Determine whether the outgoing edges of BB should receive an
4633    ASSERT_EXPR for each of the operands of BB's LAST statement.
4634    The last statement of BB must be a COND_EXPR.
4635
4636    If any of the sub-graphs rooted at BB have an interesting use of
4637    the predicate operands, an assert location node is added to the
4638    list of assertions for the corresponding operands.  */
4639
4640 static bool
4641 find_conditional_asserts (basic_block bb, gimple last)
4642 {
4643   bool need_assert;
4644   gimple_stmt_iterator bsi;
4645   tree op;
4646   edge_iterator ei;
4647   edge e;
4648   ssa_op_iter iter;
4649
4650   need_assert = false;
4651   bsi = gsi_for_stmt (last);
4652
4653   /* Look for uses of the operands in each of the sub-graphs
4654      rooted at BB.  We need to check each of the outgoing edges
4655      separately, so that we know what kind of ASSERT_EXPR to
4656      insert.  */
4657   FOR_EACH_EDGE (e, ei, bb->succs)
4658     {
4659       if (e->dest == bb)
4660         continue;
4661
4662       /* Register the necessary assertions for each operand in the
4663          conditional predicate.  */
4664       FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
4665         {
4666           need_assert |= register_edge_assert_for (op, e, bsi,
4667                                                    gimple_cond_code (last),
4668                                                    gimple_cond_lhs (last),
4669                                                    gimple_cond_rhs (last));
4670         }
4671     }
4672
4673   return need_assert;
4674 }
4675
4676 /* Compare two case labels sorting first by the destination label uid
4677    and then by the case value.  */
4678
4679 static int
4680 compare_case_labels (const void *p1, const void *p2)
4681 {
4682   const_tree const case1 = *(const_tree const*)p1;
4683   const_tree const case2 = *(const_tree const*)p2;
4684   unsigned int uid1 = DECL_UID (CASE_LABEL (case1));
4685   unsigned int uid2 = DECL_UID (CASE_LABEL (case2));
4686
4687   if (uid1 < uid2)
4688     return -1;
4689   else if (uid1 == uid2)
4690     {
4691       /* Make sure the default label is first in a group.  */
4692       if (!CASE_LOW (case1))
4693         return -1;
4694       else if (!CASE_LOW (case2))
4695         return 1;
4696       else
4697         return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
4698     }
4699   else
4700     return 1;
4701 }
4702
4703 /* Determine whether the outgoing edges of BB should receive an
4704    ASSERT_EXPR for each of the operands of BB's LAST statement.
4705    The last statement of BB must be a SWITCH_EXPR.
4706
4707    If any of the sub-graphs rooted at BB have an interesting use of
4708    the predicate operands, an assert location node is added to the
4709    list of assertions for the corresponding operands.  */
4710
4711 static bool
4712 find_switch_asserts (basic_block bb, gimple last)
4713 {
4714   bool need_assert;
4715   gimple_stmt_iterator bsi;
4716   tree op;
4717   edge e;
4718   tree vec2;
4719   size_t n = gimple_switch_num_labels(last);
4720 #if GCC_VERSION >= 4000
4721   unsigned int idx;
4722 #else
4723   /* Work around GCC 3.4 bug (PR 37086).  */
4724   volatile unsigned int idx;
4725 #endif
4726
4727   need_assert = false;
4728   bsi = gsi_for_stmt (last);
4729   op = gimple_switch_index (last);
4730   if (TREE_CODE (op) != SSA_NAME)
4731     return false;
4732
4733   /* Build a vector of case labels sorted by destination label.  */
4734   vec2 = make_tree_vec (n);
4735   for (idx = 0; idx < n; ++idx)
4736     TREE_VEC_ELT (vec2, idx) = gimple_switch_label (last, idx);
4737   qsort (&TREE_VEC_ELT (vec2, 0), n, sizeof (tree), compare_case_labels);
4738
4739   for (idx = 0; idx < n; ++idx)
4740     {
4741       tree min, max;
4742       tree cl = TREE_VEC_ELT (vec2, idx);
4743
4744       min = CASE_LOW (cl);
4745       max = CASE_HIGH (cl);
4746
4747       /* If there are multiple case labels with the same destination
4748          we need to combine them to a single value range for the edge.  */
4749       if (idx + 1 < n
4750           && CASE_LABEL (cl) == CASE_LABEL (TREE_VEC_ELT (vec2, idx + 1)))
4751         {
4752           /* Skip labels until the last of the group.  */
4753           do {
4754             ++idx;
4755           } while (idx < n
4756                    && CASE_LABEL (cl) == CASE_LABEL (TREE_VEC_ELT (vec2, idx)));
4757           --idx;
4758
4759           /* Pick up the maximum of the case label range.  */
4760           if (CASE_HIGH (TREE_VEC_ELT (vec2, idx)))
4761             max = CASE_HIGH (TREE_VEC_ELT (vec2, idx));
4762           else
4763             max = CASE_LOW (TREE_VEC_ELT (vec2, idx));
4764         }
4765
4766       /* Nothing to do if the range includes the default label until we
4767          can register anti-ranges.  */
4768       if (min == NULL_TREE)
4769         continue;
4770
4771       /* Find the edge to register the assert expr on.  */
4772       e = find_edge (bb, label_to_block (CASE_LABEL (cl)));
4773
4774       /* Register the necessary assertions for the operand in the
4775          SWITCH_EXPR.  */
4776       need_assert |= register_edge_assert_for (op, e, bsi,
4777                                                max ? GE_EXPR : EQ_EXPR,
4778                                                op,
4779                                                fold_convert (TREE_TYPE (op),
4780                                                              min));
4781       if (max)
4782         {
4783           need_assert |= register_edge_assert_for (op, e, bsi, LE_EXPR,
4784                                                    op,
4785                                                    fold_convert (TREE_TYPE (op),
4786                                                                  max));
4787         }
4788     }
4789
4790   return need_assert;
4791 }
4792
4793
4794 /* Traverse all the statements in block BB looking for statements that
4795    may generate useful assertions for the SSA names in their operand.
4796    If a statement produces a useful assertion A for name N_i, then the
4797    list of assertions already generated for N_i is scanned to
4798    determine if A is actually needed.
4799
4800    If N_i already had the assertion A at a location dominating the
4801    current location, then nothing needs to be done.  Otherwise, the
4802    new location for A is recorded instead.
4803
4804    1- For every statement S in BB, all the variables used by S are
4805       added to bitmap FOUND_IN_SUBGRAPH.
4806
4807    2- If statement S uses an operand N in a way that exposes a known
4808       value range for N, then if N was not already generated by an
4809       ASSERT_EXPR, create a new assert location for N.  For instance,
4810       if N is a pointer and the statement dereferences it, we can
4811       assume that N is not NULL.
4812
4813    3- COND_EXPRs are a special case of #2.  We can derive range
4814       information from the predicate but need to insert different
4815       ASSERT_EXPRs for each of the sub-graphs rooted at the
4816       conditional block.  If the last statement of BB is a conditional
4817       expression of the form 'X op Y', then
4818
4819       a) Remove X and Y from the set FOUND_IN_SUBGRAPH.
4820
4821       b) If the conditional is the only entry point to the sub-graph
4822          corresponding to the THEN_CLAUSE, recurse into it.  On
4823          return, if X and/or Y are marked in FOUND_IN_SUBGRAPH, then
4824          an ASSERT_EXPR is added for the corresponding variable.
4825
4826       c) Repeat step (b) on the ELSE_CLAUSE.
4827
4828       d) Mark X and Y in FOUND_IN_SUBGRAPH.
4829
4830       For instance,
4831
4832             if (a == 9)
4833               b = a;
4834             else
4835               b = c + 1;
4836
4837       In this case, an assertion on the THEN clause is useful to
4838       determine that 'a' is always 9 on that edge.  However, an assertion
4839       on the ELSE clause would be unnecessary.
4840
4841    4- If BB does not end in a conditional expression, then we recurse
4842       into BB's dominator children.
4843
4844    At the end of the recursive traversal, every SSA name will have a
4845    list of locations where ASSERT_EXPRs should be added.  When a new
4846    location for name N is found, it is registered by calling
4847    register_new_assert_for.  That function keeps track of all the
4848    registered assertions to prevent adding unnecessary assertions.
4849    For instance, if a pointer P_4 is dereferenced more than once in a
4850    dominator tree, only the location dominating all the dereference of
4851    P_4 will receive an ASSERT_EXPR.
4852
4853    If this function returns true, then it means that there are names
4854    for which we need to generate ASSERT_EXPRs.  Those assertions are
4855    inserted by process_assert_insertions.  */
4856
4857 static bool
4858 find_assert_locations_1 (basic_block bb, sbitmap live)
4859 {
4860   gimple_stmt_iterator si;
4861   gimple last;
4862   gimple phi;
4863   bool need_assert;
4864
4865   need_assert = false;
4866   last = last_stmt (bb);
4867
4868   /* If BB's last statement is a conditional statement involving integer
4869      operands, determine if we need to add ASSERT_EXPRs.  */
4870   if (last
4871       && gimple_code (last) == GIMPLE_COND
4872       && !fp_predicate (last)
4873       && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
4874     need_assert |= find_conditional_asserts (bb, last);
4875
4876   /* If BB's last statement is a switch statement involving integer
4877      operands, determine if we need to add ASSERT_EXPRs.  */
4878   if (last
4879       && gimple_code (last) == GIMPLE_SWITCH
4880       && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
4881     need_assert |= find_switch_asserts (bb, last);
4882
4883   /* Traverse all the statements in BB marking used names and looking
4884      for statements that may infer assertions for their used operands.  */
4885   for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
4886     {
4887       gimple stmt;
4888       tree op;
4889       ssa_op_iter i;
4890
4891       stmt = gsi_stmt (si);
4892
4893       if (is_gimple_debug (stmt))
4894         continue;
4895
4896       /* See if we can derive an assertion for any of STMT's operands.  */
4897       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
4898         {
4899           tree value;
4900           enum tree_code comp_code;
4901
4902           /* Mark OP in our live bitmap.  */
4903           SET_BIT (live, SSA_NAME_VERSION (op));
4904
4905           /* If OP is used in such a way that we can infer a value
4906              range for it, and we don't find a previous assertion for
4907              it, create a new assertion location node for OP.  */
4908           if (infer_value_range (stmt, op, &comp_code, &value))
4909             {
4910               /* If we are able to infer a nonzero value range for OP,
4911                  then walk backwards through the use-def chain to see if OP
4912                  was set via a typecast.
4913
4914                  If so, then we can also infer a nonzero value range
4915                  for the operand of the NOP_EXPR.  */
4916               if (comp_code == NE_EXPR && integer_zerop (value))
4917                 {
4918                   tree t = op;
4919                   gimple def_stmt = SSA_NAME_DEF_STMT (t);
4920
4921                   while (is_gimple_assign (def_stmt)
4922                          && gimple_assign_rhs_code (def_stmt)  == NOP_EXPR
4923                          && TREE_CODE
4924                              (gimple_assign_rhs1 (def_stmt)) == SSA_NAME
4925                          && POINTER_TYPE_P
4926                              (TREE_TYPE (gimple_assign_rhs1 (def_stmt))))
4927                     {
4928                       t = gimple_assign_rhs1 (def_stmt);
4929                       def_stmt = SSA_NAME_DEF_STMT (t);
4930
4931                       /* Note we want to register the assert for the
4932                          operand of the NOP_EXPR after SI, not after the
4933                          conversion.  */
4934                       if (! has_single_use (t))
4935                         {
4936                           register_new_assert_for (t, t, comp_code, value,
4937                                                    bb, NULL, si);
4938                           need_assert = true;
4939                         }
4940                     }
4941                 }
4942
4943               /* If OP is used only once, namely in this STMT, don't
4944                  bother creating an ASSERT_EXPR for it.  Such an
4945                  ASSERT_EXPR would do nothing but increase compile time.  */
4946               if (!has_single_use (op))
4947                 {
4948                   register_new_assert_for (op, op, comp_code, value,
4949                                            bb, NULL, si);
4950                   need_assert = true;
4951                 }
4952             }
4953         }
4954     }
4955
4956   /* Traverse all PHI nodes in BB marking used operands.  */
4957   for (si = gsi_start_phis (bb); !gsi_end_p(si); gsi_next (&si))
4958     {
4959       use_operand_p arg_p;
4960       ssa_op_iter i;
4961       phi = gsi_stmt (si);
4962
4963       FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_USE)
4964         {
4965           tree arg = USE_FROM_PTR (arg_p);
4966           if (TREE_CODE (arg) == SSA_NAME)
4967             SET_BIT (live, SSA_NAME_VERSION (arg));
4968         }
4969     }
4970
4971   return need_assert;
4972 }
4973
4974 /* Do an RPO walk over the function computing SSA name liveness
4975    on-the-fly and deciding on assert expressions to insert.
4976    Returns true if there are assert expressions to be inserted.  */
4977
4978 static bool
4979 find_assert_locations (void)
4980 {
4981   int *rpo = XCNEWVEC (int, last_basic_block + NUM_FIXED_BLOCKS);
4982   int *bb_rpo = XCNEWVEC (int, last_basic_block + NUM_FIXED_BLOCKS);
4983   int *last_rpo = XCNEWVEC (int, last_basic_block + NUM_FIXED_BLOCKS);
4984   int rpo_cnt, i;
4985   bool need_asserts;
4986
4987   live = XCNEWVEC (sbitmap, last_basic_block + NUM_FIXED_BLOCKS);
4988   rpo_cnt = pre_and_rev_post_order_compute (NULL, rpo, false);
4989   for (i = 0; i < rpo_cnt; ++i)
4990     bb_rpo[rpo[i]] = i;
4991
4992   need_asserts = false;
4993   for (i = rpo_cnt-1; i >= 0; --i)
4994     {
4995       basic_block bb = BASIC_BLOCK (rpo[i]);
4996       edge e;
4997       edge_iterator ei;
4998
4999       if (!live[rpo[i]])
5000         {
5001           live[rpo[i]] = sbitmap_alloc (num_ssa_names);
5002           sbitmap_zero (live[rpo[i]]);
5003         }
5004
5005       /* Process BB and update the live information with uses in
5006          this block.  */
5007       need_asserts |= find_assert_locations_1 (bb, live[rpo[i]]);
5008
5009       /* Merge liveness into the predecessor blocks and free it.  */
5010       if (!sbitmap_empty_p (live[rpo[i]]))
5011         {
5012           int pred_rpo = i;
5013           FOR_EACH_EDGE (e, ei, bb->preds)
5014             {
5015               int pred = e->src->index;
5016               if (e->flags & EDGE_DFS_BACK)
5017                 continue;
5018
5019               if (!live[pred])
5020                 {
5021                   live[pred] = sbitmap_alloc (num_ssa_names);
5022                   sbitmap_zero (live[pred]);
5023                 }
5024               sbitmap_a_or_b (live[pred], live[pred], live[rpo[i]]);
5025
5026               if (bb_rpo[pred] < pred_rpo)
5027                 pred_rpo = bb_rpo[pred];
5028             }
5029
5030           /* Record the RPO number of the last visited block that needs
5031              live information from this block.  */
5032           last_rpo[rpo[i]] = pred_rpo;
5033         }
5034       else
5035         {
5036           sbitmap_free (live[rpo[i]]);
5037           live[rpo[i]] = NULL;
5038         }
5039
5040       /* We can free all successors live bitmaps if all their
5041          predecessors have been visited already.  */
5042       FOR_EACH_EDGE (e, ei, bb->succs)
5043         if (last_rpo[e->dest->index] == i
5044             && live[e->dest->index])
5045           {
5046             sbitmap_free (live[e->dest->index]);
5047             live[e->dest->index] = NULL;
5048           }
5049     }
5050
5051   XDELETEVEC (rpo);
5052   XDELETEVEC (bb_rpo);
5053   XDELETEVEC (last_rpo);
5054   for (i = 0; i < last_basic_block + NUM_FIXED_BLOCKS; ++i)
5055     if (live[i])
5056       sbitmap_free (live[i]);
5057   XDELETEVEC (live);
5058
5059   return need_asserts;
5060 }
5061
5062 /* Create an ASSERT_EXPR for NAME and insert it in the location
5063    indicated by LOC.  Return true if we made any edge insertions.  */
5064
5065 static bool
5066 process_assert_insertions_for (tree name, assert_locus_t loc)
5067 {
5068   /* Build the comparison expression NAME_i COMP_CODE VAL.  */
5069   gimple stmt;
5070   tree cond;
5071   gimple assert_stmt;
5072   edge_iterator ei;
5073   edge e;
5074
5075   /* If we have X <=> X do not insert an assert expr for that.  */
5076   if (loc->expr == loc->val)
5077     return false;
5078
5079   cond = build2 (loc->comp_code, boolean_type_node, loc->expr, loc->val);
5080   assert_stmt = build_assert_expr_for (cond, name);
5081   if (loc->e)
5082     {
5083       /* We have been asked to insert the assertion on an edge.  This
5084          is used only by COND_EXPR and SWITCH_EXPR assertions.  */
5085       gcc_checking_assert (gimple_code (gsi_stmt (loc->si)) == GIMPLE_COND
5086                            || (gimple_code (gsi_stmt (loc->si))
5087                                == GIMPLE_SWITCH));
5088
5089       gsi_insert_on_edge (loc->e, assert_stmt);
5090       return true;
5091     }
5092
5093   /* Otherwise, we can insert right after LOC->SI iff the
5094      statement must not be the last statement in the block.  */
5095   stmt = gsi_stmt (loc->si);
5096   if (!stmt_ends_bb_p (stmt))
5097     {
5098       gsi_insert_after (&loc->si, assert_stmt, GSI_SAME_STMT);
5099       return false;
5100     }
5101
5102   /* If STMT must be the last statement in BB, we can only insert new
5103      assertions on the non-abnormal edge out of BB.  Note that since
5104      STMT is not control flow, there may only be one non-abnormal edge
5105      out of BB.  */
5106   FOR_EACH_EDGE (e, ei, loc->bb->succs)
5107     if (!(e->flags & EDGE_ABNORMAL))
5108       {
5109         gsi_insert_on_edge (e, assert_stmt);
5110         return true;
5111       }
5112
5113   gcc_unreachable ();
5114 }
5115
5116
5117 /* Process all the insertions registered for every name N_i registered
5118    in NEED_ASSERT_FOR.  The list of assertions to be inserted are
5119    found in ASSERTS_FOR[i].  */
5120
5121 static void
5122 process_assert_insertions (void)
5123 {
5124   unsigned i;
5125   bitmap_iterator bi;
5126   bool update_edges_p = false;
5127   int num_asserts = 0;
5128
5129   if (dump_file && (dump_flags & TDF_DETAILS))
5130     dump_all_asserts (dump_file);
5131
5132   EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
5133     {
5134       assert_locus_t loc = asserts_for[i];
5135       gcc_assert (loc);
5136
5137       while (loc)
5138         {
5139           assert_locus_t next = loc->next;
5140           update_edges_p |= process_assert_insertions_for (ssa_name (i), loc);
5141           free (loc);
5142           loc = next;
5143           num_asserts++;
5144         }
5145     }
5146
5147   if (update_edges_p)
5148     gsi_commit_edge_inserts ();
5149
5150   statistics_counter_event (cfun, "Number of ASSERT_EXPR expressions inserted",
5151                             num_asserts);
5152 }
5153
5154
5155 /* Traverse the flowgraph looking for conditional jumps to insert range
5156    expressions.  These range expressions are meant to provide information
5157    to optimizations that need to reason in terms of value ranges.  They
5158    will not be expanded into RTL.  For instance, given:
5159
5160    x = ...
5161    y = ...
5162    if (x < y)
5163      y = x - 2;
5164    else
5165      x = y + 3;
5166
5167    this pass will transform the code into:
5168
5169    x = ...
5170    y = ...
5171    if (x < y)
5172     {
5173       x = ASSERT_EXPR <x, x < y>
5174       y = x - 2
5175     }
5176    else
5177     {
5178       y = ASSERT_EXPR <y, x <= y>
5179       x = y + 3
5180     }
5181
5182    The idea is that once copy and constant propagation have run, other
5183    optimizations will be able to determine what ranges of values can 'x'
5184    take in different paths of the code, simply by checking the reaching
5185    definition of 'x'.  */
5186
5187 static void
5188 insert_range_assertions (void)
5189 {
5190   need_assert_for = BITMAP_ALLOC (NULL);
5191   asserts_for = XCNEWVEC (assert_locus_t, num_ssa_names);
5192
5193   calculate_dominance_info (CDI_DOMINATORS);
5194
5195   if (find_assert_locations ())
5196     {
5197       process_assert_insertions ();
5198       update_ssa (TODO_update_ssa_no_phi);
5199     }
5200
5201   if (dump_file && (dump_flags & TDF_DETAILS))
5202     {
5203       fprintf (dump_file, "\nSSA form after inserting ASSERT_EXPRs\n");
5204       dump_function_to_file (current_function_decl, dump_file, dump_flags);
5205     }
5206
5207   free (asserts_for);
5208   BITMAP_FREE (need_assert_for);
5209 }
5210
5211 /* Checks one ARRAY_REF in REF, located at LOCUS. Ignores flexible arrays
5212    and "struct" hacks. If VRP can determine that the
5213    array subscript is a constant, check if it is outside valid
5214    range. If the array subscript is a RANGE, warn if it is
5215    non-overlapping with valid range.
5216    IGNORE_OFF_BY_ONE is true if the ARRAY_REF is inside a ADDR_EXPR.  */
5217
5218 static void
5219 check_array_ref (location_t location, tree ref, bool ignore_off_by_one)
5220 {
5221   value_range_t* vr = NULL;
5222   tree low_sub, up_sub;
5223   tree low_bound, up_bound, up_bound_p1;
5224   tree base;
5225
5226   if (TREE_NO_WARNING (ref))
5227     return;
5228
5229   low_sub = up_sub = TREE_OPERAND (ref, 1);
5230   up_bound = array_ref_up_bound (ref);
5231
5232   /* Can not check flexible arrays.  */
5233   if (!up_bound
5234       || TREE_CODE (up_bound) != INTEGER_CST)
5235     return;
5236
5237   /* Accesses to trailing arrays via pointers may access storage
5238      beyond the types array bounds.  */
5239   base = get_base_address (ref);
5240   if (base && TREE_CODE (base) == MEM_REF)
5241     {
5242       tree cref, next = NULL_TREE;
5243
5244       if (TREE_CODE (TREE_OPERAND (ref, 0)) != COMPONENT_REF)
5245         return;
5246
5247       cref = TREE_OPERAND (ref, 0);
5248       if (TREE_CODE (TREE_TYPE (TREE_OPERAND (cref, 0))) == RECORD_TYPE)
5249         for (next = DECL_CHAIN (TREE_OPERAND (cref, 1));
5250              next && TREE_CODE (next) != FIELD_DECL;
5251              next = DECL_CHAIN (next))
5252           ;
5253
5254       /* If this is the last field in a struct type or a field in a
5255          union type do not warn.  */
5256       if (!next)
5257         return;
5258     }
5259
5260   low_bound = array_ref_low_bound (ref);
5261   up_bound_p1 = int_const_binop (PLUS_EXPR, up_bound, integer_one_node);
5262
5263   if (TREE_CODE (low_sub) == SSA_NAME)
5264     {
5265       vr = get_value_range (low_sub);
5266       if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
5267         {
5268           low_sub = vr->type == VR_RANGE ? vr->max : vr->min;
5269           up_sub = vr->type == VR_RANGE ? vr->min : vr->max;
5270         }
5271     }
5272
5273   if (vr && vr->type == VR_ANTI_RANGE)
5274     {
5275       if (TREE_CODE (up_sub) == INTEGER_CST
5276           && tree_int_cst_lt (up_bound, up_sub)
5277           && TREE_CODE (low_sub) == INTEGER_CST
5278           && tree_int_cst_lt (low_sub, low_bound))
5279         {
5280           warning_at (location, OPT_Warray_bounds,
5281                       "array subscript is outside array bounds");
5282           TREE_NO_WARNING (ref) = 1;
5283         }
5284     }
5285   else if (TREE_CODE (up_sub) == INTEGER_CST
5286            && (ignore_off_by_one
5287                ? (tree_int_cst_lt (up_bound, up_sub)
5288                   && !tree_int_cst_equal (up_bound_p1, up_sub))
5289                : (tree_int_cst_lt (up_bound, up_sub)
5290                   || tree_int_cst_equal (up_bound_p1, up_sub))))
5291     {
5292       warning_at (location, OPT_Warray_bounds,
5293                   "array subscript is above array bounds");
5294       TREE_NO_WARNING (ref) = 1;
5295     }
5296   else if (TREE_CODE (low_sub) == INTEGER_CST
5297            && tree_int_cst_lt (low_sub, low_bound))
5298     {
5299       warning_at (location, OPT_Warray_bounds,
5300                   "array subscript is below array bounds");
5301       TREE_NO_WARNING (ref) = 1;
5302     }
5303 }
5304
5305 /* Searches if the expr T, located at LOCATION computes
5306    address of an ARRAY_REF, and call check_array_ref on it.  */
5307
5308 static void
5309 search_for_addr_array (tree t, location_t location)
5310 {
5311   while (TREE_CODE (t) == SSA_NAME)
5312     {
5313       gimple g = SSA_NAME_DEF_STMT (t);
5314
5315       if (gimple_code (g) != GIMPLE_ASSIGN)
5316         return;
5317
5318       if (get_gimple_rhs_class (gimple_assign_rhs_code (g))
5319           != GIMPLE_SINGLE_RHS)
5320         return;
5321
5322       t = gimple_assign_rhs1 (g);
5323     }
5324
5325
5326   /* We are only interested in addresses of ARRAY_REF's.  */
5327   if (TREE_CODE (t) != ADDR_EXPR)
5328     return;
5329
5330   /* Check each ARRAY_REFs in the reference chain. */
5331   do
5332     {
5333       if (TREE_CODE (t) == ARRAY_REF)
5334         check_array_ref (location, t, true /*ignore_off_by_one*/);
5335
5336       t = TREE_OPERAND (t, 0);
5337     }
5338   while (handled_component_p (t));
5339
5340   if (TREE_CODE (t) == MEM_REF
5341       && TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR
5342       && !TREE_NO_WARNING (t))
5343     {
5344       tree tem = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
5345       tree low_bound, up_bound, el_sz;
5346       double_int idx;
5347       if (TREE_CODE (TREE_TYPE (tem)) != ARRAY_TYPE
5348           || TREE_CODE (TREE_TYPE (TREE_TYPE (tem))) == ARRAY_TYPE
5349           || !TYPE_DOMAIN (TREE_TYPE (tem)))
5350         return;
5351
5352       low_bound = TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (tem)));
5353       up_bound = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (tem)));
5354       el_sz = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (tem)));
5355       if (!low_bound
5356           || TREE_CODE (low_bound) != INTEGER_CST
5357           || !up_bound
5358           || TREE_CODE (up_bound) != INTEGER_CST
5359           || !el_sz
5360           || TREE_CODE (el_sz) != INTEGER_CST)
5361         return;
5362
5363       idx = mem_ref_offset (t);
5364       idx = double_int_sdiv (idx, tree_to_double_int (el_sz), TRUNC_DIV_EXPR);
5365       if (double_int_scmp (idx, double_int_zero) < 0)
5366         {
5367           warning_at (location, OPT_Warray_bounds,
5368                       "array subscript is below array bounds");
5369           TREE_NO_WARNING (t) = 1;
5370         }
5371       else if (double_int_scmp (idx,
5372                                 double_int_add
5373                                   (double_int_add
5374                                     (tree_to_double_int (up_bound),
5375                                      double_int_neg
5376                                        (tree_to_double_int (low_bound))),
5377                                     double_int_one)) > 0)
5378         {
5379           warning_at (location, OPT_Warray_bounds,
5380                       "array subscript is above array bounds");
5381           TREE_NO_WARNING (t) = 1;
5382         }
5383     }
5384 }
5385
5386 /* walk_tree() callback that checks if *TP is
5387    an ARRAY_REF inside an ADDR_EXPR (in which an array
5388    subscript one outside the valid range is allowed). Call
5389    check_array_ref for each ARRAY_REF found. The location is
5390    passed in DATA.  */
5391
5392 static tree
5393 check_array_bounds (tree *tp, int *walk_subtree, void *data)
5394 {
5395   tree t = *tp;
5396   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
5397   location_t location;
5398
5399   if (EXPR_HAS_LOCATION (t))
5400     location = EXPR_LOCATION (t);
5401   else
5402     {
5403       location_t *locp = (location_t *) wi->info;
5404       location = *locp;
5405     }
5406
5407   *walk_subtree = TRUE;
5408
5409   if (TREE_CODE (t) == ARRAY_REF)
5410     check_array_ref (location, t, false /*ignore_off_by_one*/);
5411
5412   if (TREE_CODE (t) == MEM_REF
5413       || (TREE_CODE (t) == RETURN_EXPR && TREE_OPERAND (t, 0)))
5414     search_for_addr_array (TREE_OPERAND (t, 0), location);
5415
5416   if (TREE_CODE (t) == ADDR_EXPR)
5417     *walk_subtree = FALSE;
5418
5419   return NULL_TREE;
5420 }
5421
5422 /* Walk over all statements of all reachable BBs and call check_array_bounds
5423    on them.  */
5424
5425 static void
5426 check_all_array_refs (void)
5427 {
5428   basic_block bb;
5429   gimple_stmt_iterator si;
5430
5431   FOR_EACH_BB (bb)
5432     {
5433       edge_iterator ei;
5434       edge e;
5435       bool executable = false;
5436
5437       /* Skip blocks that were found to be unreachable.  */
5438       FOR_EACH_EDGE (e, ei, bb->preds)
5439         executable |= !!(e->flags & EDGE_EXECUTABLE);
5440       if (!executable)
5441         continue;
5442
5443       for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
5444         {
5445           gimple stmt = gsi_stmt (si);
5446           struct walk_stmt_info wi;
5447           if (!gimple_has_location (stmt))
5448             continue;
5449
5450           if (is_gimple_call (stmt))
5451             {
5452               size_t i;
5453               size_t n = gimple_call_num_args (stmt);
5454               for (i = 0; i < n; i++)
5455                 {
5456                   tree arg = gimple_call_arg (stmt, i);
5457                   search_for_addr_array (arg, gimple_location (stmt));
5458                 }
5459             }
5460           else
5461             {
5462               memset (&wi, 0, sizeof (wi));
5463               wi.info = CONST_CAST (void *, (const void *)
5464                                     gimple_location_ptr (stmt));
5465
5466               walk_gimple_op (gsi_stmt (si),
5467                               check_array_bounds,
5468                               &wi);
5469             }
5470         }
5471     }
5472 }
5473
5474 /* Convert range assertion expressions into the implied copies and
5475    copy propagate away the copies.  Doing the trivial copy propagation
5476    here avoids the need to run the full copy propagation pass after
5477    VRP.
5478
5479    FIXME, this will eventually lead to copy propagation removing the
5480    names that had useful range information attached to them.  For
5481    instance, if we had the assertion N_i = ASSERT_EXPR <N_j, N_j > 3>,
5482    then N_i will have the range [3, +INF].
5483
5484    However, by converting the assertion into the implied copy
5485    operation N_i = N_j, we will then copy-propagate N_j into the uses
5486    of N_i and lose the range information.  We may want to hold on to
5487    ASSERT_EXPRs a little while longer as the ranges could be used in
5488    things like jump threading.
5489
5490    The problem with keeping ASSERT_EXPRs around is that passes after
5491    VRP need to handle them appropriately.
5492
5493    Another approach would be to make the range information a first
5494    class property of the SSA_NAME so that it can be queried from
5495    any pass.  This is made somewhat more complex by the need for
5496    multiple ranges to be associated with one SSA_NAME.  */
5497
5498 static void
5499 remove_range_assertions (void)
5500 {
5501   basic_block bb;
5502   gimple_stmt_iterator si;
5503
5504   /* Note that the BSI iterator bump happens at the bottom of the
5505      loop and no bump is necessary if we're removing the statement
5506      referenced by the current BSI.  */
5507   FOR_EACH_BB (bb)
5508     for (si = gsi_start_bb (bb); !gsi_end_p (si);)
5509       {
5510         gimple stmt = gsi_stmt (si);
5511         gimple use_stmt;
5512
5513         if (is_gimple_assign (stmt)
5514             && gimple_assign_rhs_code (stmt) == ASSERT_EXPR)
5515           {
5516             tree rhs = gimple_assign_rhs1 (stmt);
5517             tree var;
5518             tree cond = fold (ASSERT_EXPR_COND (rhs));
5519             use_operand_p use_p;
5520             imm_use_iterator iter;
5521
5522             gcc_assert (cond != boolean_false_node);
5523
5524             /* Propagate the RHS into every use of the LHS.  */
5525             var = ASSERT_EXPR_VAR (rhs);
5526             FOR_EACH_IMM_USE_STMT (use_stmt, iter,
5527                                    gimple_assign_lhs (stmt))
5528               FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
5529                 {
5530                   SET_USE (use_p, var);
5531                   gcc_assert (TREE_CODE (var) == SSA_NAME);
5532                 }
5533
5534             /* And finally, remove the copy, it is not needed.  */
5535             gsi_remove (&si, true);
5536             release_defs (stmt);
5537           }
5538         else
5539           gsi_next (&si);
5540       }
5541 }
5542
5543
5544 /* Return true if STMT is interesting for VRP.  */
5545
5546 static bool
5547 stmt_interesting_for_vrp (gimple stmt)
5548 {
5549   if (gimple_code (stmt) == GIMPLE_PHI
5550       && is_gimple_reg (gimple_phi_result (stmt))
5551       && (INTEGRAL_TYPE_P (TREE_TYPE (gimple_phi_result (stmt)))
5552           || POINTER_TYPE_P (TREE_TYPE (gimple_phi_result (stmt)))))
5553     return true;
5554   else if (is_gimple_assign (stmt) || is_gimple_call (stmt))
5555     {
5556       tree lhs = gimple_get_lhs (stmt);
5557
5558       /* In general, assignments with virtual operands are not useful
5559          for deriving ranges, with the obvious exception of calls to
5560          builtin functions.  */
5561       if (lhs && TREE_CODE (lhs) == SSA_NAME
5562           && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
5563               || POINTER_TYPE_P (TREE_TYPE (lhs)))
5564           && ((is_gimple_call (stmt)
5565                && gimple_call_fndecl (stmt) != NULL_TREE
5566                && DECL_IS_BUILTIN (gimple_call_fndecl (stmt)))
5567               || !gimple_vuse (stmt)))
5568         return true;
5569     }
5570   else if (gimple_code (stmt) == GIMPLE_COND
5571            || gimple_code (stmt) == GIMPLE_SWITCH)
5572     return true;
5573
5574   return false;
5575 }
5576
5577
5578 /* Initialize local data structures for VRP.  */
5579
5580 static void
5581 vrp_initialize (void)
5582 {
5583   basic_block bb;
5584
5585   vr_value = XCNEWVEC (value_range_t *, num_ssa_names);
5586   vr_phi_edge_counts = XCNEWVEC (int, num_ssa_names);
5587
5588   FOR_EACH_BB (bb)
5589     {
5590       gimple_stmt_iterator si;
5591
5592       for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
5593         {
5594           gimple phi = gsi_stmt (si);
5595           if (!stmt_interesting_for_vrp (phi))
5596             {
5597               tree lhs = PHI_RESULT (phi);
5598               set_value_range_to_varying (get_value_range (lhs));
5599               prop_set_simulate_again (phi, false);
5600             }
5601           else
5602             prop_set_simulate_again (phi, true);
5603         }
5604
5605       for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
5606         {
5607           gimple stmt = gsi_stmt (si);
5608
5609           /* If the statement is a control insn, then we do not
5610              want to avoid simulating the statement once.  Failure
5611              to do so means that those edges will never get added.  */
5612           if (stmt_ends_bb_p (stmt))
5613             prop_set_simulate_again (stmt, true);
5614           else if (!stmt_interesting_for_vrp (stmt))
5615             {
5616               ssa_op_iter i;
5617               tree def;
5618               FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
5619                 set_value_range_to_varying (get_value_range (def));
5620               prop_set_simulate_again (stmt, false);
5621             }
5622           else
5623             prop_set_simulate_again (stmt, true);
5624         }
5625     }
5626 }
5627
5628 /* Return the singleton value-range for NAME or NAME.  */
5629
5630 static inline tree
5631 vrp_valueize (tree name)
5632 {
5633   if (TREE_CODE (name) == SSA_NAME)
5634     {
5635       value_range_t *vr = get_value_range (name);
5636       if (vr->type == VR_RANGE
5637           && (vr->min == vr->max
5638               || operand_equal_p (vr->min, vr->max, 0)))
5639         return vr->min;
5640     }
5641   return name;
5642 }
5643
5644 /* Visit assignment STMT.  If it produces an interesting range, record
5645    the SSA name in *OUTPUT_P.  */
5646
5647 static enum ssa_prop_result
5648 vrp_visit_assignment_or_call (gimple stmt, tree *output_p)
5649 {
5650   tree def, lhs;
5651   ssa_op_iter iter;
5652   enum gimple_code code = gimple_code (stmt);
5653   lhs = gimple_get_lhs (stmt);
5654
5655   /* We only keep track of ranges in integral and pointer types.  */
5656   if (TREE_CODE (lhs) == SSA_NAME
5657       && ((INTEGRAL_TYPE_P (TREE_TYPE (lhs))
5658            /* It is valid to have NULL MIN/MAX values on a type.  See
5659               build_range_type.  */
5660            && TYPE_MIN_VALUE (TREE_TYPE (lhs))
5661            && TYPE_MAX_VALUE (TREE_TYPE (lhs)))
5662           || POINTER_TYPE_P (TREE_TYPE (lhs))))
5663     {
5664       value_range_t new_vr = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
5665
5666       /* Try folding the statement to a constant first.  */
5667       tree tem = gimple_fold_stmt_to_constant (stmt, vrp_valueize);
5668       if (tem && !is_overflow_infinity (tem))
5669         set_value_range (&new_vr, VR_RANGE, tem, tem, NULL);
5670       /* Then dispatch to value-range extracting functions.  */
5671       else if (code == GIMPLE_CALL)
5672         extract_range_basic (&new_vr, stmt);
5673       else
5674         extract_range_from_assignment (&new_vr, stmt);
5675
5676       if (update_value_range (lhs, &new_vr))
5677         {
5678           *output_p = lhs;
5679
5680           if (dump_file && (dump_flags & TDF_DETAILS))
5681             {
5682               fprintf (dump_file, "Found new range for ");
5683               print_generic_expr (dump_file, lhs, 0);
5684               fprintf (dump_file, ": ");
5685               dump_value_range (dump_file, &new_vr);
5686               fprintf (dump_file, "\n\n");
5687             }
5688
5689           if (new_vr.type == VR_VARYING)
5690             return SSA_PROP_VARYING;
5691
5692           return SSA_PROP_INTERESTING;
5693         }
5694
5695       return SSA_PROP_NOT_INTERESTING;
5696     }
5697
5698   /* Every other statement produces no useful ranges.  */
5699   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
5700     set_value_range_to_varying (get_value_range (def));
5701
5702   return SSA_PROP_VARYING;
5703 }
5704
5705 /* Helper that gets the value range of the SSA_NAME with version I
5706    or a symbolic range containing the SSA_NAME only if the value range
5707    is varying or undefined.  */
5708
5709 static inline value_range_t
5710 get_vr_for_comparison (int i)
5711 {
5712   value_range_t vr = *(vr_value[i]);
5713
5714   /* If name N_i does not have a valid range, use N_i as its own
5715      range.  This allows us to compare against names that may
5716      have N_i in their ranges.  */
5717   if (vr.type == VR_VARYING || vr.type == VR_UNDEFINED)
5718     {
5719       vr.type = VR_RANGE;
5720       vr.min = ssa_name (i);
5721       vr.max = ssa_name (i);
5722     }
5723
5724   return vr;
5725 }
5726
5727 /* Compare all the value ranges for names equivalent to VAR with VAL
5728    using comparison code COMP.  Return the same value returned by
5729    compare_range_with_value, including the setting of
5730    *STRICT_OVERFLOW_P.  */
5731
5732 static tree
5733 compare_name_with_value (enum tree_code comp, tree var, tree val,
5734                          bool *strict_overflow_p)
5735 {
5736   bitmap_iterator bi;
5737   unsigned i;
5738   bitmap e;
5739   tree retval, t;
5740   int used_strict_overflow;
5741   bool sop;
5742   value_range_t equiv_vr;
5743
5744   /* Get the set of equivalences for VAR.  */
5745   e = get_value_range (var)->equiv;
5746
5747   /* Start at -1.  Set it to 0 if we do a comparison without relying
5748      on overflow, or 1 if all comparisons rely on overflow.  */
5749   used_strict_overflow = -1;
5750
5751   /* Compare vars' value range with val.  */
5752   equiv_vr = get_vr_for_comparison (SSA_NAME_VERSION (var));
5753   sop = false;
5754   retval = compare_range_with_value (comp, &equiv_vr, val, &sop);
5755   if (retval)
5756     used_strict_overflow = sop ? 1 : 0;
5757
5758   /* If the equiv set is empty we have done all work we need to do.  */
5759   if (e == NULL)
5760     {
5761       if (retval
5762           && used_strict_overflow > 0)
5763         *strict_overflow_p = true;
5764       return retval;
5765     }
5766
5767   EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
5768     {
5769       equiv_vr = get_vr_for_comparison (i);
5770       sop = false;
5771       t = compare_range_with_value (comp, &equiv_vr, val, &sop);
5772       if (t)
5773         {
5774           /* If we get different answers from different members
5775              of the equivalence set this check must be in a dead
5776              code region.  Folding it to a trap representation
5777              would be correct here.  For now just return don't-know.  */
5778           if (retval != NULL
5779               && t != retval)
5780             {
5781               retval = NULL_TREE;
5782               break;
5783             }
5784           retval = t;
5785
5786           if (!sop)
5787             used_strict_overflow = 0;
5788           else if (used_strict_overflow < 0)
5789             used_strict_overflow = 1;
5790         }
5791     }
5792
5793   if (retval
5794       && used_strict_overflow > 0)
5795     *strict_overflow_p = true;
5796
5797   return retval;
5798 }
5799
5800
5801 /* Given a comparison code COMP and names N1 and N2, compare all the
5802    ranges equivalent to N1 against all the ranges equivalent to N2
5803    to determine the value of N1 COMP N2.  Return the same value
5804    returned by compare_ranges.  Set *STRICT_OVERFLOW_P to indicate
5805    whether we relied on an overflow infinity in the comparison.  */
5806
5807
5808 static tree
5809 compare_names (enum tree_code comp, tree n1, tree n2,
5810                bool *strict_overflow_p)
5811 {
5812   tree t, retval;
5813   bitmap e1, e2;
5814   bitmap_iterator bi1, bi2;
5815   unsigned i1, i2;
5816   int used_strict_overflow;
5817   static bitmap_obstack *s_obstack = NULL;
5818   static bitmap s_e1 = NULL, s_e2 = NULL;
5819
5820   /* Compare the ranges of every name equivalent to N1 against the
5821      ranges of every name equivalent to N2.  */
5822   e1 = get_value_range (n1)->equiv;
5823   e2 = get_value_range (n2)->equiv;
5824
5825   /* Use the fake bitmaps if e1 or e2 are not available.  */
5826   if (s_obstack == NULL)
5827     {
5828       s_obstack = XNEW (bitmap_obstack);
5829       bitmap_obstack_initialize (s_obstack);
5830       s_e1 = BITMAP_ALLOC (s_obstack);
5831       s_e2 = BITMAP_ALLOC (s_obstack);
5832     }
5833   if (e1 == NULL)
5834     e1 = s_e1;
5835   if (e2 == NULL)
5836     e2 = s_e2;
5837
5838   /* Add N1 and N2 to their own set of equivalences to avoid
5839      duplicating the body of the loop just to check N1 and N2
5840      ranges.  */
5841   bitmap_set_bit (e1, SSA_NAME_VERSION (n1));
5842   bitmap_set_bit (e2, SSA_NAME_VERSION (n2));
5843
5844   /* If the equivalence sets have a common intersection, then the two
5845      names can be compared without checking their ranges.  */
5846   if (bitmap_intersect_p (e1, e2))
5847     {
5848       bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
5849       bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
5850
5851       return (comp == EQ_EXPR || comp == GE_EXPR || comp == LE_EXPR)
5852              ? boolean_true_node
5853              : boolean_false_node;
5854     }
5855
5856   /* Start at -1.  Set it to 0 if we do a comparison without relying
5857      on overflow, or 1 if all comparisons rely on overflow.  */
5858   used_strict_overflow = -1;
5859
5860   /* Otherwise, compare all the equivalent ranges.  First, add N1 and
5861      N2 to their own set of equivalences to avoid duplicating the body
5862      of the loop just to check N1 and N2 ranges.  */
5863   EXECUTE_IF_SET_IN_BITMAP (e1, 0, i1, bi1)
5864     {
5865       value_range_t vr1 = get_vr_for_comparison (i1);
5866
5867       t = retval = NULL_TREE;
5868       EXECUTE_IF_SET_IN_BITMAP (e2, 0, i2, bi2)
5869         {
5870           bool sop = false;
5871
5872           value_range_t vr2 = get_vr_for_comparison (i2);
5873
5874           t = compare_ranges (comp, &vr1, &vr2, &sop);
5875           if (t)
5876             {
5877               /* If we get different answers from different members
5878                  of the equivalence set this check must be in a dead
5879                  code region.  Folding it to a trap representation
5880                  would be correct here.  For now just return don't-know.  */
5881               if (retval != NULL
5882                   && t != retval)
5883                 {
5884                   bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
5885                   bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
5886                   return NULL_TREE;
5887                 }
5888               retval = t;
5889
5890               if (!sop)
5891                 used_strict_overflow = 0;
5892               else if (used_strict_overflow < 0)
5893                 used_strict_overflow = 1;
5894             }
5895         }
5896
5897       if (retval)
5898         {
5899           bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
5900           bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
5901           if (used_strict_overflow > 0)
5902             *strict_overflow_p = true;
5903           return retval;
5904         }
5905     }
5906
5907   /* None of the equivalent ranges are useful in computing this
5908      comparison.  */
5909   bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
5910   bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
5911   return NULL_TREE;
5912 }
5913
5914 /* Helper function for vrp_evaluate_conditional_warnv.  */
5915
5916 static tree
5917 vrp_evaluate_conditional_warnv_with_ops_using_ranges (enum tree_code code,
5918                                                       tree op0, tree op1,
5919                                                       bool * strict_overflow_p)
5920 {
5921   value_range_t *vr0, *vr1;
5922
5923   vr0 = (TREE_CODE (op0) == SSA_NAME) ? get_value_range (op0) : NULL;
5924   vr1 = (TREE_CODE (op1) == SSA_NAME) ? get_value_range (op1) : NULL;
5925
5926   if (vr0 && vr1)
5927     return compare_ranges (code, vr0, vr1, strict_overflow_p);
5928   else if (vr0 && vr1 == NULL)
5929     return compare_range_with_value (code, vr0, op1, strict_overflow_p);
5930   else if (vr0 == NULL && vr1)
5931     return (compare_range_with_value
5932             (swap_tree_comparison (code), vr1, op0, strict_overflow_p));
5933   return NULL;
5934 }
5935
5936 /* Helper function for vrp_evaluate_conditional_warnv. */
5937
5938 static tree
5939 vrp_evaluate_conditional_warnv_with_ops (enum tree_code code, tree op0,
5940                                          tree op1, bool use_equiv_p,
5941                                          bool *strict_overflow_p, bool *only_ranges)
5942 {
5943   tree ret;
5944   if (only_ranges)
5945     *only_ranges = true;
5946
5947   /* We only deal with integral and pointer types.  */
5948   if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
5949       && !POINTER_TYPE_P (TREE_TYPE (op0)))
5950     return NULL_TREE;
5951
5952   if (use_equiv_p)
5953     {
5954       if (only_ranges
5955           && (ret = vrp_evaluate_conditional_warnv_with_ops_using_ranges
5956                       (code, op0, op1, strict_overflow_p)))
5957         return ret;
5958       *only_ranges = false;
5959       if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME)
5960         return compare_names (code, op0, op1, strict_overflow_p);
5961       else if (TREE_CODE (op0) == SSA_NAME)
5962         return compare_name_with_value (code, op0, op1, strict_overflow_p);
5963       else if (TREE_CODE (op1) == SSA_NAME)
5964         return (compare_name_with_value
5965                 (swap_tree_comparison (code), op1, op0, strict_overflow_p));
5966     }
5967   else
5968     return vrp_evaluate_conditional_warnv_with_ops_using_ranges (code, op0, op1,
5969                                                                  strict_overflow_p);
5970   return NULL_TREE;
5971 }
5972
5973 /* Given (CODE OP0 OP1) within STMT, try to simplify it based on value range
5974    information.  Return NULL if the conditional can not be evaluated.
5975    The ranges of all the names equivalent with the operands in COND
5976    will be used when trying to compute the value.  If the result is
5977    based on undefined signed overflow, issue a warning if
5978    appropriate.  */
5979
5980 static tree
5981 vrp_evaluate_conditional (enum tree_code code, tree op0, tree op1, gimple stmt)
5982 {
5983   bool sop;
5984   tree ret;
5985   bool only_ranges;
5986
5987   /* Some passes and foldings leak constants with overflow flag set
5988      into the IL.  Avoid doing wrong things with these and bail out.  */
5989   if ((TREE_CODE (op0) == INTEGER_CST
5990        && TREE_OVERFLOW (op0))
5991       || (TREE_CODE (op1) == INTEGER_CST
5992           && TREE_OVERFLOW (op1)))
5993     return NULL_TREE;
5994
5995   sop = false;
5996   ret = vrp_evaluate_conditional_warnv_with_ops (code, op0, op1, true, &sop,
5997                                                  &only_ranges);
5998
5999   if (ret && sop)
6000     {
6001       enum warn_strict_overflow_code wc;
6002       const char* warnmsg;
6003
6004       if (is_gimple_min_invariant (ret))
6005         {
6006           wc = WARN_STRICT_OVERFLOW_CONDITIONAL;
6007           warnmsg = G_("assuming signed overflow does not occur when "
6008                        "simplifying conditional to constant");
6009         }
6010       else
6011         {
6012           wc = WARN_STRICT_OVERFLOW_COMPARISON;
6013           warnmsg = G_("assuming signed overflow does not occur when "
6014                        "simplifying conditional");
6015         }
6016
6017       if (issue_strict_overflow_warning (wc))
6018         {
6019           location_t location;
6020
6021           if (!gimple_has_location (stmt))
6022             location = input_location;
6023           else
6024             location = gimple_location (stmt);
6025           warning_at (location, OPT_Wstrict_overflow, "%s", warnmsg);
6026         }
6027     }
6028
6029   if (warn_type_limits
6030       && ret && only_ranges
6031       && TREE_CODE_CLASS (code) == tcc_comparison
6032       && TREE_CODE (op0) == SSA_NAME)
6033     {
6034       /* If the comparison is being folded and the operand on the LHS
6035          is being compared against a constant value that is outside of
6036          the natural range of OP0's type, then the predicate will
6037          always fold regardless of the value of OP0.  If -Wtype-limits
6038          was specified, emit a warning.  */
6039       tree type = TREE_TYPE (op0);
6040       value_range_t *vr0 = get_value_range (op0);
6041
6042       if (vr0->type != VR_VARYING
6043           && INTEGRAL_TYPE_P (type)
6044           && vrp_val_is_min (vr0->min)
6045           && vrp_val_is_max (vr0->max)
6046           && is_gimple_min_invariant (op1))
6047         {
6048           location_t location;
6049
6050           if (!gimple_has_location (stmt))
6051             location = input_location;
6052           else
6053             location = gimple_location (stmt);
6054
6055           warning_at (location, OPT_Wtype_limits,
6056                       integer_zerop (ret)
6057                       ? G_("comparison always false "
6058                            "due to limited range of data type")
6059                       : G_("comparison always true "
6060                            "due to limited range of data type"));
6061         }
6062     }
6063
6064   return ret;
6065 }
6066
6067
6068 /* Visit conditional statement STMT.  If we can determine which edge
6069    will be taken out of STMT's basic block, record it in
6070    *TAKEN_EDGE_P and return SSA_PROP_INTERESTING.  Otherwise, return
6071    SSA_PROP_VARYING.  */
6072
6073 static enum ssa_prop_result
6074 vrp_visit_cond_stmt (gimple stmt, edge *taken_edge_p)
6075 {
6076   tree val;
6077   bool sop;
6078
6079   *taken_edge_p = NULL;
6080
6081   if (dump_file && (dump_flags & TDF_DETAILS))
6082     {
6083       tree use;
6084       ssa_op_iter i;
6085
6086       fprintf (dump_file, "\nVisiting conditional with predicate: ");
6087       print_gimple_stmt (dump_file, stmt, 0, 0);
6088       fprintf (dump_file, "\nWith known ranges\n");
6089
6090       FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
6091         {
6092           fprintf (dump_file, "\t");
6093           print_generic_expr (dump_file, use, 0);
6094           fprintf (dump_file, ": ");
6095           dump_value_range (dump_file, vr_value[SSA_NAME_VERSION (use)]);
6096         }
6097
6098       fprintf (dump_file, "\n");
6099     }
6100
6101   /* Compute the value of the predicate COND by checking the known
6102      ranges of each of its operands.
6103
6104      Note that we cannot evaluate all the equivalent ranges here
6105      because those ranges may not yet be final and with the current
6106      propagation strategy, we cannot determine when the value ranges
6107      of the names in the equivalence set have changed.
6108
6109      For instance, given the following code fragment
6110
6111         i_5 = PHI <8, i_13>
6112         ...
6113         i_14 = ASSERT_EXPR <i_5, i_5 != 0>
6114         if (i_14 == 1)
6115           ...
6116
6117      Assume that on the first visit to i_14, i_5 has the temporary
6118      range [8, 8] because the second argument to the PHI function is
6119      not yet executable.  We derive the range ~[0, 0] for i_14 and the
6120      equivalence set { i_5 }.  So, when we visit 'if (i_14 == 1)' for
6121      the first time, since i_14 is equivalent to the range [8, 8], we
6122      determine that the predicate is always false.
6123
6124      On the next round of propagation, i_13 is determined to be
6125      VARYING, which causes i_5 to drop down to VARYING.  So, another
6126      visit to i_14 is scheduled.  In this second visit, we compute the
6127      exact same range and equivalence set for i_14, namely ~[0, 0] and
6128      { i_5 }.  But we did not have the previous range for i_5
6129      registered, so vrp_visit_assignment thinks that the range for
6130      i_14 has not changed.  Therefore, the predicate 'if (i_14 == 1)'
6131      is not visited again, which stops propagation from visiting
6132      statements in the THEN clause of that if().
6133
6134      To properly fix this we would need to keep the previous range
6135      value for the names in the equivalence set.  This way we would've
6136      discovered that from one visit to the other i_5 changed from
6137      range [8, 8] to VR_VARYING.
6138
6139      However, fixing this apparent limitation may not be worth the
6140      additional checking.  Testing on several code bases (GCC, DLV,
6141      MICO, TRAMP3D and SPEC2000) showed that doing this results in
6142      4 more predicates folded in SPEC.  */
6143   sop = false;
6144
6145   val = vrp_evaluate_conditional_warnv_with_ops (gimple_cond_code (stmt),
6146                                                  gimple_cond_lhs (stmt),
6147                                                  gimple_cond_rhs (stmt),
6148                                                  false, &sop, NULL);
6149   if (val)
6150     {
6151       if (!sop)
6152         *taken_edge_p = find_taken_edge (gimple_bb (stmt), val);
6153       else
6154         {
6155           if (dump_file && (dump_flags & TDF_DETAILS))
6156             fprintf (dump_file,
6157                      "\nIgnoring predicate evaluation because "
6158                      "it assumes that signed overflow is undefined");
6159           val = NULL_TREE;
6160         }
6161     }
6162
6163   if (dump_file && (dump_flags & TDF_DETAILS))
6164     {
6165       fprintf (dump_file, "\nPredicate evaluates to: ");
6166       if (val == NULL_TREE)
6167         fprintf (dump_file, "DON'T KNOW\n");
6168       else
6169         print_generic_stmt (dump_file, val, 0);
6170     }
6171
6172   return (*taken_edge_p) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
6173 }
6174
6175 /* Searches the case label vector VEC for the index *IDX of the CASE_LABEL
6176    that includes the value VAL.  The search is restricted to the range
6177    [START_IDX, n - 1] where n is the size of VEC.
6178
6179    If there is a CASE_LABEL for VAL, its index is placed in IDX and true is
6180    returned.
6181
6182    If there is no CASE_LABEL for VAL and there is one that is larger than VAL,
6183    it is placed in IDX and false is returned.
6184
6185    If VAL is larger than any CASE_LABEL, n is placed on IDX and false is
6186    returned. */
6187
6188 static bool
6189 find_case_label_index (gimple stmt, size_t start_idx, tree val, size_t *idx)
6190 {
6191   size_t n = gimple_switch_num_labels (stmt);
6192   size_t low, high;
6193
6194   /* Find case label for minimum of the value range or the next one.
6195      At each iteration we are searching in [low, high - 1]. */
6196
6197   for (low = start_idx, high = n; high != low; )
6198     {
6199       tree t;
6200       int cmp;
6201       /* Note that i != high, so we never ask for n. */
6202       size_t i = (high + low) / 2;
6203       t = gimple_switch_label (stmt, i);
6204
6205       /* Cache the result of comparing CASE_LOW and val.  */
6206       cmp = tree_int_cst_compare (CASE_LOW (t), val);
6207
6208       if (cmp == 0)
6209         {
6210           /* Ranges cannot be empty. */
6211           *idx = i;
6212           return true;
6213         }
6214       else if (cmp > 0)
6215         high = i;
6216       else
6217         {
6218           low = i + 1;
6219           if (CASE_HIGH (t) != NULL
6220               && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
6221             {
6222               *idx = i;
6223               return true;
6224             }
6225         }
6226     }
6227
6228   *idx = high;
6229   return false;
6230 }
6231
6232 /* Searches the case label vector VEC for the range of CASE_LABELs that is used
6233    for values between MIN and MAX. The first index is placed in MIN_IDX. The
6234    last index is placed in MAX_IDX. If the range of CASE_LABELs is empty
6235    then MAX_IDX < MIN_IDX.
6236    Returns true if the default label is not needed. */
6237
6238 static bool
6239 find_case_label_range (gimple stmt, tree min, tree max, size_t *min_idx,
6240                        size_t *max_idx)
6241 {
6242   size_t i, j;
6243   bool min_take_default = !find_case_label_index (stmt, 1, min, &i);
6244   bool max_take_default = !find_case_label_index (stmt, i, max, &j);
6245
6246   if (i == j
6247       && min_take_default
6248       && max_take_default)
6249     {
6250       /* Only the default case label reached.
6251          Return an empty range. */
6252       *min_idx = 1;
6253       *max_idx = 0;
6254       return false;
6255     }
6256   else
6257     {
6258       bool take_default = min_take_default || max_take_default;
6259       tree low, high;
6260       size_t k;
6261
6262       if (max_take_default)
6263         j--;
6264
6265       /* If the case label range is continuous, we do not need
6266          the default case label.  Verify that.  */
6267       high = CASE_LOW (gimple_switch_label (stmt, i));
6268       if (CASE_HIGH (gimple_switch_label (stmt, i)))
6269         high = CASE_HIGH (gimple_switch_label (stmt, i));
6270       for (k = i + 1; k <= j; ++k)
6271         {
6272           low = CASE_LOW (gimple_switch_label (stmt, k));
6273           if (!integer_onep (int_const_binop (MINUS_EXPR, low, high)))
6274             {
6275               take_default = true;
6276               break;
6277             }
6278           high = low;
6279           if (CASE_HIGH (gimple_switch_label (stmt, k)))
6280             high = CASE_HIGH (gimple_switch_label (stmt, k));
6281         }
6282
6283       *min_idx = i;
6284       *max_idx = j;
6285       return !take_default;
6286     }
6287 }
6288
6289 /* Visit switch statement STMT.  If we can determine which edge
6290    will be taken out of STMT's basic block, record it in
6291    *TAKEN_EDGE_P and return SSA_PROP_INTERESTING.  Otherwise, return
6292    SSA_PROP_VARYING.  */
6293
6294 static enum ssa_prop_result
6295 vrp_visit_switch_stmt (gimple stmt, edge *taken_edge_p)
6296 {
6297   tree op, val;
6298   value_range_t *vr;
6299   size_t i = 0, j = 0;
6300   bool take_default;
6301
6302   *taken_edge_p = NULL;
6303   op = gimple_switch_index (stmt);
6304   if (TREE_CODE (op) != SSA_NAME)
6305     return SSA_PROP_VARYING;
6306
6307   vr = get_value_range (op);
6308   if (dump_file && (dump_flags & TDF_DETAILS))
6309     {
6310       fprintf (dump_file, "\nVisiting switch expression with operand ");
6311       print_generic_expr (dump_file, op, 0);
6312       fprintf (dump_file, " with known range ");
6313       dump_value_range (dump_file, vr);
6314       fprintf (dump_file, "\n");
6315     }
6316
6317   if (vr->type != VR_RANGE
6318       || symbolic_range_p (vr))
6319     return SSA_PROP_VARYING;
6320
6321   /* Find the single edge that is taken from the switch expression.  */
6322   take_default = !find_case_label_range (stmt, vr->min, vr->max, &i, &j);
6323
6324   /* Check if the range spans no CASE_LABEL. If so, we only reach the default
6325      label */
6326   if (j < i)
6327     {
6328       gcc_assert (take_default);
6329       val = gimple_switch_default_label (stmt);
6330     }
6331   else
6332     {
6333       /* Check if labels with index i to j and maybe the default label
6334          are all reaching the same label.  */
6335
6336       val = gimple_switch_label (stmt, i);
6337       if (take_default
6338           && CASE_LABEL (gimple_switch_default_label (stmt))
6339           != CASE_LABEL (val))
6340         {
6341           if (dump_file && (dump_flags & TDF_DETAILS))
6342             fprintf (dump_file, "  not a single destination for this "
6343                      "range\n");
6344           return SSA_PROP_VARYING;
6345         }
6346       for (++i; i <= j; ++i)
6347         {
6348           if (CASE_LABEL (gimple_switch_label (stmt, i)) != CASE_LABEL (val))
6349             {
6350               if (dump_file && (dump_flags & TDF_DETAILS))
6351                 fprintf (dump_file, "  not a single destination for this "
6352                          "range\n");
6353               return SSA_PROP_VARYING;
6354             }
6355         }
6356     }
6357
6358   *taken_edge_p = find_edge (gimple_bb (stmt),
6359                              label_to_block (CASE_LABEL (val)));
6360
6361   if (dump_file && (dump_flags & TDF_DETAILS))
6362     {
6363       fprintf (dump_file, "  will take edge to ");
6364       print_generic_stmt (dump_file, CASE_LABEL (val), 0);
6365     }
6366
6367   return SSA_PROP_INTERESTING;
6368 }
6369
6370
6371 /* Evaluate statement STMT.  If the statement produces a useful range,
6372    return SSA_PROP_INTERESTING and record the SSA name with the
6373    interesting range into *OUTPUT_P.
6374
6375    If STMT is a conditional branch and we can determine its truth
6376    value, the taken edge is recorded in *TAKEN_EDGE_P.
6377
6378    If STMT produces a varying value, return SSA_PROP_VARYING.  */
6379
6380 static enum ssa_prop_result
6381 vrp_visit_stmt (gimple stmt, edge *taken_edge_p, tree *output_p)
6382 {
6383   tree def;
6384   ssa_op_iter iter;
6385
6386   if (dump_file && (dump_flags & TDF_DETAILS))
6387     {
6388       fprintf (dump_file, "\nVisiting statement:\n");
6389       print_gimple_stmt (dump_file, stmt, 0, dump_flags);
6390       fprintf (dump_file, "\n");
6391     }
6392
6393   if (!stmt_interesting_for_vrp (stmt))
6394     gcc_assert (stmt_ends_bb_p (stmt));
6395   else if (is_gimple_assign (stmt) || is_gimple_call (stmt))
6396     {
6397       /* In general, assignments with virtual operands are not useful
6398          for deriving ranges, with the obvious exception of calls to
6399          builtin functions.  */
6400       if ((is_gimple_call (stmt)
6401            && gimple_call_fndecl (stmt) != NULL_TREE
6402            && DECL_IS_BUILTIN (gimple_call_fndecl (stmt)))
6403           || !gimple_vuse (stmt))
6404         return vrp_visit_assignment_or_call (stmt, output_p);
6405     }
6406   else if (gimple_code (stmt) == GIMPLE_COND)
6407     return vrp_visit_cond_stmt (stmt, taken_edge_p);
6408   else if (gimple_code (stmt) == GIMPLE_SWITCH)
6409     return vrp_visit_switch_stmt (stmt, taken_edge_p);
6410
6411   /* All other statements produce nothing of interest for VRP, so mark
6412      their outputs varying and prevent further simulation.  */
6413   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
6414     set_value_range_to_varying (get_value_range (def));
6415
6416   return SSA_PROP_VARYING;
6417 }
6418
6419
6420 /* Meet operation for value ranges.  Given two value ranges VR0 and
6421    VR1, store in VR0 a range that contains both VR0 and VR1.  This
6422    may not be the smallest possible such range.  */
6423
6424 static void
6425 vrp_meet (value_range_t *vr0, value_range_t *vr1)
6426 {
6427   if (vr0->type == VR_UNDEFINED)
6428     {
6429       copy_value_range (vr0, vr1);
6430       return;
6431     }
6432
6433   if (vr1->type == VR_UNDEFINED)
6434     {
6435       /* Nothing to do.  VR0 already has the resulting range.  */
6436       return;
6437     }
6438
6439   if (vr0->type == VR_VARYING)
6440     {
6441       /* Nothing to do.  VR0 already has the resulting range.  */
6442       return;
6443     }
6444
6445   if (vr1->type == VR_VARYING)
6446     {
6447       set_value_range_to_varying (vr0);
6448       return;
6449     }
6450
6451   if (vr0->type == VR_RANGE && vr1->type == VR_RANGE)
6452     {
6453       int cmp;
6454       tree min, max;
6455
6456       /* Compute the convex hull of the ranges.  The lower limit of
6457          the new range is the minimum of the two ranges.  If they
6458          cannot be compared, then give up.  */
6459       cmp = compare_values (vr0->min, vr1->min);
6460       if (cmp == 0 || cmp == 1)
6461         min = vr1->min;
6462       else if (cmp == -1)
6463         min = vr0->min;
6464       else
6465         goto give_up;
6466
6467       /* Similarly, the upper limit of the new range is the maximum
6468          of the two ranges.  If they cannot be compared, then
6469          give up.  */
6470       cmp = compare_values (vr0->max, vr1->max);
6471       if (cmp == 0 || cmp == -1)
6472         max = vr1->max;
6473       else if (cmp == 1)
6474         max = vr0->max;
6475       else
6476         goto give_up;
6477
6478       /* Check for useless ranges.  */
6479       if (INTEGRAL_TYPE_P (TREE_TYPE (min))
6480           && ((vrp_val_is_min (min) || is_overflow_infinity (min))
6481               && (vrp_val_is_max (max) || is_overflow_infinity (max))))
6482         goto give_up;
6483
6484       /* The resulting set of equivalences is the intersection of
6485          the two sets.  */
6486       if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
6487         bitmap_and_into (vr0->equiv, vr1->equiv);
6488       else if (vr0->equiv && !vr1->equiv)
6489         bitmap_clear (vr0->equiv);
6490
6491       set_value_range (vr0, vr0->type, min, max, vr0->equiv);
6492     }
6493   else if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
6494     {
6495       /* Two anti-ranges meet only if their complements intersect.
6496          Only handle the case of identical ranges.  */
6497       if (compare_values (vr0->min, vr1->min) == 0
6498           && compare_values (vr0->max, vr1->max) == 0
6499           && compare_values (vr0->min, vr0->max) == 0)
6500         {
6501           /* The resulting set of equivalences is the intersection of
6502              the two sets.  */
6503           if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
6504             bitmap_and_into (vr0->equiv, vr1->equiv);
6505           else if (vr0->equiv && !vr1->equiv)
6506             bitmap_clear (vr0->equiv);
6507         }
6508       else
6509         goto give_up;
6510     }
6511   else if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
6512     {
6513       /* For a numeric range [VAL1, VAL2] and an anti-range ~[VAL3, VAL4],
6514          only handle the case where the ranges have an empty intersection.
6515          The result of the meet operation is the anti-range.  */
6516       if (!symbolic_range_p (vr0)
6517           && !symbolic_range_p (vr1)
6518           && !value_ranges_intersect_p (vr0, vr1))
6519         {
6520           /* Copy most of VR1 into VR0.  Don't copy VR1's equivalence
6521              set.  We need to compute the intersection of the two
6522              equivalence sets.  */
6523           if (vr1->type == VR_ANTI_RANGE)
6524             set_value_range (vr0, vr1->type, vr1->min, vr1->max, vr0->equiv);
6525
6526           /* The resulting set of equivalences is the intersection of
6527              the two sets.  */
6528           if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
6529             bitmap_and_into (vr0->equiv, vr1->equiv);
6530           else if (vr0->equiv && !vr1->equiv)
6531             bitmap_clear (vr0->equiv);
6532         }
6533       else
6534         goto give_up;
6535     }
6536   else
6537     gcc_unreachable ();
6538
6539   return;
6540
6541 give_up:
6542   /* Failed to find an efficient meet.  Before giving up and setting
6543      the result to VARYING, see if we can at least derive a useful
6544      anti-range.  FIXME, all this nonsense about distinguishing
6545      anti-ranges from ranges is necessary because of the odd
6546      semantics of range_includes_zero_p and friends.  */
6547   if (!symbolic_range_p (vr0)
6548       && ((vr0->type == VR_RANGE && !range_includes_zero_p (vr0))
6549           || (vr0->type == VR_ANTI_RANGE && range_includes_zero_p (vr0)))
6550       && !symbolic_range_p (vr1)
6551       && ((vr1->type == VR_RANGE && !range_includes_zero_p (vr1))
6552           || (vr1->type == VR_ANTI_RANGE && range_includes_zero_p (vr1))))
6553     {
6554       set_value_range_to_nonnull (vr0, TREE_TYPE (vr0->min));
6555
6556       /* Since this meet operation did not result from the meeting of
6557          two equivalent names, VR0 cannot have any equivalences.  */
6558       if (vr0->equiv)
6559         bitmap_clear (vr0->equiv);
6560     }
6561   else
6562     set_value_range_to_varying (vr0);
6563 }
6564
6565
6566 /* Visit all arguments for PHI node PHI that flow through executable
6567    edges.  If a valid value range can be derived from all the incoming
6568    value ranges, set a new range for the LHS of PHI.  */
6569
6570 static enum ssa_prop_result
6571 vrp_visit_phi_node (gimple phi)
6572 {
6573   size_t i;
6574   tree lhs = PHI_RESULT (phi);
6575   value_range_t *lhs_vr = get_value_range (lhs);
6576   value_range_t vr_result = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
6577   int edges, old_edges;
6578   struct loop *l;
6579
6580   if (dump_file && (dump_flags & TDF_DETAILS))
6581     {
6582       fprintf (dump_file, "\nVisiting PHI node: ");
6583       print_gimple_stmt (dump_file, phi, 0, dump_flags);
6584     }
6585
6586   edges = 0;
6587   for (i = 0; i < gimple_phi_num_args (phi); i++)
6588     {
6589       edge e = gimple_phi_arg_edge (phi, i);
6590
6591       if (dump_file && (dump_flags & TDF_DETAILS))
6592         {
6593           fprintf (dump_file,
6594               "\n    Argument #%d (%d -> %d %sexecutable)\n",
6595               (int) i, e->src->index, e->dest->index,
6596               (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
6597         }
6598
6599       if (e->flags & EDGE_EXECUTABLE)
6600         {
6601           tree arg = PHI_ARG_DEF (phi, i);
6602           value_range_t vr_arg;
6603
6604           ++edges;
6605
6606           if (TREE_CODE (arg) == SSA_NAME)
6607             {
6608               vr_arg = *(get_value_range (arg));
6609             }
6610           else
6611             {
6612               if (is_overflow_infinity (arg))
6613                 {
6614                   arg = copy_node (arg);
6615                   TREE_OVERFLOW (arg) = 0;
6616                 }
6617
6618               vr_arg.type = VR_RANGE;
6619               vr_arg.min = arg;
6620               vr_arg.max = arg;
6621               vr_arg.equiv = NULL;
6622             }
6623
6624           if (dump_file && (dump_flags & TDF_DETAILS))
6625             {
6626               fprintf (dump_file, "\t");
6627               print_generic_expr (dump_file, arg, dump_flags);
6628               fprintf (dump_file, "\n\tValue: ");
6629               dump_value_range (dump_file, &vr_arg);
6630               fprintf (dump_file, "\n");
6631             }
6632
6633           vrp_meet (&vr_result, &vr_arg);
6634
6635           if (vr_result.type == VR_VARYING)
6636             break;
6637         }
6638     }
6639
6640   if (vr_result.type == VR_VARYING)
6641     goto varying;
6642
6643   old_edges = vr_phi_edge_counts[SSA_NAME_VERSION (lhs)];
6644   vr_phi_edge_counts[SSA_NAME_VERSION (lhs)] = edges;
6645
6646   /* To prevent infinite iterations in the algorithm, derive ranges
6647      when the new value is slightly bigger or smaller than the
6648      previous one.  We don't do this if we have seen a new executable
6649      edge; this helps us avoid an overflow infinity for conditionals
6650      which are not in a loop.  */
6651   if (edges > 0
6652       && gimple_phi_num_args (phi) > 1
6653       && edges == old_edges)
6654     {
6655       int cmp_min = compare_values (lhs_vr->min, vr_result.min);
6656       int cmp_max = compare_values (lhs_vr->max, vr_result.max);
6657
6658       /* For non VR_RANGE or for pointers fall back to varying if
6659          the range changed.  */
6660       if ((lhs_vr->type != VR_RANGE || vr_result.type != VR_RANGE
6661            || POINTER_TYPE_P (TREE_TYPE (lhs)))
6662           && (cmp_min != 0 || cmp_max != 0))
6663         goto varying;
6664
6665       /* If the new minimum is smaller or larger than the previous
6666          one, go all the way to -INF.  In the first case, to avoid
6667          iterating millions of times to reach -INF, and in the
6668          other case to avoid infinite bouncing between different
6669          minimums.  */
6670       if (cmp_min > 0 || cmp_min < 0)
6671         {
6672           if (!needs_overflow_infinity (TREE_TYPE (vr_result.min))
6673               || !vrp_var_may_overflow (lhs, phi))
6674             vr_result.min = TYPE_MIN_VALUE (TREE_TYPE (vr_result.min));
6675           else if (supports_overflow_infinity (TREE_TYPE (vr_result.min)))
6676             vr_result.min =
6677                 negative_overflow_infinity (TREE_TYPE (vr_result.min));
6678         }
6679
6680       /* Similarly, if the new maximum is smaller or larger than
6681          the previous one, go all the way to +INF.  */
6682       if (cmp_max < 0 || cmp_max > 0)
6683         {
6684           if (!needs_overflow_infinity (TREE_TYPE (vr_result.max))
6685               || !vrp_var_may_overflow (lhs, phi))
6686             vr_result.max = TYPE_MAX_VALUE (TREE_TYPE (vr_result.max));
6687           else if (supports_overflow_infinity (TREE_TYPE (vr_result.max)))
6688             vr_result.max =
6689                 positive_overflow_infinity (TREE_TYPE (vr_result.max));
6690         }
6691
6692       /* If we dropped either bound to +-INF then if this is a loop
6693          PHI node SCEV may known more about its value-range.  */
6694       if ((cmp_min > 0 || cmp_min < 0
6695            || cmp_max < 0 || cmp_max > 0)
6696           && current_loops
6697           && (l = loop_containing_stmt (phi))
6698           && l->header == gimple_bb (phi))
6699         adjust_range_with_scev (&vr_result, l, phi, lhs);
6700
6701       /* If we will end up with a (-INF, +INF) range, set it to
6702          VARYING.  Same if the previous max value was invalid for
6703          the type and we end up with vr_result.min > vr_result.max.  */
6704       if ((vrp_val_is_max (vr_result.max)
6705            && vrp_val_is_min (vr_result.min))
6706           || compare_values (vr_result.min,
6707                              vr_result.max) > 0)
6708         goto varying;
6709     }
6710
6711   /* If the new range is different than the previous value, keep
6712      iterating.  */
6713   if (update_value_range (lhs, &vr_result))
6714     {
6715       if (dump_file && (dump_flags & TDF_DETAILS))
6716         {
6717           fprintf (dump_file, "Found new range for ");
6718           print_generic_expr (dump_file, lhs, 0);
6719           fprintf (dump_file, ": ");
6720           dump_value_range (dump_file, &vr_result);
6721           fprintf (dump_file, "\n\n");
6722         }
6723
6724       return SSA_PROP_INTERESTING;
6725     }
6726
6727   /* Nothing changed, don't add outgoing edges.  */
6728   return SSA_PROP_NOT_INTERESTING;
6729
6730   /* No match found.  Set the LHS to VARYING.  */
6731 varying:
6732   set_value_range_to_varying (lhs_vr);
6733   return SSA_PROP_VARYING;
6734 }
6735
6736 /* Simplify boolean operations if the source is known
6737    to be already a boolean.  */
6738 static bool
6739 simplify_truth_ops_using_ranges (gimple_stmt_iterator *gsi, gimple stmt)
6740 {
6741   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
6742   tree val = NULL;
6743   tree op0, op1;
6744   value_range_t *vr;
6745   bool sop = false;
6746   bool need_conversion;
6747
6748   op0 = gimple_assign_rhs1 (stmt);
6749   if (TYPE_PRECISION (TREE_TYPE (op0)) != 1)
6750     {
6751       if (TREE_CODE (op0) != SSA_NAME)
6752         return false;
6753       vr = get_value_range (op0);
6754
6755       val = compare_range_with_value (GE_EXPR, vr, integer_zero_node, &sop);
6756       if (!val || !integer_onep (val))
6757         return false;
6758
6759       val = compare_range_with_value (LE_EXPR, vr, integer_one_node, &sop);
6760       if (!val || !integer_onep (val))
6761         return false;
6762     }
6763
6764   if (rhs_code == TRUTH_NOT_EXPR)
6765     {
6766       rhs_code = NE_EXPR;
6767       op1 = build_int_cst (TREE_TYPE (op0), 1);
6768     }
6769   else
6770     {
6771       op1 = gimple_assign_rhs2 (stmt);
6772
6773       /* Reduce number of cases to handle.  */
6774       if (is_gimple_min_invariant (op1))
6775         {
6776           /* Exclude anything that should have been already folded.  */
6777           if (rhs_code != EQ_EXPR
6778               && rhs_code != NE_EXPR
6779               && rhs_code != TRUTH_XOR_EXPR)
6780             return false;
6781
6782           if (!integer_zerop (op1)
6783               && !integer_onep (op1)
6784               && !integer_all_onesp (op1))
6785             return false;
6786
6787           /* Limit the number of cases we have to consider.  */
6788           if (rhs_code == EQ_EXPR)
6789             {
6790               rhs_code = NE_EXPR;
6791               op1 = fold_unary (TRUTH_NOT_EXPR, TREE_TYPE (op1), op1);
6792             }
6793         }
6794       else
6795         {
6796           /* Punt on A == B as there is no BIT_XNOR_EXPR.  */
6797           if (rhs_code == EQ_EXPR)
6798             return false;
6799
6800           if (TYPE_PRECISION (TREE_TYPE (op1)) != 1)
6801             {
6802               vr = get_value_range (op1);
6803               val = compare_range_with_value (GE_EXPR, vr, integer_zero_node, &sop);
6804               if (!val || !integer_onep (val))
6805                 return false;
6806
6807               val = compare_range_with_value (LE_EXPR, vr, integer_one_node, &sop);
6808               if (!val || !integer_onep (val))
6809                 return false;
6810             }
6811         }
6812     }
6813
6814   if (sop && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
6815     {
6816       location_t location;
6817
6818       if (!gimple_has_location (stmt))
6819         location = input_location;
6820       else
6821         location = gimple_location (stmt);
6822
6823       if (rhs_code == TRUTH_AND_EXPR || rhs_code == TRUTH_OR_EXPR)
6824         warning_at (location, OPT_Wstrict_overflow,
6825                     _("assuming signed overflow does not occur when "
6826                       "simplifying && or || to & or |"));
6827       else
6828         warning_at (location, OPT_Wstrict_overflow,
6829                     _("assuming signed overflow does not occur when "
6830                       "simplifying ==, != or ! to identity or ^"));
6831     }
6832
6833   need_conversion =
6834     !useless_type_conversion_p (TREE_TYPE (gimple_assign_lhs (stmt)),
6835                                 TREE_TYPE (op0));
6836
6837   /* Make sure to not sign-extend -1 as a boolean value.  */
6838   if (need_conversion
6839       && !TYPE_UNSIGNED (TREE_TYPE (op0))
6840       && TYPE_PRECISION (TREE_TYPE (op0)) == 1)
6841     return false;
6842
6843   switch (rhs_code)
6844     {
6845     case TRUTH_AND_EXPR:
6846       rhs_code = BIT_AND_EXPR;
6847       break;
6848     case TRUTH_OR_EXPR:
6849       rhs_code = BIT_IOR_EXPR;
6850       break;
6851     case TRUTH_XOR_EXPR:
6852     case NE_EXPR:
6853       if (integer_zerop (op1))
6854         {
6855           gimple_assign_set_rhs_with_ops (gsi,
6856                                           need_conversion ? NOP_EXPR : SSA_NAME,
6857                                           op0, NULL);
6858           update_stmt (gsi_stmt (*gsi));
6859           return true;
6860         }
6861
6862       rhs_code = BIT_XOR_EXPR;
6863       break;
6864     default:
6865       gcc_unreachable ();
6866     }
6867
6868   if (need_conversion)
6869     return false;
6870
6871   gimple_assign_set_rhs_with_ops (gsi, rhs_code, op0, op1);
6872   update_stmt (gsi_stmt (*gsi));
6873   return true;
6874 }
6875
6876 /* Simplify a division or modulo operator to a right shift or
6877    bitwise and if the first operand is unsigned or is greater
6878    than zero and the second operand is an exact power of two.  */
6879
6880 static bool
6881 simplify_div_or_mod_using_ranges (gimple stmt)
6882 {
6883   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
6884   tree val = NULL;
6885   tree op0 = gimple_assign_rhs1 (stmt);
6886   tree op1 = gimple_assign_rhs2 (stmt);
6887   value_range_t *vr = get_value_range (gimple_assign_rhs1 (stmt));
6888
6889   if (TYPE_UNSIGNED (TREE_TYPE (op0)))
6890     {
6891       val = integer_one_node;
6892     }
6893   else
6894     {
6895       bool sop = false;
6896
6897       val = compare_range_with_value (GE_EXPR, vr, integer_zero_node, &sop);
6898
6899       if (val
6900           && sop
6901           && integer_onep (val)
6902           && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
6903         {
6904           location_t location;
6905
6906           if (!gimple_has_location (stmt))
6907             location = input_location;
6908           else
6909             location = gimple_location (stmt);
6910           warning_at (location, OPT_Wstrict_overflow,
6911                       "assuming signed overflow does not occur when "
6912                       "simplifying %</%> or %<%%%> to %<>>%> or %<&%>");
6913         }
6914     }
6915
6916   if (val && integer_onep (val))
6917     {
6918       tree t;
6919
6920       if (rhs_code == TRUNC_DIV_EXPR)
6921         {
6922           t = build_int_cst (integer_type_node, tree_log2 (op1));
6923           gimple_assign_set_rhs_code (stmt, RSHIFT_EXPR);
6924           gimple_assign_set_rhs1 (stmt, op0);
6925           gimple_assign_set_rhs2 (stmt, t);
6926         }
6927       else
6928         {
6929           t = build_int_cst (TREE_TYPE (op1), 1);
6930           t = int_const_binop (MINUS_EXPR, op1, t);
6931           t = fold_convert (TREE_TYPE (op0), t);
6932
6933           gimple_assign_set_rhs_code (stmt, BIT_AND_EXPR);
6934           gimple_assign_set_rhs1 (stmt, op0);
6935           gimple_assign_set_rhs2 (stmt, t);
6936         }
6937
6938       update_stmt (stmt);
6939       return true;
6940     }
6941
6942   return false;
6943 }
6944
6945 /* If the operand to an ABS_EXPR is >= 0, then eliminate the
6946    ABS_EXPR.  If the operand is <= 0, then simplify the
6947    ABS_EXPR into a NEGATE_EXPR.  */
6948
6949 static bool
6950 simplify_abs_using_ranges (gimple stmt)
6951 {
6952   tree val = NULL;
6953   tree op = gimple_assign_rhs1 (stmt);
6954   tree type = TREE_TYPE (op);
6955   value_range_t *vr = get_value_range (op);
6956
6957   if (TYPE_UNSIGNED (type))
6958     {
6959       val = integer_zero_node;
6960     }
6961   else if (vr)
6962     {
6963       bool sop = false;
6964
6965       val = compare_range_with_value (LE_EXPR, vr, integer_zero_node, &sop);
6966       if (!val)
6967         {
6968           sop = false;
6969           val = compare_range_with_value (GE_EXPR, vr, integer_zero_node,
6970                                           &sop);
6971
6972           if (val)
6973             {
6974               if (integer_zerop (val))
6975                 val = integer_one_node;
6976               else if (integer_onep (val))
6977                 val = integer_zero_node;
6978             }
6979         }
6980
6981       if (val
6982           && (integer_onep (val) || integer_zerop (val)))
6983         {
6984           if (sop && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
6985             {
6986               location_t location;
6987
6988               if (!gimple_has_location (stmt))
6989                 location = input_location;
6990               else
6991                 location = gimple_location (stmt);
6992               warning_at (location, OPT_Wstrict_overflow,
6993                           "assuming signed overflow does not occur when "
6994                           "simplifying %<abs (X)%> to %<X%> or %<-X%>");
6995             }
6996
6997           gimple_assign_set_rhs1 (stmt, op);
6998           if (integer_onep (val))
6999             gimple_assign_set_rhs_code (stmt, NEGATE_EXPR);
7000           else
7001             gimple_assign_set_rhs_code (stmt, SSA_NAME);
7002           update_stmt (stmt);
7003           return true;
7004         }
7005     }
7006
7007   return false;
7008 }
7009
7010 /* Optimize away redundant BIT_AND_EXPR and BIT_IOR_EXPR.
7011    If all the bits that are being cleared by & are already
7012    known to be zero from VR, or all the bits that are being
7013    set by | are already known to be one from VR, the bit
7014    operation is redundant.  */
7015
7016 static bool
7017 simplify_bit_ops_using_ranges (gimple_stmt_iterator *gsi, gimple stmt)
7018 {
7019   tree op0 = gimple_assign_rhs1 (stmt);
7020   tree op1 = gimple_assign_rhs2 (stmt);
7021   tree op = NULL_TREE;
7022   value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
7023   value_range_t vr1 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
7024   double_int may_be_nonzero0, may_be_nonzero1;
7025   double_int must_be_nonzero0, must_be_nonzero1;
7026   double_int mask;
7027
7028   if (TREE_CODE (op0) == SSA_NAME)
7029     vr0 = *(get_value_range (op0));
7030   else if (is_gimple_min_invariant (op0))
7031     set_value_range_to_value (&vr0, op0, NULL);
7032   else
7033     return false;
7034
7035   if (TREE_CODE (op1) == SSA_NAME)
7036     vr1 = *(get_value_range (op1));
7037   else if (is_gimple_min_invariant (op1))
7038     set_value_range_to_value (&vr1, op1, NULL);
7039   else
7040     return false;
7041
7042   if (!zero_nonzero_bits_from_vr (&vr0, &may_be_nonzero0, &must_be_nonzero0))
7043     return false;
7044   if (!zero_nonzero_bits_from_vr (&vr1, &may_be_nonzero1, &must_be_nonzero1))
7045     return false;
7046
7047   switch (gimple_assign_rhs_code (stmt))
7048     {
7049     case BIT_AND_EXPR:
7050       mask = double_int_and_not (may_be_nonzero0, must_be_nonzero1);
7051       if (double_int_zero_p (mask))
7052         {
7053           op = op0;
7054           break;
7055         }
7056       mask = double_int_and_not (may_be_nonzero1, must_be_nonzero0);
7057       if (double_int_zero_p (mask))
7058         {
7059           op = op1;
7060           break;
7061         }
7062       break;
7063     case BIT_IOR_EXPR:
7064       mask = double_int_and_not (may_be_nonzero0, must_be_nonzero1);
7065       if (double_int_zero_p (mask))
7066         {
7067           op = op1;
7068           break;
7069         }
7070       mask = double_int_and_not (may_be_nonzero1, must_be_nonzero0);
7071       if (double_int_zero_p (mask))
7072         {
7073           op = op0;
7074           break;
7075         }
7076       break;
7077     default:
7078       gcc_unreachable ();
7079     }
7080
7081   if (op == NULL_TREE)
7082     return false;
7083
7084   gimple_assign_set_rhs_with_ops (gsi, TREE_CODE (op), op, NULL);
7085   update_stmt (gsi_stmt (*gsi));
7086   return true;
7087 }
7088
7089 /* We are comparing trees OP0 and OP1 using COND_CODE.  OP0 has
7090    a known value range VR.
7091
7092    If there is one and only one value which will satisfy the
7093    conditional, then return that value.  Else return NULL.  */
7094
7095 static tree
7096 test_for_singularity (enum tree_code cond_code, tree op0,
7097                       tree op1, value_range_t *vr)
7098 {
7099   tree min = NULL;
7100   tree max = NULL;
7101
7102   /* Extract minimum/maximum values which satisfy the
7103      the conditional as it was written.  */
7104   if (cond_code == LE_EXPR || cond_code == LT_EXPR)
7105     {
7106       /* This should not be negative infinity; there is no overflow
7107          here.  */
7108       min = TYPE_MIN_VALUE (TREE_TYPE (op0));
7109
7110       max = op1;
7111       if (cond_code == LT_EXPR && !is_overflow_infinity (max))
7112         {
7113           tree one = build_int_cst (TREE_TYPE (op0), 1);
7114           max = fold_build2 (MINUS_EXPR, TREE_TYPE (op0), max, one);
7115           if (EXPR_P (max))
7116             TREE_NO_WARNING (max) = 1;
7117         }
7118     }
7119   else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
7120     {
7121       /* This should not be positive infinity; there is no overflow
7122          here.  */
7123       max = TYPE_MAX_VALUE (TREE_TYPE (op0));
7124
7125       min = op1;
7126       if (cond_code == GT_EXPR && !is_overflow_infinity (min))
7127         {
7128           tree one = build_int_cst (TREE_TYPE (op0), 1);
7129           min = fold_build2 (PLUS_EXPR, TREE_TYPE (op0), min, one);
7130           if (EXPR_P (min))
7131             TREE_NO_WARNING (min) = 1;
7132         }
7133     }
7134
7135   /* Now refine the minimum and maximum values using any
7136      value range information we have for op0.  */
7137   if (min && max)
7138     {
7139       if (compare_values (vr->min, min) == 1)
7140         min = vr->min;
7141       if (compare_values (vr->max, max) == -1)
7142         max = vr->max;
7143
7144       /* If the new min/max values have converged to a single value,
7145          then there is only one value which can satisfy the condition,
7146          return that value.  */
7147       if (operand_equal_p (min, max, 0) && is_gimple_min_invariant (min))
7148         return min;
7149     }
7150   return NULL;
7151 }
7152
7153 /* Simplify a conditional using a relational operator to an equality
7154    test if the range information indicates only one value can satisfy
7155    the original conditional.  */
7156
7157 static bool
7158 simplify_cond_using_ranges (gimple stmt)
7159 {
7160   tree op0 = gimple_cond_lhs (stmt);
7161   tree op1 = gimple_cond_rhs (stmt);
7162   enum tree_code cond_code = gimple_cond_code (stmt);
7163
7164   if (cond_code != NE_EXPR
7165       && cond_code != EQ_EXPR
7166       && TREE_CODE (op0) == SSA_NAME
7167       && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7168       && is_gimple_min_invariant (op1))
7169     {
7170       value_range_t *vr = get_value_range (op0);
7171
7172       /* If we have range information for OP0, then we might be
7173          able to simplify this conditional. */
7174       if (vr->type == VR_RANGE)
7175         {
7176           tree new_tree = test_for_singularity (cond_code, op0, op1, vr);
7177
7178           if (new_tree)
7179             {
7180               if (dump_file)
7181                 {
7182                   fprintf (dump_file, "Simplified relational ");
7183                   print_gimple_stmt (dump_file, stmt, 0, 0);
7184                   fprintf (dump_file, " into ");
7185                 }
7186
7187               gimple_cond_set_code (stmt, EQ_EXPR);
7188               gimple_cond_set_lhs (stmt, op0);
7189               gimple_cond_set_rhs (stmt, new_tree);
7190
7191               update_stmt (stmt);
7192
7193               if (dump_file)
7194                 {
7195                   print_gimple_stmt (dump_file, stmt, 0, 0);
7196                   fprintf (dump_file, "\n");
7197                 }
7198
7199               return true;
7200             }
7201
7202           /* Try again after inverting the condition.  We only deal
7203              with integral types here, so no need to worry about
7204              issues with inverting FP comparisons.  */
7205           cond_code = invert_tree_comparison (cond_code, false);
7206           new_tree = test_for_singularity (cond_code, op0, op1, vr);
7207
7208           if (new_tree)
7209             {
7210               if (dump_file)
7211                 {
7212                   fprintf (dump_file, "Simplified relational ");
7213                   print_gimple_stmt (dump_file, stmt, 0, 0);
7214                   fprintf (dump_file, " into ");
7215                 }
7216
7217               gimple_cond_set_code (stmt, NE_EXPR);
7218               gimple_cond_set_lhs (stmt, op0);
7219               gimple_cond_set_rhs (stmt, new_tree);
7220
7221               update_stmt (stmt);
7222
7223               if (dump_file)
7224                 {
7225                   print_gimple_stmt (dump_file, stmt, 0, 0);
7226                   fprintf (dump_file, "\n");
7227                 }
7228
7229               return true;
7230             }
7231         }
7232     }
7233
7234   return false;
7235 }
7236
7237 /* Simplify a switch statement using the value range of the switch
7238    argument.  */
7239
7240 static bool
7241 simplify_switch_using_ranges (gimple stmt)
7242 {
7243   tree op = gimple_switch_index (stmt);
7244   value_range_t *vr;
7245   bool take_default;
7246   edge e;
7247   edge_iterator ei;
7248   size_t i = 0, j = 0, n, n2;
7249   tree vec2;
7250   switch_update su;
7251
7252   if (TREE_CODE (op) == SSA_NAME)
7253     {
7254       vr = get_value_range (op);
7255
7256       /* We can only handle integer ranges.  */
7257       if (vr->type != VR_RANGE
7258           || symbolic_range_p (vr))
7259         return false;
7260
7261       /* Find case label for min/max of the value range.  */
7262       take_default = !find_case_label_range (stmt, vr->min, vr->max, &i, &j);
7263     }
7264   else if (TREE_CODE (op) == INTEGER_CST)
7265     {
7266       take_default = !find_case_label_index (stmt, 1, op, &i);
7267       if (take_default)
7268         {
7269           i = 1;
7270           j = 0;
7271         }
7272       else
7273         {
7274           j = i;
7275         }
7276     }
7277   else
7278     return false;
7279
7280   n = gimple_switch_num_labels (stmt);
7281
7282   /* Bail out if this is just all edges taken.  */
7283   if (i == 1
7284       && j == n - 1
7285       && take_default)
7286     return false;
7287
7288   /* Build a new vector of taken case labels.  */
7289   vec2 = make_tree_vec (j - i + 1 + (int)take_default);
7290   n2 = 0;
7291
7292   /* Add the default edge, if necessary.  */
7293   if (take_default)
7294     TREE_VEC_ELT (vec2, n2++) = gimple_switch_default_label (stmt);
7295
7296   for (; i <= j; ++i, ++n2)
7297     TREE_VEC_ELT (vec2, n2) = gimple_switch_label (stmt, i);
7298
7299   /* Mark needed edges.  */
7300   for (i = 0; i < n2; ++i)
7301     {
7302       e = find_edge (gimple_bb (stmt),
7303                      label_to_block (CASE_LABEL (TREE_VEC_ELT (vec2, i))));
7304       e->aux = (void *)-1;
7305     }
7306
7307   /* Queue not needed edges for later removal.  */
7308   FOR_EACH_EDGE (e, ei, gimple_bb (stmt)->succs)
7309     {
7310       if (e->aux == (void *)-1)
7311         {
7312           e->aux = NULL;
7313           continue;
7314         }
7315
7316       if (dump_file && (dump_flags & TDF_DETAILS))
7317         {
7318           fprintf (dump_file, "removing unreachable case label\n");
7319         }
7320       VEC_safe_push (edge, heap, to_remove_edges, e);
7321       e->flags &= ~EDGE_EXECUTABLE;
7322     }
7323
7324   /* And queue an update for the stmt.  */
7325   su.stmt = stmt;
7326   su.vec = vec2;
7327   VEC_safe_push (switch_update, heap, to_update_switch_stmts, &su);
7328   return false;
7329 }
7330
7331 /* Simplify STMT using ranges if possible.  */
7332
7333 static bool
7334 simplify_stmt_using_ranges (gimple_stmt_iterator *gsi)
7335 {
7336   gimple stmt = gsi_stmt (*gsi);
7337   if (is_gimple_assign (stmt))
7338     {
7339       enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
7340
7341       switch (rhs_code)
7342         {
7343         case EQ_EXPR:
7344         case NE_EXPR:
7345         case TRUTH_NOT_EXPR:
7346         case TRUTH_AND_EXPR:
7347         case TRUTH_OR_EXPR:
7348         case TRUTH_XOR_EXPR:
7349           /* Transform EQ_EXPR, NE_EXPR, TRUTH_NOT_EXPR into BIT_XOR_EXPR
7350              or identity if the RHS is zero or one, and the LHS are known
7351              to be boolean values.  Transform all TRUTH_*_EXPR into
7352              BIT_*_EXPR if both arguments are known to be boolean values.  */
7353           if (INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt))))
7354             return simplify_truth_ops_using_ranges (gsi, stmt);
7355           break;
7356
7357       /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
7358          and BIT_AND_EXPR respectively if the first operand is greater
7359          than zero and the second operand is an exact power of two.  */
7360         case TRUNC_DIV_EXPR:
7361         case TRUNC_MOD_EXPR:
7362           if (INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt)))
7363               && integer_pow2p (gimple_assign_rhs2 (stmt)))
7364             return simplify_div_or_mod_using_ranges (stmt);
7365           break;
7366
7367       /* Transform ABS (X) into X or -X as appropriate.  */
7368         case ABS_EXPR:
7369           if (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
7370               && INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt))))
7371             return simplify_abs_using_ranges (stmt);
7372           break;
7373
7374         case BIT_AND_EXPR:
7375         case BIT_IOR_EXPR:
7376           /* Optimize away BIT_AND_EXPR and BIT_IOR_EXPR
7377              if all the bits being cleared are already cleared or
7378              all the bits being set are already set.  */
7379           if (INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt))))
7380             return simplify_bit_ops_using_ranges (gsi, stmt);
7381           break;
7382
7383         default:
7384           break;
7385         }
7386     }
7387   else if (gimple_code (stmt) == GIMPLE_COND)
7388     return simplify_cond_using_ranges (stmt);
7389   else if (gimple_code (stmt) == GIMPLE_SWITCH)
7390     return simplify_switch_using_ranges (stmt);
7391
7392   return false;
7393 }
7394
7395 /* If the statement pointed by SI has a predicate whose value can be
7396    computed using the value range information computed by VRP, compute
7397    its value and return true.  Otherwise, return false.  */
7398
7399 static bool
7400 fold_predicate_in (gimple_stmt_iterator *si)
7401 {
7402   bool assignment_p = false;
7403   tree val;
7404   gimple stmt = gsi_stmt (*si);
7405
7406   if (is_gimple_assign (stmt)
7407       && TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)) == tcc_comparison)
7408     {
7409       assignment_p = true;
7410       val = vrp_evaluate_conditional (gimple_assign_rhs_code (stmt),
7411                                       gimple_assign_rhs1 (stmt),
7412                                       gimple_assign_rhs2 (stmt),
7413                                       stmt);
7414     }
7415   else if (gimple_code (stmt) == GIMPLE_COND)
7416     val = vrp_evaluate_conditional (gimple_cond_code (stmt),
7417                                     gimple_cond_lhs (stmt),
7418                                     gimple_cond_rhs (stmt),
7419                                     stmt);
7420   else
7421     return false;
7422
7423   if (val)
7424     {
7425       if (assignment_p)
7426         val = fold_convert (gimple_expr_type (stmt), val);
7427
7428       if (dump_file)
7429         {
7430           fprintf (dump_file, "Folding predicate ");
7431           print_gimple_expr (dump_file, stmt, 0, 0);
7432           fprintf (dump_file, " to ");
7433           print_generic_expr (dump_file, val, 0);
7434           fprintf (dump_file, "\n");
7435         }
7436
7437       if (is_gimple_assign (stmt))
7438         gimple_assign_set_rhs_from_tree (si, val);
7439       else
7440         {
7441           gcc_assert (gimple_code (stmt) == GIMPLE_COND);
7442           if (integer_zerop (val))
7443             gimple_cond_make_false (stmt);
7444           else if (integer_onep (val))
7445             gimple_cond_make_true (stmt);
7446           else
7447             gcc_unreachable ();
7448         }
7449
7450       return true;
7451     }
7452
7453   return false;
7454 }
7455
7456 /* Callback for substitute_and_fold folding the stmt at *SI.  */
7457
7458 static bool
7459 vrp_fold_stmt (gimple_stmt_iterator *si)
7460 {
7461   if (fold_predicate_in (si))
7462     return true;
7463
7464   return simplify_stmt_using_ranges (si);
7465 }
7466
7467 /* Stack of dest,src equivalency pairs that need to be restored after
7468    each attempt to thread a block's incoming edge to an outgoing edge.
7469
7470    A NULL entry is used to mark the end of pairs which need to be
7471    restored.  */
7472 static VEC(tree,heap) *stack;
7473
7474 /* A trivial wrapper so that we can present the generic jump threading
7475    code with a simple API for simplifying statements.  STMT is the
7476    statement we want to simplify, WITHIN_STMT provides the location
7477    for any overflow warnings.  */
7478
7479 static tree
7480 simplify_stmt_for_jump_threading (gimple stmt, gimple within_stmt)
7481 {
7482   /* We only use VRP information to simplify conditionals.  This is
7483      overly conservative, but it's unclear if doing more would be
7484      worth the compile time cost.  */
7485   if (gimple_code (stmt) != GIMPLE_COND)
7486     return NULL;
7487
7488   return vrp_evaluate_conditional (gimple_cond_code (stmt),
7489                                    gimple_cond_lhs (stmt),
7490                                    gimple_cond_rhs (stmt), within_stmt);
7491 }
7492
7493 /* Blocks which have more than one predecessor and more than
7494    one successor present jump threading opportunities, i.e.,
7495    when the block is reached from a specific predecessor, we
7496    may be able to determine which of the outgoing edges will
7497    be traversed.  When this optimization applies, we are able
7498    to avoid conditionals at runtime and we may expose secondary
7499    optimization opportunities.
7500
7501    This routine is effectively a driver for the generic jump
7502    threading code.  It basically just presents the generic code
7503    with edges that may be suitable for jump threading.
7504
7505    Unlike DOM, we do not iterate VRP if jump threading was successful.
7506    While iterating may expose new opportunities for VRP, it is expected
7507    those opportunities would be very limited and the compile time cost
7508    to expose those opportunities would be significant.
7509
7510    As jump threading opportunities are discovered, they are registered
7511    for later realization.  */
7512
7513 static void
7514 identify_jump_threads (void)
7515 {
7516   basic_block bb;
7517   gimple dummy;
7518   int i;
7519   edge e;
7520
7521   /* Ugh.  When substituting values earlier in this pass we can
7522      wipe the dominance information.  So rebuild the dominator
7523      information as we need it within the jump threading code.  */
7524   calculate_dominance_info (CDI_DOMINATORS);
7525
7526   /* We do not allow VRP information to be used for jump threading
7527      across a back edge in the CFG.  Otherwise it becomes too
7528      difficult to avoid eliminating loop exit tests.  Of course
7529      EDGE_DFS_BACK is not accurate at this time so we have to
7530      recompute it.  */
7531   mark_dfs_back_edges ();
7532
7533   /* Do not thread across edges we are about to remove.  Just marking
7534      them as EDGE_DFS_BACK will do.  */
7535   FOR_EACH_VEC_ELT (edge, to_remove_edges, i, e)
7536     e->flags |= EDGE_DFS_BACK;
7537
7538   /* Allocate our unwinder stack to unwind any temporary equivalences
7539      that might be recorded.  */
7540   stack = VEC_alloc (tree, heap, 20);
7541
7542   /* To avoid lots of silly node creation, we create a single
7543      conditional and just modify it in-place when attempting to
7544      thread jumps.  */
7545   dummy = gimple_build_cond (EQ_EXPR,
7546                              integer_zero_node, integer_zero_node,
7547                              NULL, NULL);
7548
7549   /* Walk through all the blocks finding those which present a
7550      potential jump threading opportunity.  We could set this up
7551      as a dominator walker and record data during the walk, but
7552      I doubt it's worth the effort for the classes of jump
7553      threading opportunities we are trying to identify at this
7554      point in compilation.  */
7555   FOR_EACH_BB (bb)
7556     {
7557       gimple last;
7558
7559       /* If the generic jump threading code does not find this block
7560          interesting, then there is nothing to do.  */
7561       if (! potentially_threadable_block (bb))
7562         continue;
7563
7564       /* We only care about blocks ending in a COND_EXPR.  While there
7565          may be some value in handling SWITCH_EXPR here, I doubt it's
7566          terribly important.  */
7567       last = gsi_stmt (gsi_last_bb (bb));
7568
7569       /* We're basically looking for a switch or any kind of conditional with
7570          integral or pointer type arguments.  Note the type of the second
7571          argument will be the same as the first argument, so no need to
7572          check it explicitly.  */
7573       if (gimple_code (last) == GIMPLE_SWITCH
7574           || (gimple_code (last) == GIMPLE_COND
7575               && TREE_CODE (gimple_cond_lhs (last)) == SSA_NAME
7576               && (INTEGRAL_TYPE_P (TREE_TYPE (gimple_cond_lhs (last)))
7577                   || POINTER_TYPE_P (TREE_TYPE (gimple_cond_lhs (last))))
7578               && (TREE_CODE (gimple_cond_rhs (last)) == SSA_NAME
7579                   || is_gimple_min_invariant (gimple_cond_rhs (last)))))
7580         {
7581           edge_iterator ei;
7582
7583           /* We've got a block with multiple predecessors and multiple
7584              successors which also ends in a suitable conditional or
7585              switch statement.  For each predecessor, see if we can thread
7586              it to a specific successor.  */
7587           FOR_EACH_EDGE (e, ei, bb->preds)
7588             {
7589               /* Do not thread across back edges or abnormal edges
7590                  in the CFG.  */
7591               if (e->flags & (EDGE_DFS_BACK | EDGE_COMPLEX))
7592                 continue;
7593
7594               thread_across_edge (dummy, e, true, &stack,
7595                                   simplify_stmt_for_jump_threading);
7596             }
7597         }
7598     }
7599
7600   /* We do not actually update the CFG or SSA graphs at this point as
7601      ASSERT_EXPRs are still in the IL and cfg cleanup code does not yet
7602      handle ASSERT_EXPRs gracefully.  */
7603 }
7604
7605 /* We identified all the jump threading opportunities earlier, but could
7606    not transform the CFG at that time.  This routine transforms the
7607    CFG and arranges for the dominator tree to be rebuilt if necessary.
7608
7609    Note the SSA graph update will occur during the normal TODO
7610    processing by the pass manager.  */
7611 static void
7612 finalize_jump_threads (void)
7613 {
7614   thread_through_all_blocks (false);
7615   VEC_free (tree, heap, stack);
7616 }
7617
7618
7619 /* Traverse all the blocks folding conditionals with known ranges.  */
7620
7621 static void
7622 vrp_finalize (void)
7623 {
7624   size_t i;
7625   unsigned num = num_ssa_names;
7626
7627   if (dump_file)
7628     {
7629       fprintf (dump_file, "\nValue ranges after VRP:\n\n");
7630       dump_all_value_ranges (dump_file);
7631       fprintf (dump_file, "\n");
7632     }
7633
7634   substitute_and_fold (op_with_constant_singleton_value_range,
7635                        vrp_fold_stmt, false);
7636
7637   if (warn_array_bounds)
7638     check_all_array_refs ();
7639
7640   /* We must identify jump threading opportunities before we release
7641      the datastructures built by VRP.  */
7642   identify_jump_threads ();
7643
7644   /* Free allocated memory.  */
7645   for (i = 0; i < num; i++)
7646     if (vr_value[i])
7647       {
7648         BITMAP_FREE (vr_value[i]->equiv);
7649         free (vr_value[i]);
7650       }
7651
7652   free (vr_value);
7653   free (vr_phi_edge_counts);
7654
7655   /* So that we can distinguish between VRP data being available
7656      and not available.  */
7657   vr_value = NULL;
7658   vr_phi_edge_counts = NULL;
7659 }
7660
7661
7662 /* Main entry point to VRP (Value Range Propagation).  This pass is
7663    loosely based on J. R. C. Patterson, ``Accurate Static Branch
7664    Prediction by Value Range Propagation,'' in SIGPLAN Conference on
7665    Programming Language Design and Implementation, pp. 67-78, 1995.
7666    Also available at http://citeseer.ist.psu.edu/patterson95accurate.html
7667
7668    This is essentially an SSA-CCP pass modified to deal with ranges
7669    instead of constants.
7670
7671    While propagating ranges, we may find that two or more SSA name
7672    have equivalent, though distinct ranges.  For instance,
7673
7674      1  x_9 = p_3->a;
7675      2  p_4 = ASSERT_EXPR <p_3, p_3 != 0>
7676      3  if (p_4 == q_2)
7677      4    p_5 = ASSERT_EXPR <p_4, p_4 == q_2>;
7678      5  endif
7679      6  if (q_2)
7680
7681    In the code above, pointer p_5 has range [q_2, q_2], but from the
7682    code we can also determine that p_5 cannot be NULL and, if q_2 had
7683    a non-varying range, p_5's range should also be compatible with it.
7684
7685    These equivalences are created by two expressions: ASSERT_EXPR and
7686    copy operations.  Since p_5 is an assertion on p_4, and p_4 was the
7687    result of another assertion, then we can use the fact that p_5 and
7688    p_4 are equivalent when evaluating p_5's range.
7689
7690    Together with value ranges, we also propagate these equivalences
7691    between names so that we can take advantage of information from
7692    multiple ranges when doing final replacement.  Note that this
7693    equivalency relation is transitive but not symmetric.
7694
7695    In the example above, p_5 is equivalent to p_4, q_2 and p_3, but we
7696    cannot assert that q_2 is equivalent to p_5 because q_2 may be used
7697    in contexts where that assertion does not hold (e.g., in line 6).
7698
7699    TODO, the main difference between this pass and Patterson's is that
7700    we do not propagate edge probabilities.  We only compute whether
7701    edges can be taken or not.  That is, instead of having a spectrum
7702    of jump probabilities between 0 and 1, we only deal with 0, 1 and
7703    DON'T KNOW.  In the future, it may be worthwhile to propagate
7704    probabilities to aid branch prediction.  */
7705
7706 static unsigned int
7707 execute_vrp (void)
7708 {
7709   int i;
7710   edge e;
7711   switch_update *su;
7712
7713   loop_optimizer_init (LOOPS_NORMAL | LOOPS_HAVE_RECORDED_EXITS);
7714   rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
7715   scev_initialize ();
7716
7717   /* Estimate number of iterations - but do not use undefined behavior
7718      for this.  We can't do this lazily as other functions may compute
7719      this using undefined behavior.  */
7720   free_numbers_of_iterations_estimates ();
7721   estimate_numbers_of_iterations (false);
7722
7723   insert_range_assertions ();
7724
7725   to_remove_edges = VEC_alloc (edge, heap, 10);
7726   to_update_switch_stmts = VEC_alloc (switch_update, heap, 5);
7727   threadedge_initialize_values ();
7728
7729   vrp_initialize ();
7730   ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
7731   vrp_finalize ();
7732
7733   /* ASSERT_EXPRs must be removed before finalizing jump threads
7734      as finalizing jump threads calls the CFG cleanup code which
7735      does not properly handle ASSERT_EXPRs.  */
7736   remove_range_assertions ();
7737
7738   /* If we exposed any new variables, go ahead and put them into
7739      SSA form now, before we handle jump threading.  This simplifies
7740      interactions between rewriting of _DECL nodes into SSA form
7741      and rewriting SSA_NAME nodes into SSA form after block
7742      duplication and CFG manipulation.  */
7743   update_ssa (TODO_update_ssa);
7744
7745   finalize_jump_threads ();
7746
7747   /* Remove dead edges from SWITCH_EXPR optimization.  This leaves the
7748      CFG in a broken state and requires a cfg_cleanup run.  */
7749   FOR_EACH_VEC_ELT (edge, to_remove_edges, i, e)
7750     remove_edge (e);
7751   /* Update SWITCH_EXPR case label vector.  */
7752   FOR_EACH_VEC_ELT (switch_update, to_update_switch_stmts, i, su)
7753     {
7754       size_t j;
7755       size_t n = TREE_VEC_LENGTH (su->vec);
7756       tree label;
7757       gimple_switch_set_num_labels (su->stmt, n);
7758       for (j = 0; j < n; j++)
7759         gimple_switch_set_label (su->stmt, j, TREE_VEC_ELT (su->vec, j));
7760       /* As we may have replaced the default label with a regular one
7761          make sure to make it a real default label again.  This ensures
7762          optimal expansion.  */
7763       label = gimple_switch_default_label (su->stmt);
7764       CASE_LOW (label) = NULL_TREE;
7765       CASE_HIGH (label) = NULL_TREE;
7766     }
7767
7768   if (VEC_length (edge, to_remove_edges) > 0)
7769     free_dominance_info (CDI_DOMINATORS);
7770
7771   VEC_free (edge, heap, to_remove_edges);
7772   VEC_free (switch_update, heap, to_update_switch_stmts);
7773   threadedge_finalize_values ();
7774
7775   scev_finalize ();
7776   loop_optimizer_finalize ();
7777   return 0;
7778 }
7779
7780 static bool
7781 gate_vrp (void)
7782 {
7783   return flag_tree_vrp != 0;
7784 }
7785
7786 struct gimple_opt_pass pass_vrp =
7787 {
7788  {
7789   GIMPLE_PASS,
7790   "vrp",                                /* name */
7791   gate_vrp,                             /* gate */
7792   execute_vrp,                          /* execute */
7793   NULL,                                 /* sub */
7794   NULL,                                 /* next */
7795   0,                                    /* static_pass_number */
7796   TV_TREE_VRP,                          /* tv_id */
7797   PROP_ssa,                             /* properties_required */
7798   0,                                    /* properties_provided */
7799   0,                                    /* properties_destroyed */
7800   0,                                    /* todo_flags_start */
7801   TODO_cleanup_cfg
7802     | TODO_update_ssa
7803     | TODO_verify_ssa
7804     | TODO_verify_flow
7805     | TODO_dump_func
7806     | TODO_ggc_collect                  /* todo_flags_finish */
7807  }
7808 };