OSDN Git Service

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