OSDN Git Service

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