OSDN Git Service

* gcc.c-torture/compile/pr11832.c: XFAIL for mips and powerpc-linux,
[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           && CONVERT_EXPR_P (GIMPLE_STMT_OPERAND (def_stmt, 1)))
3801         {
3802           tree rhs = GIMPLE_STMT_OPERAND (def_stmt, 1);
3803           if (CONVERT_EXPR_P (rhs)
3804               && ! TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (rhs, 0)))
3805               && (TYPE_PRECISION (TREE_TYPE (rhs))
3806                   == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (rhs, 0)))))
3807             name3 = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 0);
3808         }
3809
3810       /* If name3 is used later, create an ASSERT_EXPR for it.  */
3811       if (name3 != NULL_TREE
3812           && TREE_CODE (name3) == SSA_NAME
3813           && (cst2 == NULL_TREE
3814               || TREE_CODE (cst2) == INTEGER_CST)
3815           && INTEGRAL_TYPE_P (TREE_TYPE (name3))
3816           && TEST_BIT (found_in_subgraph, SSA_NAME_VERSION (name3))
3817           && !has_single_use (name3))
3818         {
3819           tree tmp;
3820
3821           /* Build an expression for the range test.  */
3822           tmp = build1 (NOP_EXPR, TREE_TYPE (name), name3);
3823           if (cst2 != NULL_TREE)
3824             tmp = build2 (PLUS_EXPR, TREE_TYPE (name), tmp, cst2);
3825
3826           if (dump_file)
3827             {
3828               fprintf (dump_file, "Adding assert for ");
3829               print_generic_expr (dump_file, name3, 0);
3830               fprintf (dump_file, " from ");
3831               print_generic_expr (dump_file, tmp, 0);
3832               fprintf (dump_file, "\n");
3833             }
3834
3835           register_new_assert_for (name3, tmp, comp_code, val, NULL, e, bsi);
3836
3837           retval = true;
3838         }
3839
3840       /* If name2 is used later, create an ASSERT_EXPR for it.  */
3841       if (name2 != NULL_TREE
3842           && TREE_CODE (name2) == SSA_NAME
3843           && TREE_CODE (cst2) == INTEGER_CST
3844           && INTEGRAL_TYPE_P (TREE_TYPE (name2))
3845           && TEST_BIT (found_in_subgraph, SSA_NAME_VERSION (name2))
3846           && !has_single_use (name2))
3847         {
3848           tree tmp;
3849
3850           /* Build an expression for the range test.  */
3851           tmp = name2;
3852           if (TREE_TYPE (name) != TREE_TYPE (name2))
3853             tmp = build1 (NOP_EXPR, TREE_TYPE (name), tmp);
3854           if (cst2 != NULL_TREE)
3855             tmp = build2 (PLUS_EXPR, TREE_TYPE (name), tmp, cst2);
3856
3857           if (dump_file)
3858             {
3859               fprintf (dump_file, "Adding assert for ");
3860               print_generic_expr (dump_file, name2, 0);
3861               fprintf (dump_file, " from ");
3862               print_generic_expr (dump_file, tmp, 0);
3863               fprintf (dump_file, "\n");
3864             }
3865
3866           register_new_assert_for (name2, tmp, comp_code, val, NULL, e, bsi);
3867
3868           retval = true;
3869         }
3870     }
3871
3872   return retval;
3873 }
3874
3875 /* OP is an operand of a truth value expression which is known to have
3876    a particular value.  Register any asserts for OP and for any
3877    operands in OP's defining statement. 
3878
3879    If CODE is EQ_EXPR, then we want to register OP is zero (false),
3880    if CODE is NE_EXPR, then we want to register OP is nonzero (true).   */
3881
3882 static bool
3883 register_edge_assert_for_1 (tree op, enum tree_code code,
3884                             edge e, block_stmt_iterator bsi)
3885 {
3886   bool retval = false;
3887   tree op_def, rhs, val;
3888   enum tree_code rhs_code;
3889
3890   /* We only care about SSA_NAMEs.  */
3891   if (TREE_CODE (op) != SSA_NAME)
3892     return false;
3893
3894   /* We know that OP will have a zero or nonzero value.  If OP is used
3895      more than once go ahead and register an assert for OP. 
3896
3897      The FOUND_IN_SUBGRAPH support is not helpful in this situation as
3898      it will always be set for OP (because OP is used in a COND_EXPR in
3899      the subgraph).  */
3900   if (!has_single_use (op))
3901     {
3902       val = build_int_cst (TREE_TYPE (op), 0);
3903       register_new_assert_for (op, op, code, val, NULL, e, bsi);
3904       retval = true;
3905     }
3906
3907   /* Now look at how OP is set.  If it's set from a comparison,
3908      a truth operation or some bit operations, then we may be able
3909      to register information about the operands of that assignment.  */
3910   op_def = SSA_NAME_DEF_STMT (op);
3911   if (TREE_CODE (op_def) != GIMPLE_MODIFY_STMT)
3912     return retval;
3913
3914   rhs = GIMPLE_STMT_OPERAND (op_def, 1);
3915   rhs_code = TREE_CODE (rhs);
3916
3917   if (COMPARISON_CLASS_P (rhs))
3918     {
3919       bool invert = (code == EQ_EXPR ? true : false);
3920       tree op0 = TREE_OPERAND (rhs, 0);
3921       tree op1 = TREE_OPERAND (rhs, 1);
3922
3923       if (TREE_CODE (op0) == SSA_NAME)
3924         retval |= register_edge_assert_for_2 (op0, e, bsi, rhs_code, op0, op1,
3925                                               invert);
3926       if (TREE_CODE (op1) == SSA_NAME)
3927         retval |= register_edge_assert_for_2 (op1, e, bsi, rhs_code, op0, op1,
3928                                               invert);
3929     }
3930   else if ((code == NE_EXPR
3931             && (TREE_CODE (rhs) == TRUTH_AND_EXPR
3932                 || TREE_CODE (rhs) == BIT_AND_EXPR))
3933            || (code == EQ_EXPR
3934                && (TREE_CODE (rhs) == TRUTH_OR_EXPR
3935                    || TREE_CODE (rhs) == BIT_IOR_EXPR)))
3936     {
3937       /* Recurse on each operand.  */
3938       retval |= register_edge_assert_for_1 (TREE_OPERAND (rhs, 0),
3939                                             code, e, bsi);
3940       retval |= register_edge_assert_for_1 (TREE_OPERAND (rhs, 1),
3941                                             code, e, bsi);
3942     }
3943   else if (TREE_CODE (rhs) == TRUTH_NOT_EXPR)
3944     {
3945       /* Recurse, flipping CODE.  */
3946       code = invert_tree_comparison (code, false);
3947       retval |= register_edge_assert_for_1 (TREE_OPERAND (rhs, 0),
3948                                             code, e, bsi);
3949     }
3950   else if (TREE_CODE (rhs) == SSA_NAME)
3951     {
3952       /* Recurse through the copy.  */
3953       retval |= register_edge_assert_for_1 (rhs, code, e, bsi);
3954     }
3955   else if (CONVERT_EXPR_P (rhs))
3956     { 
3957       /* Recurse through the type conversion.  */
3958       retval |= register_edge_assert_for_1 (TREE_OPERAND (rhs, 0),
3959                                             code, e, bsi);
3960     }
3961
3962   return retval;
3963 }
3964
3965 /* Try to register an edge assertion for SSA name NAME on edge E for
3966    the condition COND contributing to the conditional jump pointed to by SI.
3967    Return true if an assertion for NAME could be registered.  */
3968
3969 static bool
3970 register_edge_assert_for (tree name, edge e, block_stmt_iterator si,
3971                           enum tree_code cond_code, tree cond_op0,
3972                           tree cond_op1)
3973 {
3974   tree val;
3975   enum tree_code comp_code;
3976   bool retval = false;
3977   bool is_else_edge = (e->flags & EDGE_FALSE_VALUE) != 0;
3978
3979   /* Do not attempt to infer anything in names that flow through
3980      abnormal edges.  */
3981   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
3982     return false;
3983
3984   if (!extract_code_and_val_from_cond_with_ops (name, cond_code,
3985                                                 cond_op0, cond_op1,
3986                                                 is_else_edge,
3987                                                 &comp_code, &val))
3988     return false;
3989
3990   /* Register ASSERT_EXPRs for name.  */
3991   retval |= register_edge_assert_for_2 (name, e, si, cond_code, cond_op0,
3992                                         cond_op1, is_else_edge);
3993
3994
3995   /* If COND is effectively an equality test of an SSA_NAME against
3996      the value zero or one, then we may be able to assert values
3997      for SSA_NAMEs which flow into COND.  */
3998
3999   /* In the case of NAME == 1 or NAME != 0, for TRUTH_AND_EXPR defining
4000      statement of NAME we can assert both operands of the TRUTH_AND_EXPR
4001      have nonzero value.  */
4002   if (((comp_code == EQ_EXPR && integer_onep (val))
4003        || (comp_code == NE_EXPR && integer_zerop (val))))
4004     {
4005       tree def_stmt = SSA_NAME_DEF_STMT (name);
4006
4007       if (TREE_CODE (def_stmt) == GIMPLE_MODIFY_STMT
4008           && (TREE_CODE (GIMPLE_STMT_OPERAND (def_stmt, 1)) == TRUTH_AND_EXPR
4009               || TREE_CODE (GIMPLE_STMT_OPERAND (def_stmt, 1)) == BIT_AND_EXPR))
4010         {
4011           tree op0 = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 0);
4012           tree op1 = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 1);
4013           retval |= register_edge_assert_for_1 (op0, NE_EXPR, e, si);
4014           retval |= register_edge_assert_for_1 (op1, NE_EXPR, e, si);
4015         }
4016     }
4017
4018   /* In the case of NAME == 0 or NAME != 1, for TRUTH_OR_EXPR defining
4019      statement of NAME we can assert both operands of the TRUTH_OR_EXPR
4020      have zero value.  */
4021   if (((comp_code == EQ_EXPR && integer_zerop (val))
4022        || (comp_code == NE_EXPR && integer_onep (val))))
4023     {
4024       tree def_stmt = SSA_NAME_DEF_STMT (name);
4025
4026       if (TREE_CODE (def_stmt) == GIMPLE_MODIFY_STMT
4027           && (TREE_CODE (GIMPLE_STMT_OPERAND (def_stmt, 1)) == TRUTH_OR_EXPR
4028               /* For BIT_IOR_EXPR only if NAME == 0 both operands have
4029                  necessarily zero value.  */
4030               || (comp_code == EQ_EXPR
4031                   && (TREE_CODE (GIMPLE_STMT_OPERAND (def_stmt, 1))
4032                         == BIT_IOR_EXPR))))
4033         {
4034           tree op0 = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 0);
4035           tree op1 = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 1);
4036           retval |= register_edge_assert_for_1 (op0, EQ_EXPR, e, si);
4037           retval |= register_edge_assert_for_1 (op1, EQ_EXPR, e, si);
4038         }
4039     }
4040
4041   return retval;
4042 }
4043
4044
4045 static bool find_assert_locations (basic_block bb);
4046
4047 /* Determine whether the outgoing edges of BB should receive an
4048    ASSERT_EXPR for each of the operands of BB's LAST statement.
4049    The last statement of BB must be a COND_EXPR.
4050
4051    If any of the sub-graphs rooted at BB have an interesting use of
4052    the predicate operands, an assert location node is added to the
4053    list of assertions for the corresponding operands.  */
4054
4055 static bool
4056 find_conditional_asserts (basic_block bb, tree last)
4057 {
4058   bool need_assert;
4059   block_stmt_iterator bsi;
4060   tree op;
4061   edge_iterator ei;
4062   edge e;
4063   ssa_op_iter iter;
4064
4065   need_assert = false;
4066   bsi = bsi_for_stmt (last);
4067
4068   /* Look for uses of the operands in each of the sub-graphs
4069      rooted at BB.  We need to check each of the outgoing edges
4070      separately, so that we know what kind of ASSERT_EXPR to
4071      insert.  */
4072   FOR_EACH_EDGE (e, ei, bb->succs)
4073     {
4074       if (e->dest == bb)
4075         continue;
4076
4077       /* Remove the COND_EXPR operands from the FOUND_IN_SUBGRAPH bitmap.
4078          Otherwise, when we finish traversing each of the sub-graphs, we
4079          won't know whether the variables were found in the sub-graphs or
4080          if they had been found in a block upstream from BB. 
4081
4082          This is actually a bad idea is some cases, particularly jump
4083          threading.  Consider a CFG like the following:
4084
4085                     0
4086                    /|
4087                   1 |
4088                    \|
4089                     2
4090                    / \
4091                   3   4
4092
4093          Assume that one or more operands in the conditional at the
4094          end of block 0 are used in a conditional in block 2, but not
4095          anywhere in block 1.  In this case we will not insert any
4096          assert statements in block 1, which may cause us to miss
4097          opportunities to optimize, particularly for jump threading.  */
4098       FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
4099         RESET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
4100
4101       /* Traverse the strictly dominated sub-graph rooted at E->DEST
4102          to determine if any of the operands in the conditional
4103          predicate are used.  */
4104       need_assert |= find_assert_locations (e->dest);
4105
4106       /* Register the necessary assertions for each operand in the
4107          conditional predicate.  */
4108       FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
4109         {
4110           tree cond = COND_EXPR_COND (last);
4111           if (op != cond)
4112             need_assert |= register_edge_assert_for (op, e, bsi,
4113                                                      TREE_CODE (cond),
4114                                                      TREE_OPERAND (cond, 0),
4115                                                      TREE_OPERAND (cond, 1));
4116           else
4117             need_assert |= register_edge_assert_for (op, e, bsi, EQ_EXPR, op,
4118                                                      boolean_true_node);
4119         }
4120     }
4121
4122   /* Finally, indicate that we have found the operands in the
4123      conditional.  */
4124   FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
4125     SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
4126
4127   return need_assert;
4128 }
4129
4130 /* Compare two case labels sorting first by the destination label uid
4131    and then by the case value.  */
4132
4133 static int
4134 compare_case_labels (const void *p1, const void *p2)
4135 {
4136   const_tree const case1 = *(const_tree const*)p1;
4137   const_tree const case2 = *(const_tree const*)p2;
4138   unsigned int uid1 = DECL_UID (CASE_LABEL (case1));
4139   unsigned int uid2 = DECL_UID (CASE_LABEL (case2));
4140
4141   if (uid1 < uid2)
4142     return -1;
4143   else if (uid1 == uid2)
4144     {
4145       /* Make sure the default label is first in a group.  */
4146       if (!CASE_LOW (case1))
4147         return -1;
4148       else if (!CASE_LOW (case2))
4149         return 1;
4150       else
4151         return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
4152     }
4153   else
4154     return 1;
4155 }
4156
4157 /* Determine whether the outgoing edges of BB should receive an
4158    ASSERT_EXPR for each of the operands of BB's LAST statement.
4159    The last statement of BB must be a SWITCH_EXPR.
4160
4161    If any of the sub-graphs rooted at BB have an interesting use of
4162    the predicate operands, an assert location node is added to the
4163    list of assertions for the corresponding operands.  */
4164
4165 static bool
4166 find_switch_asserts (basic_block bb, tree last)
4167 {
4168   bool need_assert;
4169   block_stmt_iterator bsi;
4170   tree op;
4171   edge e;
4172   tree vec = SWITCH_LABELS (last), vec2;
4173   size_t n = TREE_VEC_LENGTH (vec);
4174   unsigned int idx;
4175
4176   need_assert = false;
4177   bsi = bsi_for_stmt (last);
4178   op = TREE_OPERAND (last, 0);
4179   if (TREE_CODE (op) != SSA_NAME)
4180     return false;
4181
4182   /* Build a vector of case labels sorted by destination label.  */
4183   vec2 = make_tree_vec (n);
4184   for (idx = 0; idx < n; ++idx)
4185     TREE_VEC_ELT (vec2, idx) = TREE_VEC_ELT (vec, idx);
4186   qsort (&TREE_VEC_ELT (vec2, 0), n, sizeof (tree), compare_case_labels);
4187
4188   for (idx = 0; idx < n; ++idx)
4189     {
4190       tree min, max;
4191       tree cl = TREE_VEC_ELT (vec2, idx);
4192
4193       min = CASE_LOW (cl);
4194       max = CASE_HIGH (cl);
4195
4196       /* If there are multiple case labels with the same destination
4197          we need to combine them to a single value range for the edge.  */
4198       if (idx + 1 < n
4199           && CASE_LABEL (cl) == CASE_LABEL (TREE_VEC_ELT (vec2, idx + 1)))
4200         {
4201           /* Skip labels until the last of the group.  */
4202           do {
4203             ++idx;
4204           } while (idx < n
4205                    && CASE_LABEL (cl) == CASE_LABEL (TREE_VEC_ELT (vec2, idx)));
4206           --idx;
4207
4208           /* Pick up the maximum of the case label range.  */
4209           if (CASE_HIGH (TREE_VEC_ELT (vec2, idx)))
4210             max = CASE_HIGH (TREE_VEC_ELT (vec2, idx));
4211           else
4212             max = CASE_LOW (TREE_VEC_ELT (vec2, idx));
4213         }
4214
4215       /* Nothing to do if the range includes the default label until we
4216          can register anti-ranges.  */
4217       if (min == NULL_TREE)
4218         continue;
4219
4220       /* Find the edge to register the assert expr on.  */
4221       e = find_edge (bb, label_to_block (CASE_LABEL (cl)));
4222
4223       /* Remove the SWITCH_EXPR operand from the FOUND_IN_SUBGRAPH bitmap.
4224          Otherwise, when we finish traversing each of the sub-graphs, we
4225          won't know whether the variables were found in the sub-graphs or
4226          if they had been found in a block upstream from BB.  */
4227       RESET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
4228
4229       /* Traverse the strictly dominated sub-graph rooted at E->DEST
4230          to determine if any of the operands in the conditional
4231          predicate are used.  */
4232       if (e->dest != bb)
4233         need_assert |= find_assert_locations (e->dest);
4234
4235       /* Register the necessary assertions for the operand in the
4236          SWITCH_EXPR.  */
4237       need_assert |= register_edge_assert_for (op, e, bsi,
4238                                                max ? GE_EXPR : EQ_EXPR,
4239                                                op,
4240                                                fold_convert (TREE_TYPE (op),
4241                                                              min));
4242       if (max)
4243         {
4244           need_assert |= register_edge_assert_for (op, e, bsi, LE_EXPR,
4245                                                    op,
4246                                                    fold_convert (TREE_TYPE (op),
4247                                                                  max));
4248         }
4249     }
4250
4251   /* Finally, indicate that we have found the operand in the
4252      SWITCH_EXPR.  */
4253   SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
4254
4255   return need_assert;
4256 }
4257
4258
4259 /* Traverse all the statements in block BB looking for statements that
4260    may generate useful assertions for the SSA names in their operand.
4261    If a statement produces a useful assertion A for name N_i, then the
4262    list of assertions already generated for N_i is scanned to
4263    determine if A is actually needed.
4264    
4265    If N_i already had the assertion A at a location dominating the
4266    current location, then nothing needs to be done.  Otherwise, the
4267    new location for A is recorded instead.
4268
4269    1- For every statement S in BB, all the variables used by S are
4270       added to bitmap FOUND_IN_SUBGRAPH.
4271
4272    2- If statement S uses an operand N in a way that exposes a known
4273       value range for N, then if N was not already generated by an
4274       ASSERT_EXPR, create a new assert location for N.  For instance,
4275       if N is a pointer and the statement dereferences it, we can
4276       assume that N is not NULL.
4277
4278    3- COND_EXPRs are a special case of #2.  We can derive range
4279       information from the predicate but need to insert different
4280       ASSERT_EXPRs for each of the sub-graphs rooted at the
4281       conditional block.  If the last statement of BB is a conditional
4282       expression of the form 'X op Y', then
4283
4284       a) Remove X and Y from the set FOUND_IN_SUBGRAPH.
4285
4286       b) If the conditional is the only entry point to the sub-graph
4287          corresponding to the THEN_CLAUSE, recurse into it.  On
4288          return, if X and/or Y are marked in FOUND_IN_SUBGRAPH, then
4289          an ASSERT_EXPR is added for the corresponding variable.
4290
4291       c) Repeat step (b) on the ELSE_CLAUSE.
4292
4293       d) Mark X and Y in FOUND_IN_SUBGRAPH.
4294
4295       For instance,
4296
4297             if (a == 9)
4298               b = a;
4299             else
4300               b = c + 1;
4301
4302       In this case, an assertion on the THEN clause is useful to
4303       determine that 'a' is always 9 on that edge.  However, an assertion
4304       on the ELSE clause would be unnecessary.
4305
4306    4- If BB does not end in a conditional expression, then we recurse
4307       into BB's dominator children.
4308    
4309    At the end of the recursive traversal, every SSA name will have a
4310    list of locations where ASSERT_EXPRs should be added.  When a new
4311    location for name N is found, it is registered by calling
4312    register_new_assert_for.  That function keeps track of all the
4313    registered assertions to prevent adding unnecessary assertions.
4314    For instance, if a pointer P_4 is dereferenced more than once in a
4315    dominator tree, only the location dominating all the dereference of
4316    P_4 will receive an ASSERT_EXPR.
4317
4318    If this function returns true, then it means that there are names
4319    for which we need to generate ASSERT_EXPRs.  Those assertions are
4320    inserted by process_assert_insertions.  */
4321
4322 static bool
4323 find_assert_locations (basic_block bb)
4324 {
4325   block_stmt_iterator si;
4326   tree last, phi;
4327   bool need_assert;
4328   basic_block son;
4329
4330   if (TEST_BIT (blocks_visited, bb->index))
4331     return false;
4332
4333   SET_BIT (blocks_visited, bb->index);
4334
4335   need_assert = false;
4336
4337   /* Traverse all PHI nodes in BB marking used operands.  */
4338   for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
4339     {
4340       use_operand_p arg_p;
4341       ssa_op_iter i;
4342
4343       FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_USE)
4344         {
4345           tree arg = USE_FROM_PTR (arg_p);
4346           if (TREE_CODE (arg) == SSA_NAME)
4347             {
4348               gcc_assert (is_gimple_reg (PHI_RESULT (phi)));
4349               SET_BIT (found_in_subgraph, SSA_NAME_VERSION (arg));
4350             }
4351         }
4352     }
4353
4354   /* Traverse all the statements in BB marking used names and looking
4355      for statements that may infer assertions for their used operands.  */
4356   last = NULL_TREE;
4357   for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
4358     {
4359       tree stmt, op;
4360       ssa_op_iter i;
4361
4362       stmt = bsi_stmt (si);
4363
4364       /* See if we can derive an assertion for any of STMT's operands.  */
4365       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
4366         {
4367           tree value;
4368           enum tree_code comp_code;
4369
4370           /* Mark OP in bitmap FOUND_IN_SUBGRAPH.  If STMT is inside
4371              the sub-graph of a conditional block, when we return from
4372              this recursive walk, our parent will use the
4373              FOUND_IN_SUBGRAPH bitset to determine if one of the
4374              operands it was looking for was present in the sub-graph.  */
4375           SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
4376
4377           /* If OP is used in such a way that we can infer a value
4378              range for it, and we don't find a previous assertion for
4379              it, create a new assertion location node for OP.  */
4380           if (infer_value_range (stmt, op, &comp_code, &value))
4381             {
4382               /* If we are able to infer a nonzero value range for OP,
4383                  then walk backwards through the use-def chain to see if OP
4384                  was set via a typecast.
4385
4386                  If so, then we can also infer a nonzero value range
4387                  for the operand of the NOP_EXPR.  */
4388               if (comp_code == NE_EXPR && integer_zerop (value))
4389                 {
4390                   tree t = op;
4391                   tree def_stmt = SSA_NAME_DEF_STMT (t);
4392         
4393                   while (TREE_CODE (def_stmt) == GIMPLE_MODIFY_STMT
4394                          && TREE_CODE
4395                              (GIMPLE_STMT_OPERAND (def_stmt, 1)) == NOP_EXPR
4396                          && TREE_CODE
4397                              (TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1),
4398                                             0)) == SSA_NAME
4399                          && POINTER_TYPE_P
4400                              (TREE_TYPE (TREE_OPERAND
4401                                           (GIMPLE_STMT_OPERAND (def_stmt,
4402                                                                 1), 0))))
4403                     {
4404                       t = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 0);
4405                       def_stmt = SSA_NAME_DEF_STMT (t);
4406
4407                       /* Note we want to register the assert for the
4408                          operand of the NOP_EXPR after SI, not after the
4409                          conversion.  */
4410                       if (! has_single_use (t))
4411                         {
4412                           register_new_assert_for (t, t, comp_code, value,
4413                                                    bb, NULL, si);
4414                           need_assert = true;
4415                         }
4416                     }
4417                 }
4418
4419               /* If OP is used only once, namely in this STMT, don't
4420                  bother creating an ASSERT_EXPR for it.  Such an
4421                  ASSERT_EXPR would do nothing but increase compile time.  */
4422               if (!has_single_use (op))
4423                 {
4424                   register_new_assert_for (op, op, comp_code, value,
4425                                            bb, NULL, si);
4426                   need_assert = true;
4427                 }
4428             }
4429         }
4430
4431       /* Remember the last statement of the block.  */
4432       last = stmt;
4433     }
4434
4435   /* If BB's last statement is a conditional expression
4436      involving integer operands, recurse into each of the sub-graphs
4437      rooted at BB to determine if we need to add ASSERT_EXPRs.  */
4438   if (last
4439       && TREE_CODE (last) == COND_EXPR
4440       && !fp_predicate (COND_EXPR_COND (last))
4441       && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
4442     need_assert |= find_conditional_asserts (bb, last);
4443
4444   if (last
4445       && TREE_CODE (last) == SWITCH_EXPR
4446       && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
4447     need_assert |= find_switch_asserts (bb, last);
4448
4449   /* Recurse into the dominator children of BB.  */
4450   for (son = first_dom_son (CDI_DOMINATORS, bb);
4451        son;
4452        son = next_dom_son (CDI_DOMINATORS, son))
4453     need_assert |= find_assert_locations (son);
4454
4455   return need_assert;
4456 }
4457
4458
4459 /* Create an ASSERT_EXPR for NAME and insert it in the location
4460    indicated by LOC.  Return true if we made any edge insertions.  */
4461
4462 static bool
4463 process_assert_insertions_for (tree name, assert_locus_t loc)
4464 {
4465   /* Build the comparison expression NAME_i COMP_CODE VAL.  */
4466   tree stmt, cond, assert_expr;
4467   edge_iterator ei;
4468   edge e;
4469
4470   cond = build2 (loc->comp_code, boolean_type_node, loc->expr, loc->val);
4471   assert_expr = build_assert_expr_for (cond, name);
4472
4473   if (loc->e)
4474     {
4475       /* We have been asked to insert the assertion on an edge.  This
4476          is used only by COND_EXPR and SWITCH_EXPR assertions.  */
4477 #if defined ENABLE_CHECKING
4478       gcc_assert (TREE_CODE (bsi_stmt (loc->si)) == COND_EXPR
4479           || TREE_CODE (bsi_stmt (loc->si)) == SWITCH_EXPR);
4480 #endif
4481
4482       bsi_insert_on_edge (loc->e, assert_expr);
4483       return true;
4484     }
4485
4486   /* Otherwise, we can insert right after LOC->SI iff the
4487      statement must not be the last statement in the block.  */
4488   stmt = bsi_stmt (loc->si);
4489   if (!stmt_ends_bb_p (stmt))
4490     {
4491       bsi_insert_after (&loc->si, assert_expr, BSI_SAME_STMT);
4492       return false;
4493     }
4494
4495   /* If STMT must be the last statement in BB, we can only insert new
4496      assertions on the non-abnormal edge out of BB.  Note that since
4497      STMT is not control flow, there may only be one non-abnormal edge
4498      out of BB.  */
4499   FOR_EACH_EDGE (e, ei, loc->bb->succs)
4500     if (!(e->flags & EDGE_ABNORMAL))
4501       {
4502         bsi_insert_on_edge (e, assert_expr);
4503         return true;
4504       }
4505
4506   gcc_unreachable ();
4507 }
4508
4509
4510 /* Process all the insertions registered for every name N_i registered
4511    in NEED_ASSERT_FOR.  The list of assertions to be inserted are
4512    found in ASSERTS_FOR[i].  */
4513
4514 static void
4515 process_assert_insertions (void)
4516 {
4517   unsigned i;
4518   bitmap_iterator bi;
4519   bool update_edges_p = false;
4520   int num_asserts = 0;
4521
4522   if (dump_file && (dump_flags & TDF_DETAILS))
4523     dump_all_asserts (dump_file);
4524
4525   EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
4526     {
4527       assert_locus_t loc = asserts_for[i];
4528       gcc_assert (loc);
4529
4530       while (loc)
4531         {
4532           assert_locus_t next = loc->next;
4533           update_edges_p |= process_assert_insertions_for (ssa_name (i), loc);
4534           free (loc);
4535           loc = next;
4536           num_asserts++;
4537         }
4538     }
4539
4540   if (update_edges_p)
4541     bsi_commit_edge_inserts ();
4542
4543   if (dump_file && (dump_flags & TDF_STATS))
4544     fprintf (dump_file, "\nNumber of ASSERT_EXPR expressions inserted: %d\n\n",
4545              num_asserts);
4546 }
4547
4548
4549 /* Traverse the flowgraph looking for conditional jumps to insert range
4550    expressions.  These range expressions are meant to provide information
4551    to optimizations that need to reason in terms of value ranges.  They
4552    will not be expanded into RTL.  For instance, given:
4553
4554    x = ...
4555    y = ...
4556    if (x < y)
4557      y = x - 2;
4558    else
4559      x = y + 3;
4560
4561    this pass will transform the code into:
4562
4563    x = ...
4564    y = ...
4565    if (x < y)
4566     {
4567       x = ASSERT_EXPR <x, x < y>
4568       y = x - 2
4569     }
4570    else
4571     {
4572       y = ASSERT_EXPR <y, x <= y>
4573       x = y + 3
4574     }
4575
4576    The idea is that once copy and constant propagation have run, other
4577    optimizations will be able to determine what ranges of values can 'x'
4578    take in different paths of the code, simply by checking the reaching
4579    definition of 'x'.  */
4580
4581 static void
4582 insert_range_assertions (void)
4583 {
4584   edge e;
4585   edge_iterator ei;
4586   bool update_ssa_p;
4587   
4588   found_in_subgraph = sbitmap_alloc (num_ssa_names);
4589   sbitmap_zero (found_in_subgraph);
4590
4591   blocks_visited = sbitmap_alloc (last_basic_block);
4592   sbitmap_zero (blocks_visited);
4593
4594   need_assert_for = BITMAP_ALLOC (NULL);
4595   asserts_for = XCNEWVEC (assert_locus_t, num_ssa_names);
4596
4597   calculate_dominance_info (CDI_DOMINATORS);
4598
4599   update_ssa_p = false;
4600   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
4601     if (find_assert_locations (e->dest))
4602       update_ssa_p = true;
4603
4604   if (update_ssa_p)
4605     {
4606       process_assert_insertions ();
4607       update_ssa (TODO_update_ssa_no_phi);
4608     }
4609
4610   if (dump_file && (dump_flags & TDF_DETAILS))
4611     {
4612       fprintf (dump_file, "\nSSA form after inserting ASSERT_EXPRs\n");
4613       dump_function_to_file (current_function_decl, dump_file, dump_flags);
4614     }
4615
4616   sbitmap_free (found_in_subgraph);
4617   free (asserts_for);
4618   BITMAP_FREE (need_assert_for);
4619 }
4620
4621 /* Checks one ARRAY_REF in REF, located at LOCUS. Ignores flexible arrays
4622    and "struct" hacks. If VRP can determine that the
4623    array subscript is a constant, check if it is outside valid
4624    range. If the array subscript is a RANGE, warn if it is
4625    non-overlapping with valid range.
4626    IGNORE_OFF_BY_ONE is true if the ARRAY_REF is inside a ADDR_EXPR.  */
4627
4628 static void
4629 check_array_ref (tree ref, location_t* locus, bool ignore_off_by_one)
4630 {
4631   value_range_t* vr = NULL;
4632   tree low_sub, up_sub;
4633   tree low_bound, up_bound = array_ref_up_bound (ref);
4634
4635   low_sub = up_sub = TREE_OPERAND (ref, 1);
4636
4637   if (!up_bound || TREE_NO_WARNING (ref)
4638       || TREE_CODE (up_bound) != INTEGER_CST
4639       /* Can not check flexible arrays.  */
4640       || (TYPE_SIZE (TREE_TYPE (ref)) == NULL_TREE
4641           && TYPE_DOMAIN (TREE_TYPE (ref)) != NULL_TREE
4642           && TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (ref))) == NULL_TREE)
4643       /* Accesses after the end of arrays of size 0 (gcc
4644          extension) and 1 are likely intentional ("struct
4645          hack").  */
4646       || compare_tree_int (up_bound, 1) <= 0)
4647     return;
4648
4649   low_bound = array_ref_low_bound (ref);
4650
4651   if (TREE_CODE (low_sub) == SSA_NAME)
4652     {
4653       vr = get_value_range (low_sub);
4654       if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
4655         {
4656           low_sub = vr->type == VR_RANGE ? vr->max : vr->min;
4657           up_sub = vr->type == VR_RANGE ? vr->min : vr->max;
4658         }
4659     }
4660
4661   if (vr && vr->type == VR_ANTI_RANGE)
4662     {
4663       if (TREE_CODE (up_sub) == INTEGER_CST
4664           && tree_int_cst_lt (up_bound, up_sub)
4665           && TREE_CODE (low_sub) == INTEGER_CST
4666           && tree_int_cst_lt (low_sub, low_bound))
4667         {
4668           warning (OPT_Warray_bounds,
4669                    "%Harray subscript is outside array bounds", locus);
4670           TREE_NO_WARNING (ref) = 1;
4671         }
4672     }
4673   else if (TREE_CODE (up_sub) == INTEGER_CST
4674            && tree_int_cst_lt (up_bound, up_sub)
4675            && !tree_int_cst_equal (up_bound, up_sub)
4676            && (!ignore_off_by_one
4677                || !tree_int_cst_equal (int_const_binop (PLUS_EXPR,
4678                                                         up_bound,
4679                                                         integer_one_node,
4680                                                         0),
4681                                        up_sub)))
4682     {
4683       warning (OPT_Warray_bounds, "%Harray subscript is above array bounds",
4684                locus);
4685       TREE_NO_WARNING (ref) = 1;
4686     }
4687   else if (TREE_CODE (low_sub) == INTEGER_CST
4688            && tree_int_cst_lt (low_sub, low_bound))
4689     {
4690       warning (OPT_Warray_bounds, "%Harray subscript is below array bounds",
4691                locus);
4692       TREE_NO_WARNING (ref) = 1;
4693     }
4694 }
4695
4696 /* Searches if the expr T, located at LOCATION computes
4697    address of an ARRAY_REF, and call check_array_ref on it.  */
4698
4699 static void
4700 search_for_addr_array(tree t, location_t* location)
4701 {
4702   while (TREE_CODE (t) == SSA_NAME)
4703     {
4704       t = SSA_NAME_DEF_STMT (t);
4705       if (TREE_CODE (t) != GIMPLE_MODIFY_STMT)
4706         return;
4707       t = GIMPLE_STMT_OPERAND (t, 1);
4708     }
4709
4710
4711   /* We are only interested in addresses of ARRAY_REF's.  */
4712   if (TREE_CODE (t) != ADDR_EXPR) 
4713     return;
4714
4715   /* Check each ARRAY_REFs in the reference chain. */
4716   do 
4717     {
4718       if (TREE_CODE (t) == ARRAY_REF)
4719         check_array_ref (t, location, true /*ignore_off_by_one*/);
4720
4721       t = TREE_OPERAND(t,0);
4722     }
4723   while (handled_component_p (t));
4724 }
4725
4726 /* walk_tree() callback that checks if *TP is
4727    an ARRAY_REF inside an ADDR_EXPR (in which an array
4728    subscript one outside the valid range is allowed). Call
4729    check_array_ref for each ARRAY_REF found. The location is 
4730    passed in DATA.  */
4731
4732 static tree
4733 check_array_bounds (tree *tp, int *walk_subtree, void *data)
4734 {
4735   tree t = *tp;
4736   tree stmt = (tree)data;
4737   location_t *location = EXPR_LOCUS (stmt);
4738
4739   if (!EXPR_HAS_LOCATION (stmt))
4740     {
4741       *walk_subtree = FALSE;
4742       return NULL_TREE;
4743     }
4744
4745   *walk_subtree = TRUE;
4746
4747   if (TREE_CODE (t) == ARRAY_REF)
4748     check_array_ref (t, location, false /*ignore_off_by_one*/);
4749
4750   if (TREE_CODE (t) == INDIRECT_REF
4751       || (TREE_CODE (t) == RETURN_EXPR && TREE_OPERAND (t, 0)))
4752     search_for_addr_array (TREE_OPERAND (t, 0), location);
4753   else if (TREE_CODE (t) == CALL_EXPR)
4754     {
4755       tree arg;
4756       call_expr_arg_iterator iter;
4757
4758       FOR_EACH_CALL_EXPR_ARG (arg, iter, t) 
4759         search_for_addr_array (arg, location);
4760     }
4761
4762   if (TREE_CODE (t) == ADDR_EXPR)
4763     *walk_subtree = FALSE;
4764
4765   return NULL_TREE;
4766 }
4767
4768 /* Walk over all statements of all reachable BBs and call check_array_bounds
4769    on them.  */
4770
4771 static void
4772 check_all_array_refs (void)
4773 {
4774   basic_block bb;
4775   block_stmt_iterator si;
4776
4777   FOR_EACH_BB (bb)
4778     {
4779       /* Skip bb's that are clearly unreachable.  */
4780       if (single_pred_p (bb))
4781       {
4782         basic_block pred_bb = EDGE_PRED (bb, 0)->src;
4783         tree ls = NULL_TREE;
4784
4785         if (!bsi_end_p (bsi_last (pred_bb)))
4786           ls = bsi_stmt (bsi_last (pred_bb));
4787
4788         if (ls && TREE_CODE (ls) == COND_EXPR
4789             && ((COND_EXPR_COND (ls) == boolean_false_node
4790                  && (EDGE_PRED (bb, 0)->flags & EDGE_TRUE_VALUE))
4791                 || (COND_EXPR_COND (ls) == boolean_true_node
4792                     && (EDGE_PRED (bb, 0)->flags & EDGE_FALSE_VALUE))))
4793           continue;
4794       }
4795       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
4796         walk_tree (bsi_stmt_ptr (si), check_array_bounds,
4797                    bsi_stmt (si), NULL);
4798     }
4799 }
4800
4801 /* Convert range assertion expressions into the implied copies and
4802    copy propagate away the copies.  Doing the trivial copy propagation
4803    here avoids the need to run the full copy propagation pass after
4804    VRP. 
4805    
4806    FIXME, this will eventually lead to copy propagation removing the
4807    names that had useful range information attached to them.  For
4808    instance, if we had the assertion N_i = ASSERT_EXPR <N_j, N_j > 3>,
4809    then N_i will have the range [3, +INF].
4810    
4811    However, by converting the assertion into the implied copy
4812    operation N_i = N_j, we will then copy-propagate N_j into the uses
4813    of N_i and lose the range information.  We may want to hold on to
4814    ASSERT_EXPRs a little while longer as the ranges could be used in
4815    things like jump threading.
4816    
4817    The problem with keeping ASSERT_EXPRs around is that passes after
4818    VRP need to handle them appropriately. 
4819
4820    Another approach would be to make the range information a first
4821    class property of the SSA_NAME so that it can be queried from
4822    any pass.  This is made somewhat more complex by the need for
4823    multiple ranges to be associated with one SSA_NAME.  */
4824
4825 static void
4826 remove_range_assertions (void)
4827 {
4828   basic_block bb;
4829   block_stmt_iterator si;
4830
4831   /* Note that the BSI iterator bump happens at the bottom of the
4832      loop and no bump is necessary if we're removing the statement
4833      referenced by the current BSI.  */
4834   FOR_EACH_BB (bb)
4835     for (si = bsi_start (bb); !bsi_end_p (si);)
4836       {
4837         tree stmt = bsi_stmt (si);
4838         tree use_stmt;
4839
4840         if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
4841             && TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 1)) == ASSERT_EXPR)
4842           {
4843             tree rhs = GIMPLE_STMT_OPERAND (stmt, 1), var;
4844             tree cond = fold (ASSERT_EXPR_COND (rhs));
4845             use_operand_p use_p;
4846             imm_use_iterator iter;
4847
4848             gcc_assert (cond != boolean_false_node);
4849
4850             /* Propagate the RHS into every use of the LHS.  */
4851             var = ASSERT_EXPR_VAR (rhs);
4852             FOR_EACH_IMM_USE_STMT (use_stmt, iter,
4853                                    GIMPLE_STMT_OPERAND (stmt, 0))
4854               FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
4855                 {
4856                   SET_USE (use_p, var);
4857                   gcc_assert (TREE_CODE (var) == SSA_NAME);
4858                 }
4859
4860             /* And finally, remove the copy, it is not needed.  */
4861             bsi_remove (&si, true);
4862             release_defs (stmt); 
4863           }
4864         else
4865           bsi_next (&si);
4866       }
4867
4868   sbitmap_free (blocks_visited);
4869 }
4870
4871
4872 /* Return true if STMT is interesting for VRP.  */
4873
4874 static bool
4875 stmt_interesting_for_vrp (tree stmt)
4876 {
4877   if (TREE_CODE (stmt) == PHI_NODE
4878       && is_gimple_reg (PHI_RESULT (stmt))
4879       && (INTEGRAL_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))
4880           || POINTER_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))))
4881     return true;
4882   else if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT)
4883     {
4884       tree lhs = GIMPLE_STMT_OPERAND (stmt, 0);
4885       tree rhs = GIMPLE_STMT_OPERAND (stmt, 1);
4886
4887       /* In general, assignments with virtual operands are not useful
4888          for deriving ranges, with the obvious exception of calls to
4889          builtin functions.  */
4890       if (TREE_CODE (lhs) == SSA_NAME
4891           && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
4892               || POINTER_TYPE_P (TREE_TYPE (lhs)))
4893           && ((TREE_CODE (rhs) == CALL_EXPR
4894                && TREE_CODE (CALL_EXPR_FN (rhs)) == ADDR_EXPR
4895                && DECL_P (TREE_OPERAND (CALL_EXPR_FN (rhs), 0))
4896                && DECL_IS_BUILTIN (TREE_OPERAND (CALL_EXPR_FN (rhs), 0)))
4897               || ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS)))
4898         return true;
4899     }
4900   else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
4901     return true;
4902
4903   return false;
4904 }
4905
4906
4907 /* Initialize local data structures for VRP.  */
4908
4909 static void
4910 vrp_initialize (void)
4911 {
4912   basic_block bb;
4913
4914   vr_value = XCNEWVEC (value_range_t *, num_ssa_names);
4915   vr_phi_edge_counts = XCNEWVEC (int, num_ssa_names);
4916
4917   FOR_EACH_BB (bb)
4918     {
4919       block_stmt_iterator si;
4920       tree phi;
4921
4922       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
4923         {
4924           if (!stmt_interesting_for_vrp (phi))
4925             {
4926               tree lhs = PHI_RESULT (phi);
4927               set_value_range_to_varying (get_value_range (lhs));
4928               DONT_SIMULATE_AGAIN (phi) = true;
4929             }
4930           else
4931             DONT_SIMULATE_AGAIN (phi) = false;
4932         }
4933
4934       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
4935         {
4936           tree stmt = bsi_stmt (si);
4937
4938           if (!stmt_interesting_for_vrp (stmt))
4939             {
4940               ssa_op_iter i;
4941               tree def;
4942               FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
4943                 set_value_range_to_varying (get_value_range (def));
4944               DONT_SIMULATE_AGAIN (stmt) = true;
4945             }
4946           else
4947             {
4948               DONT_SIMULATE_AGAIN (stmt) = false;
4949             }
4950         }
4951     }
4952 }
4953
4954
4955 /* Visit assignment STMT.  If it produces an interesting range, record
4956    the SSA name in *OUTPUT_P.  */
4957
4958 static enum ssa_prop_result
4959 vrp_visit_assignment (tree stmt, tree *output_p)
4960 {
4961   tree lhs, rhs, def;
4962   ssa_op_iter iter;
4963
4964   lhs = GIMPLE_STMT_OPERAND (stmt, 0);
4965   rhs = GIMPLE_STMT_OPERAND (stmt, 1);
4966
4967   /* We only keep track of ranges in integral and pointer types.  */
4968   if (TREE_CODE (lhs) == SSA_NAME
4969       && ((INTEGRAL_TYPE_P (TREE_TYPE (lhs))
4970            /* It is valid to have NULL MIN/MAX values on a type.  See
4971               build_range_type.  */
4972            && TYPE_MIN_VALUE (TREE_TYPE (lhs))
4973            && TYPE_MAX_VALUE (TREE_TYPE (lhs)))
4974           || POINTER_TYPE_P (TREE_TYPE (lhs))))
4975     {
4976       struct loop *l;
4977       value_range_t new_vr = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
4978
4979       extract_range_from_expr (&new_vr, rhs);
4980
4981       /* If STMT is inside a loop, we may be able to know something
4982          else about the range of LHS by examining scalar evolution
4983          information.  */
4984       if (current_loops && (l = loop_containing_stmt (stmt)))
4985         adjust_range_with_scev (&new_vr, l, stmt, lhs);
4986
4987       if (update_value_range (lhs, &new_vr))
4988         {
4989           *output_p = lhs;
4990
4991           if (dump_file && (dump_flags & TDF_DETAILS))
4992             {
4993               fprintf (dump_file, "Found new range for ");
4994               print_generic_expr (dump_file, lhs, 0);
4995               fprintf (dump_file, ": ");
4996               dump_value_range (dump_file, &new_vr);
4997               fprintf (dump_file, "\n\n");
4998             }
4999
5000           if (new_vr.type == VR_VARYING)
5001             return SSA_PROP_VARYING;
5002
5003           return SSA_PROP_INTERESTING;
5004         }
5005
5006       return SSA_PROP_NOT_INTERESTING;
5007     }
5008   
5009   /* Every other statement produces no useful ranges.  */
5010   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
5011     set_value_range_to_varying (get_value_range (def));
5012
5013   return SSA_PROP_VARYING;
5014 }
5015
5016 /* Helper that gets the value range of the SSA_NAME with version I
5017    or a symbolic range containing the SSA_NAME only if the value range
5018    is varying or undefined.  */
5019
5020 static inline value_range_t
5021 get_vr_for_comparison (int i)
5022 {
5023   value_range_t vr = *(vr_value[i]);
5024
5025   /* If name N_i does not have a valid range, use N_i as its own
5026      range.  This allows us to compare against names that may
5027      have N_i in their ranges.  */
5028   if (vr.type == VR_VARYING || vr.type == VR_UNDEFINED)
5029     {
5030       vr.type = VR_RANGE;
5031       vr.min = ssa_name (i);
5032       vr.max = ssa_name (i);
5033     }
5034
5035   return vr;
5036 }
5037
5038 /* Compare all the value ranges for names equivalent to VAR with VAL
5039    using comparison code COMP.  Return the same value returned by
5040    compare_range_with_value, including the setting of
5041    *STRICT_OVERFLOW_P.  */
5042
5043 static tree
5044 compare_name_with_value (enum tree_code comp, tree var, tree val,
5045                          bool *strict_overflow_p)
5046 {
5047   bitmap_iterator bi;
5048   unsigned i;
5049   bitmap e;
5050   tree retval, t;
5051   int used_strict_overflow;
5052   bool sop;
5053   value_range_t equiv_vr;
5054
5055   /* Get the set of equivalences for VAR.  */
5056   e = get_value_range (var)->equiv;
5057
5058   /* Start at -1.  Set it to 0 if we do a comparison without relying
5059      on overflow, or 1 if all comparisons rely on overflow.  */
5060   used_strict_overflow = -1;
5061
5062   /* Compare vars' value range with val.  */
5063   equiv_vr = get_vr_for_comparison (SSA_NAME_VERSION (var));
5064   sop = false;
5065   retval = compare_range_with_value (comp, &equiv_vr, val, &sop);
5066   if (retval)
5067     used_strict_overflow = sop ? 1 : 0;
5068
5069   /* If the equiv set is empty we have done all work we need to do.  */
5070   if (e == NULL)
5071     {
5072       if (retval
5073           && used_strict_overflow > 0)
5074         *strict_overflow_p = true;
5075       return retval;
5076     }
5077
5078   EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
5079     {
5080       equiv_vr = get_vr_for_comparison (i);
5081       sop = false;
5082       t = compare_range_with_value (comp, &equiv_vr, val, &sop);
5083       if (t)
5084         {
5085           /* If we get different answers from different members
5086              of the equivalence set this check must be in a dead
5087              code region.  Folding it to a trap representation
5088              would be correct here.  For now just return don't-know.  */
5089           if (retval != NULL
5090               && t != retval)
5091             {
5092               retval = NULL_TREE;
5093               break;
5094             }
5095           retval = t;
5096
5097           if (!sop)
5098             used_strict_overflow = 0;
5099           else if (used_strict_overflow < 0)
5100             used_strict_overflow = 1;
5101         }
5102     }
5103
5104   if (retval
5105       && used_strict_overflow > 0)
5106     *strict_overflow_p = true;
5107
5108   return retval;
5109 }
5110
5111
5112 /* Given a comparison code COMP and names N1 and N2, compare all the
5113    ranges equivalent to N1 against all the ranges equivalent to N2
5114    to determine the value of N1 COMP N2.  Return the same value
5115    returned by compare_ranges.  Set *STRICT_OVERFLOW_P to indicate
5116    whether we relied on an overflow infinity in the comparison.  */
5117
5118
5119 static tree
5120 compare_names (enum tree_code comp, tree n1, tree n2,
5121                bool *strict_overflow_p)
5122 {
5123   tree t, retval;
5124   bitmap e1, e2;
5125   bitmap_iterator bi1, bi2;
5126   unsigned i1, i2;
5127   int used_strict_overflow;
5128   static bitmap_obstack *s_obstack = NULL;
5129   static bitmap s_e1 = NULL, s_e2 = NULL;
5130
5131   /* Compare the ranges of every name equivalent to N1 against the
5132      ranges of every name equivalent to N2.  */
5133   e1 = get_value_range (n1)->equiv;
5134   e2 = get_value_range (n2)->equiv;
5135
5136   /* Use the fake bitmaps if e1 or e2 are not available.  */
5137   if (s_obstack == NULL)
5138     {
5139       s_obstack = XNEW (bitmap_obstack);
5140       bitmap_obstack_initialize (s_obstack);
5141       s_e1 = BITMAP_ALLOC (s_obstack);
5142       s_e2 = BITMAP_ALLOC (s_obstack);
5143     }
5144   if (e1 == NULL)
5145     e1 = s_e1;
5146   if (e2 == NULL)
5147     e2 = s_e2;
5148
5149   /* Add N1 and N2 to their own set of equivalences to avoid
5150      duplicating the body of the loop just to check N1 and N2
5151      ranges.  */
5152   bitmap_set_bit (e1, SSA_NAME_VERSION (n1));
5153   bitmap_set_bit (e2, SSA_NAME_VERSION (n2));
5154
5155   /* If the equivalence sets have a common intersection, then the two
5156      names can be compared without checking their ranges.  */
5157   if (bitmap_intersect_p (e1, e2))
5158     {
5159       bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
5160       bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
5161
5162       return (comp == EQ_EXPR || comp == GE_EXPR || comp == LE_EXPR)
5163              ? boolean_true_node
5164              : boolean_false_node;
5165     }
5166
5167   /* Start at -1.  Set it to 0 if we do a comparison without relying
5168      on overflow, or 1 if all comparisons rely on overflow.  */
5169   used_strict_overflow = -1;
5170
5171   /* Otherwise, compare all the equivalent ranges.  First, add N1 and
5172      N2 to their own set of equivalences to avoid duplicating the body
5173      of the loop just to check N1 and N2 ranges.  */
5174   EXECUTE_IF_SET_IN_BITMAP (e1, 0, i1, bi1)
5175     {
5176       value_range_t vr1 = get_vr_for_comparison (i1);
5177
5178       t = retval = NULL_TREE;
5179       EXECUTE_IF_SET_IN_BITMAP (e2, 0, i2, bi2)
5180         {
5181           bool sop = false;
5182
5183           value_range_t vr2 = get_vr_for_comparison (i2);
5184
5185           t = compare_ranges (comp, &vr1, &vr2, &sop);
5186           if (t)
5187             {
5188               /* If we get different answers from different members
5189                  of the equivalence set this check must be in a dead
5190                  code region.  Folding it to a trap representation
5191                  would be correct here.  For now just return don't-know.  */
5192               if (retval != NULL
5193                   && t != retval)
5194                 {
5195                   bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
5196                   bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
5197                   return NULL_TREE;
5198                 }
5199               retval = t;
5200
5201               if (!sop)
5202                 used_strict_overflow = 0;
5203               else if (used_strict_overflow < 0)
5204                 used_strict_overflow = 1;
5205             }
5206         }
5207
5208       if (retval)
5209         {
5210           bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
5211           bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
5212           if (used_strict_overflow > 0)
5213             *strict_overflow_p = true;
5214           return retval;
5215         }
5216     }
5217
5218   /* None of the equivalent ranges are useful in computing this
5219      comparison.  */
5220   bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
5221   bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
5222   return NULL_TREE;
5223 }
5224
5225 /* Helper function for vrp_evaluate_conditional_warnv. */
5226
5227 static tree
5228 vrp_evaluate_conditional_warnv_with_ops (enum tree_code code, tree op0,
5229                                          tree op1, bool use_equiv_p,
5230                                          bool *strict_overflow_p)
5231 {
5232   /* We only deal with integral and pointer types.  */
5233   if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
5234       && !POINTER_TYPE_P (TREE_TYPE (op0)))
5235     return NULL_TREE;
5236
5237   if (use_equiv_p)
5238     {
5239       if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME)
5240         return compare_names (code, op0, op1,
5241                               strict_overflow_p);
5242       else if (TREE_CODE (op0) == SSA_NAME)
5243         return compare_name_with_value (code, op0, op1,
5244                                         strict_overflow_p);
5245       else if (TREE_CODE (op1) == SSA_NAME)
5246         return (compare_name_with_value
5247                 (swap_tree_comparison (code), op1, op0,
5248                  strict_overflow_p));
5249     }
5250   else
5251     {
5252       value_range_t *vr0, *vr1;
5253
5254       vr0 = (TREE_CODE (op0) == SSA_NAME) ? get_value_range (op0) : NULL;
5255       vr1 = (TREE_CODE (op1) == SSA_NAME) ? get_value_range (op1) : NULL;
5256
5257       if (vr0 && vr1)
5258         return compare_ranges (code, vr0, vr1,
5259                                strict_overflow_p);
5260       else if (vr0 && vr1 == NULL)
5261         return compare_range_with_value (code, vr0, op1,
5262                                          strict_overflow_p);
5263       else if (vr0 == NULL && vr1)
5264         return (compare_range_with_value
5265                 (swap_tree_comparison (code), vr1, op0,
5266                  strict_overflow_p));
5267     }
5268   return NULL_TREE;
5269 }
5270
5271 /* Given (CODE OP0 OP1) within STMT, try to simplify it based on value range
5272    information.  Return NULL if the conditional can not be evaluated.
5273    The ranges of all the names equivalent with the operands in COND
5274    will be used when trying to compute the value.  If the result is
5275    based on undefined signed overflow, issue a warning if
5276    appropriate.  */
5277
5278 tree
5279 vrp_evaluate_conditional (enum tree_code code, tree op0, tree op1, tree stmt)
5280 {
5281   bool sop;
5282   tree ret;
5283
5284   sop = false;
5285   ret = vrp_evaluate_conditional_warnv_with_ops (code,
5286                                                  op0,
5287                                                  op1,
5288                                                  true,
5289                                                  &sop);
5290
5291   if (ret && sop)
5292     {
5293       enum warn_strict_overflow_code wc;
5294       const char* warnmsg;
5295
5296       if (is_gimple_min_invariant (ret))
5297         {
5298           wc = WARN_STRICT_OVERFLOW_CONDITIONAL;
5299           warnmsg = G_("assuming signed overflow does not occur when "
5300                        "simplifying conditional to constant");
5301         }
5302       else
5303         {
5304           wc = WARN_STRICT_OVERFLOW_COMPARISON;
5305           warnmsg = G_("assuming signed overflow does not occur when "
5306                        "simplifying conditional");
5307         }
5308
5309       if (issue_strict_overflow_warning (wc))
5310         {
5311           location_t locus;
5312
5313           if (!EXPR_HAS_LOCATION (stmt))
5314             locus = input_location;
5315           else
5316             locus = EXPR_LOCATION (stmt);
5317           warning (OPT_Wstrict_overflow, "%H%s", &locus, warnmsg);
5318         }
5319     }
5320
5321   if (warn_type_limits
5322       && ret
5323       && TREE_CODE_CLASS (code) == tcc_comparison
5324       && TREE_CODE (op0) == SSA_NAME)
5325     {
5326       /* If the comparison is being folded and the operand on the LHS
5327          is being compared against a constant value that is outside of
5328          the natural range of OP0's type, then the predicate will
5329          always fold regardless of the value of OP0.  If -Wtype-limits
5330          was specified, emit a warning.  */
5331       const char *warnmsg = NULL;
5332       tree type = TREE_TYPE (op0);
5333       value_range_t *vr0 = get_value_range (op0);
5334
5335       if (vr0->type != VR_VARYING
5336           && INTEGRAL_TYPE_P (type)
5337           && vrp_val_is_min (vr0->min)
5338           && vrp_val_is_max (vr0->max)
5339           && is_gimple_min_invariant (op1))
5340         {
5341           if (integer_zerop (ret))
5342             warnmsg = G_("comparison always false due to limited range of "
5343                          "data type");
5344           else
5345             warnmsg = G_("comparison always true due to limited range of "
5346                          "data type");
5347         }
5348
5349       if (warnmsg)
5350         {
5351           location_t locus;
5352
5353           if (!EXPR_HAS_LOCATION (stmt))
5354             locus = input_location;
5355           else
5356             locus = EXPR_LOCATION (stmt);
5357
5358           warning (OPT_Wtype_limits, "%H%s", &locus, warnmsg);
5359         }
5360     }
5361
5362   return ret;
5363 }
5364
5365
5366 /* Visit conditional statement STMT.  If we can determine which edge
5367    will be taken out of STMT's basic block, record it in
5368    *TAKEN_EDGE_P and return SSA_PROP_INTERESTING.  Otherwise, return
5369    SSA_PROP_VARYING.  */
5370
5371 static enum ssa_prop_result
5372 vrp_visit_cond_stmt (tree stmt, edge *taken_edge_p)
5373 {
5374   tree cond, val;
5375   bool sop;
5376
5377   *taken_edge_p = NULL;
5378   cond = COND_EXPR_COND (stmt);
5379
5380   if (dump_file && (dump_flags & TDF_DETAILS))
5381     {
5382       tree use;
5383       ssa_op_iter i;
5384
5385       fprintf (dump_file, "\nVisiting conditional with predicate: ");
5386       print_generic_expr (dump_file, cond, 0);
5387       fprintf (dump_file, "\nWith known ranges\n");
5388       
5389       FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
5390         {
5391           fprintf (dump_file, "\t");
5392           print_generic_expr (dump_file, use, 0);
5393           fprintf (dump_file, ": ");
5394           dump_value_range (dump_file, vr_value[SSA_NAME_VERSION (use)]);
5395         }
5396
5397       fprintf (dump_file, "\n");
5398     }
5399
5400   /* Compute the value of the predicate COND by checking the known
5401      ranges of each of its operands.
5402      
5403      Note that we cannot evaluate all the equivalent ranges here
5404      because those ranges may not yet be final and with the current
5405      propagation strategy, we cannot determine when the value ranges
5406      of the names in the equivalence set have changed.
5407
5408      For instance, given the following code fragment
5409
5410         i_5 = PHI <8, i_13>
5411         ...
5412         i_14 = ASSERT_EXPR <i_5, i_5 != 0>
5413         if (i_14 == 1)
5414           ...
5415
5416      Assume that on the first visit to i_14, i_5 has the temporary
5417      range [8, 8] because the second argument to the PHI function is
5418      not yet executable.  We derive the range ~[0, 0] for i_14 and the
5419      equivalence set { i_5 }.  So, when we visit 'if (i_14 == 1)' for
5420      the first time, since i_14 is equivalent to the range [8, 8], we
5421      determine that the predicate is always false.
5422
5423      On the next round of propagation, i_13 is determined to be
5424      VARYING, which causes i_5 to drop down to VARYING.  So, another
5425      visit to i_14 is scheduled.  In this second visit, we compute the
5426      exact same range and equivalence set for i_14, namely ~[0, 0] and
5427      { i_5 }.  But we did not have the previous range for i_5
5428      registered, so vrp_visit_assignment thinks that the range for
5429      i_14 has not changed.  Therefore, the predicate 'if (i_14 == 1)'
5430      is not visited again, which stops propagation from visiting
5431      statements in the THEN clause of that if().
5432
5433      To properly fix this we would need to keep the previous range
5434      value for the names in the equivalence set.  This way we would've
5435      discovered that from one visit to the other i_5 changed from
5436      range [8, 8] to VR_VARYING.
5437
5438      However, fixing this apparent limitation may not be worth the
5439      additional checking.  Testing on several code bases (GCC, DLV,
5440      MICO, TRAMP3D and SPEC2000) showed that doing this results in
5441      4 more predicates folded in SPEC.  */
5442   sop = false;
5443
5444   if (TREE_CODE (cond) == SSA_NAME)
5445     val = vrp_evaluate_conditional_warnv_with_ops (EQ_EXPR,
5446                                                    cond,
5447                                                    boolean_true_node,
5448                                                    false,
5449                                                    &sop);
5450   else
5451     val = vrp_evaluate_conditional_warnv_with_ops (TREE_CODE (cond),
5452                                                    TREE_OPERAND (cond, 0),
5453                                                    TREE_OPERAND (cond, 1),
5454                                                    false,
5455                                                    &sop);
5456   if (val)
5457     {
5458       if (!sop)
5459         *taken_edge_p = find_taken_edge (bb_for_stmt (stmt), val);
5460       else
5461         {
5462           if (dump_file && (dump_flags & TDF_DETAILS))
5463             fprintf (dump_file,
5464                      "\nIgnoring predicate evaluation because "
5465                      "it assumes that signed overflow is undefined");
5466           val = NULL_TREE;
5467         }
5468     }
5469
5470   if (dump_file && (dump_flags & TDF_DETAILS))
5471     {
5472       fprintf (dump_file, "\nPredicate evaluates to: ");
5473       if (val == NULL_TREE)
5474         fprintf (dump_file, "DON'T KNOW\n");
5475       else
5476         print_generic_stmt (dump_file, val, 0);
5477     }
5478
5479   return (*taken_edge_p) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
5480 }
5481
5482 /* Searches the case label vector VEC for the index *IDX of the CASE_LABEL
5483    that includes the value VAL.  The search is restricted to the range
5484    [START_IDX, n - 2] where n is the size of VEC (n - 1 is the default label).
5485
5486    If there is a CASE_LABEL for VAL, its index is placed in IDX and true is
5487    returned.
5488
5489    If there is no CASE_LABEL for VAL and the is one that is larger than VAL,
5490    it is placed in IDX and false is returned.
5491
5492    If VAL is larger than any CASE_LABEL, n - 1 is placed on IDX and false is
5493    returned. */
5494
5495 static bool
5496 find_case_label_index (tree vec, size_t start_idx, tree val, size_t *idx)
5497 {
5498   size_t n = TREE_VEC_LENGTH (vec);
5499   size_t low, high;
5500
5501   /* Find case label for minimum of the value range or the next one.
5502      At each iteration we are searching in [low, high - 1]. */
5503
5504   for (low = start_idx, high = n - 1; high != low; )
5505     {
5506       tree t;
5507       int cmp;
5508       /* Note that i != high, so we never ask for n - 1. */
5509       size_t i = (high + low) / 2;
5510       t = TREE_VEC_ELT (vec, i);
5511
5512       /* Cache the result of comparing CASE_LOW and val.  */
5513       cmp = tree_int_cst_compare (CASE_LOW (t), val);
5514
5515       if (cmp == 0)
5516         {
5517           /* Ranges cannot be empty. */
5518           *idx = i;
5519           return true;
5520         }
5521       else if (cmp > 0)
5522         high = i;
5523       else
5524         {
5525           low = i + 1;
5526           if (CASE_HIGH (t) != NULL
5527               && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
5528             {
5529               *idx = i;
5530               return true;
5531             }
5532         }
5533     }
5534
5535   *idx = high;
5536   return false;
5537 }
5538
5539 /* Searches the case label vector VEC for the range of CASE_LABELs that is used
5540    for values between MIN and MAX. The first index is placed in MIN_IDX. The
5541    last index is placed in MAX_IDX. If the range of CASE_LABELs is empty
5542    then MAX_IDX < MIN_IDX.
5543    Returns true if the default label is not needed. */
5544
5545 static bool
5546 find_case_label_range (tree vec, tree min, tree max, size_t *min_idx, size_t *max_idx)
5547 {
5548   size_t i, j;
5549   bool min_take_default = !find_case_label_index (vec, 0, min, &i);
5550   bool max_take_default = !find_case_label_index (vec, i, max, &j);
5551
5552   if (i == j
5553       && min_take_default
5554       && max_take_default)
5555     {
5556       /* Only the default case label reached. 
5557          Return an empty range. */
5558       *min_idx = 1;
5559       *max_idx = 0;
5560       return false;
5561     }
5562   else
5563     {
5564       bool take_default = min_take_default || max_take_default;
5565       tree low, high;
5566       size_t k;
5567
5568       if (max_take_default)
5569         j--;
5570
5571       /* If the case label range is continuous, we do not need
5572          the default case label.  Verify that.  */
5573       high = CASE_LOW (TREE_VEC_ELT (vec, i));
5574       if (CASE_HIGH (TREE_VEC_ELT (vec, i)))
5575         high = CASE_HIGH (TREE_VEC_ELT (vec, i));
5576       for (k = i + 1; k <= j; ++k)
5577         {
5578           low = CASE_LOW (TREE_VEC_ELT (vec, k));
5579           if (!integer_onep (int_const_binop (MINUS_EXPR, low, high, 0)))
5580             {
5581               take_default = true;
5582               break;
5583             }
5584           high = low;
5585           if (CASE_HIGH (TREE_VEC_ELT (vec, k)))
5586             high = CASE_HIGH (TREE_VEC_ELT (vec, k));
5587         }
5588
5589       *min_idx = i;
5590       *max_idx = j;
5591       return !take_default;
5592     }
5593 }
5594
5595 /* Visit switch statement STMT.  If we can determine which edge
5596    will be taken out of STMT's basic block, record it in
5597    *TAKEN_EDGE_P and return SSA_PROP_INTERESTING.  Otherwise, return
5598    SSA_PROP_VARYING.  */
5599
5600 static enum ssa_prop_result
5601 vrp_visit_switch_stmt (tree stmt, edge *taken_edge_p)
5602 {
5603   tree op, val;
5604   value_range_t *vr;
5605   size_t i = 0, j = 0, n;
5606   tree vec;
5607   bool take_default;
5608
5609   *taken_edge_p = NULL;
5610   op = TREE_OPERAND (stmt, 0);
5611   if (TREE_CODE (op) != SSA_NAME)
5612     return SSA_PROP_VARYING;
5613
5614   vr = get_value_range (op);
5615   if (dump_file && (dump_flags & TDF_DETAILS))
5616     {
5617       fprintf (dump_file, "\nVisiting switch expression with operand ");
5618       print_generic_expr (dump_file, op, 0);
5619       fprintf (dump_file, " with known range ");
5620       dump_value_range (dump_file, vr);
5621       fprintf (dump_file, "\n");
5622     }
5623
5624   if (vr->type != VR_RANGE
5625       || symbolic_range_p (vr))
5626     return SSA_PROP_VARYING;
5627
5628   /* Find the single edge that is taken from the switch expression.  */
5629   vec = SWITCH_LABELS (stmt);
5630   n = TREE_VEC_LENGTH (vec);
5631
5632   take_default = !find_case_label_range (vec, vr->min, vr->max, &i, &j);
5633
5634   /* Check if the range spans no CASE_LABEL. If so, we only reach the default
5635      label */
5636   if (j < i)
5637     {
5638       gcc_assert (take_default);
5639       val = TREE_VEC_ELT (vec, n - 1);
5640     }
5641   else
5642     {
5643       /* Check if labels with index i to j and maybe the default label
5644          are all reaching the same label.  */
5645
5646       val = TREE_VEC_ELT (vec, i);
5647       if (take_default
5648           && CASE_LABEL (TREE_VEC_ELT (vec, n - 1)) != CASE_LABEL (val))
5649         {
5650           if (dump_file && (dump_flags & TDF_DETAILS))
5651             fprintf (dump_file, "  not a single destination for this "
5652                      "range\n");
5653           return SSA_PROP_VARYING;
5654         }
5655       for (++i; i <= j; ++i)
5656         {
5657           if (CASE_LABEL (TREE_VEC_ELT (vec, i)) != CASE_LABEL (val))
5658             {
5659               if (dump_file && (dump_flags & TDF_DETAILS))
5660                 fprintf (dump_file, "  not a single destination for this "
5661                          "range\n");
5662               return SSA_PROP_VARYING;
5663             }
5664         }
5665     }
5666
5667   *taken_edge_p = find_edge (bb_for_stmt (stmt),
5668                              label_to_block (CASE_LABEL (val)));
5669
5670   if (dump_file && (dump_flags & TDF_DETAILS))
5671     {
5672       fprintf (dump_file, "  will take edge to ");
5673       print_generic_stmt (dump_file, CASE_LABEL (val), 0);
5674     }
5675
5676   return SSA_PROP_INTERESTING;
5677 }
5678
5679
5680 /* Evaluate statement STMT.  If the statement produces a useful range,
5681    return SSA_PROP_INTERESTING and record the SSA name with the
5682    interesting range into *OUTPUT_P.
5683
5684    If STMT is a conditional branch and we can determine its truth
5685    value, the taken edge is recorded in *TAKEN_EDGE_P.
5686
5687    If STMT produces a varying value, return SSA_PROP_VARYING.  */
5688
5689 static enum ssa_prop_result
5690 vrp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p)
5691 {
5692   tree def;
5693   ssa_op_iter iter;
5694   stmt_ann_t ann;
5695
5696   if (dump_file && (dump_flags & TDF_DETAILS))
5697     {
5698       fprintf (dump_file, "\nVisiting statement:\n");
5699       print_generic_stmt (dump_file, stmt, dump_flags);
5700       fprintf (dump_file, "\n");
5701     }
5702
5703   ann = stmt_ann (stmt);
5704   if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT)
5705     {
5706       tree rhs = GIMPLE_STMT_OPERAND (stmt, 1);
5707
5708       /* In general, assignments with virtual operands are not useful
5709          for deriving ranges, with the obvious exception of calls to
5710          builtin functions.  */
5711       if ((TREE_CODE (rhs) == CALL_EXPR
5712            && TREE_CODE (CALL_EXPR_FN (rhs)) == ADDR_EXPR
5713            && DECL_P (TREE_OPERAND (CALL_EXPR_FN (rhs), 0))
5714            && DECL_IS_BUILTIN (TREE_OPERAND (CALL_EXPR_FN (rhs), 0)))
5715           || ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
5716         return vrp_visit_assignment (stmt, output_p);
5717     }
5718   else if (TREE_CODE (stmt) == COND_EXPR)
5719     return vrp_visit_cond_stmt (stmt, taken_edge_p);
5720   else if (TREE_CODE (stmt) == SWITCH_EXPR)
5721     return vrp_visit_switch_stmt (stmt, taken_edge_p);
5722
5723   /* All other statements produce nothing of interest for VRP, so mark
5724      their outputs varying and prevent further simulation.  */
5725   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
5726     set_value_range_to_varying (get_value_range (def));
5727
5728   return SSA_PROP_VARYING;
5729 }
5730
5731
5732 /* Meet operation for value ranges.  Given two value ranges VR0 and
5733    VR1, store in VR0 a range that contains both VR0 and VR1.  This
5734    may not be the smallest possible such range.  */
5735
5736 static void
5737 vrp_meet (value_range_t *vr0, value_range_t *vr1)
5738 {
5739   if (vr0->type == VR_UNDEFINED)
5740     {
5741       copy_value_range (vr0, vr1);
5742       return;
5743     }
5744
5745   if (vr1->type == VR_UNDEFINED)
5746     {
5747       /* Nothing to do.  VR0 already has the resulting range.  */
5748       return;
5749     }
5750
5751   if (vr0->type == VR_VARYING)
5752     {
5753       /* Nothing to do.  VR0 already has the resulting range.  */
5754       return;
5755     }
5756
5757   if (vr1->type == VR_VARYING)
5758     {
5759       set_value_range_to_varying (vr0);
5760       return;
5761     }
5762
5763   if (vr0->type == VR_RANGE && vr1->type == VR_RANGE)
5764     {
5765       int cmp;
5766       tree min, max;
5767
5768       /* Compute the convex hull of the ranges.  The lower limit of
5769          the new range is the minimum of the two ranges.  If they
5770          cannot be compared, then give up.  */
5771       cmp = compare_values (vr0->min, vr1->min);
5772       if (cmp == 0 || cmp == 1)
5773         min = vr1->min;
5774       else if (cmp == -1)
5775         min = vr0->min;
5776       else
5777         goto give_up;
5778
5779       /* Similarly, the upper limit of the new range is the maximum
5780          of the two ranges.  If they cannot be compared, then
5781          give up.  */
5782       cmp = compare_values (vr0->max, vr1->max);
5783       if (cmp == 0 || cmp == -1)
5784         max = vr1->max;
5785       else if (cmp == 1)
5786         max = vr0->max;
5787       else
5788         goto give_up;
5789
5790       /* Check for useless ranges.  */
5791       if (INTEGRAL_TYPE_P (TREE_TYPE (min))
5792           && ((vrp_val_is_min (min) || is_overflow_infinity (min))
5793               && (vrp_val_is_max (max) || is_overflow_infinity (max))))
5794         goto give_up;
5795
5796       /* The resulting set of equivalences is the intersection of
5797          the two sets.  */
5798       if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
5799         bitmap_and_into (vr0->equiv, vr1->equiv);
5800       else if (vr0->equiv && !vr1->equiv)
5801         bitmap_clear (vr0->equiv);
5802
5803       set_value_range (vr0, vr0->type, min, max, vr0->equiv);
5804     }
5805   else if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
5806     {
5807       /* Two anti-ranges meet only if their complements intersect.
5808          Only handle the case of identical ranges.  */
5809       if (compare_values (vr0->min, vr1->min) == 0
5810           && compare_values (vr0->max, vr1->max) == 0
5811           && compare_values (vr0->min, vr0->max) == 0)
5812         {
5813           /* The resulting set of equivalences is the intersection of
5814              the two sets.  */
5815           if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
5816             bitmap_and_into (vr0->equiv, vr1->equiv);
5817           else if (vr0->equiv && !vr1->equiv)
5818             bitmap_clear (vr0->equiv);
5819         }
5820       else
5821         goto give_up;
5822     }
5823   else if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
5824     {
5825       /* For a numeric range [VAL1, VAL2] and an anti-range ~[VAL3, VAL4],
5826          only handle the case where the ranges have an empty intersection.
5827          The result of the meet operation is the anti-range.  */
5828       if (!symbolic_range_p (vr0)
5829           && !symbolic_range_p (vr1)
5830           && !value_ranges_intersect_p (vr0, vr1))
5831         {
5832           /* Copy most of VR1 into VR0.  Don't copy VR1's equivalence
5833              set.  We need to compute the intersection of the two
5834              equivalence sets.  */
5835           if (vr1->type == VR_ANTI_RANGE)
5836             set_value_range (vr0, vr1->type, vr1->min, vr1->max, vr0->equiv);
5837
5838           /* The resulting set of equivalences is the intersection of
5839              the two sets.  */
5840           if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
5841             bitmap_and_into (vr0->equiv, vr1->equiv);
5842           else if (vr0->equiv && !vr1->equiv)
5843             bitmap_clear (vr0->equiv);
5844         }
5845       else
5846         goto give_up;
5847     }
5848   else
5849     gcc_unreachable ();
5850
5851   return;
5852
5853 give_up:
5854   /* Failed to find an efficient meet.  Before giving up and setting
5855      the result to VARYING, see if we can at least derive a useful
5856      anti-range.  FIXME, all this nonsense about distinguishing
5857      anti-ranges from ranges is necessary because of the odd
5858      semantics of range_includes_zero_p and friends.  */
5859   if (!symbolic_range_p (vr0)
5860       && ((vr0->type == VR_RANGE && !range_includes_zero_p (vr0))
5861           || (vr0->type == VR_ANTI_RANGE && range_includes_zero_p (vr0)))
5862       && !symbolic_range_p (vr1)
5863       && ((vr1->type == VR_RANGE && !range_includes_zero_p (vr1))
5864           || (vr1->type == VR_ANTI_RANGE && range_includes_zero_p (vr1))))
5865     {
5866       set_value_range_to_nonnull (vr0, TREE_TYPE (vr0->min));
5867
5868       /* Since this meet operation did not result from the meeting of
5869          two equivalent names, VR0 cannot have any equivalences.  */
5870       if (vr0->equiv)
5871         bitmap_clear (vr0->equiv);
5872     }
5873   else
5874     set_value_range_to_varying (vr0);
5875 }
5876
5877
5878 /* Visit all arguments for PHI node PHI that flow through executable
5879    edges.  If a valid value range can be derived from all the incoming
5880    value ranges, set a new range for the LHS of PHI.  */
5881
5882 static enum ssa_prop_result
5883 vrp_visit_phi_node (tree phi)
5884 {
5885   int i;
5886   tree lhs = PHI_RESULT (phi);
5887   value_range_t *lhs_vr = get_value_range (lhs);
5888   value_range_t vr_result = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
5889   int edges, old_edges;
5890
5891   copy_value_range (&vr_result, lhs_vr);
5892
5893   if (dump_file && (dump_flags & TDF_DETAILS))
5894     {
5895       fprintf (dump_file, "\nVisiting PHI node: ");
5896       print_generic_expr (dump_file, phi, dump_flags);
5897     }
5898
5899   edges = 0;
5900   for (i = 0; i < PHI_NUM_ARGS (phi); i++)
5901     {
5902       edge e = PHI_ARG_EDGE (phi, i);
5903
5904       if (dump_file && (dump_flags & TDF_DETAILS))
5905         {
5906           fprintf (dump_file,
5907               "\n    Argument #%d (%d -> %d %sexecutable)\n",
5908               i, e->src->index, e->dest->index,
5909               (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
5910         }
5911
5912       if (e->flags & EDGE_EXECUTABLE)
5913         {
5914           tree arg = PHI_ARG_DEF (phi, i);
5915           value_range_t vr_arg;
5916
5917           ++edges;
5918
5919           if (TREE_CODE (arg) == SSA_NAME)
5920             {
5921               vr_arg = *(get_value_range (arg));
5922             }
5923           else
5924             {
5925               if (is_overflow_infinity (arg))
5926                 {
5927                   arg = copy_node (arg);
5928                   TREE_OVERFLOW (arg) = 0;
5929                 }
5930
5931               vr_arg.type = VR_RANGE;
5932               vr_arg.min = arg;
5933               vr_arg.max = arg;
5934               vr_arg.equiv = NULL;
5935             }
5936
5937           if (dump_file && (dump_flags & TDF_DETAILS))
5938             {
5939               fprintf (dump_file, "\t");
5940               print_generic_expr (dump_file, arg, dump_flags);
5941               fprintf (dump_file, "\n\tValue: ");
5942               dump_value_range (dump_file, &vr_arg);
5943               fprintf (dump_file, "\n");
5944             }
5945
5946           vrp_meet (&vr_result, &vr_arg);
5947
5948           if (vr_result.type == VR_VARYING)
5949             break;
5950         }
5951     }
5952
5953   if (vr_result.type == VR_VARYING)
5954     goto varying;
5955
5956   old_edges = vr_phi_edge_counts[SSA_NAME_VERSION (lhs)];
5957   vr_phi_edge_counts[SSA_NAME_VERSION (lhs)] = edges;
5958
5959   /* To prevent infinite iterations in the algorithm, derive ranges
5960      when the new value is slightly bigger or smaller than the
5961      previous one.  We don't do this if we have seen a new executable
5962      edge; this helps us avoid an overflow infinity for conditionals
5963      which are not in a loop.  */
5964   if (lhs_vr->type == VR_RANGE && vr_result.type == VR_RANGE
5965       && edges <= old_edges)
5966     {
5967       if (!POINTER_TYPE_P (TREE_TYPE (lhs)))
5968         {
5969           int cmp_min = compare_values (lhs_vr->min, vr_result.min);
5970           int cmp_max = compare_values (lhs_vr->max, vr_result.max);
5971
5972           /* If the new minimum is smaller or larger than the previous
5973              one, go all the way to -INF.  In the first case, to avoid
5974              iterating millions of times to reach -INF, and in the
5975              other case to avoid infinite bouncing between different
5976              minimums.  */
5977           if (cmp_min > 0 || cmp_min < 0)
5978             {
5979               /* If we will end up with a (-INF, +INF) range, set it
5980                  to VARYING.  */
5981               if (vrp_val_is_max (vr_result.max))
5982                 goto varying;
5983
5984               if (!needs_overflow_infinity (TREE_TYPE (vr_result.min))
5985                   || !vrp_var_may_overflow (lhs, phi))
5986                 vr_result.min = TYPE_MIN_VALUE (TREE_TYPE (vr_result.min));
5987               else if (supports_overflow_infinity (TREE_TYPE (vr_result.min)))
5988                 vr_result.min =
5989                   negative_overflow_infinity (TREE_TYPE (vr_result.min));
5990               else
5991                 goto varying;
5992             }
5993
5994           /* Similarly, if the new maximum is smaller or larger than
5995              the previous one, go all the way to +INF.  */
5996           if (cmp_max < 0 || cmp_max > 0)
5997             {
5998               /* If we will end up with a (-INF, +INF) range, set it
5999                  to VARYING.  */
6000               if (vrp_val_is_min (vr_result.min))
6001                 goto varying;
6002
6003               if (!needs_overflow_infinity (TREE_TYPE (vr_result.max))
6004                   || !vrp_var_may_overflow (lhs, phi))
6005                 vr_result.max = TYPE_MAX_VALUE (TREE_TYPE (vr_result.max));
6006               else if (supports_overflow_infinity (TREE_TYPE (vr_result.max)))
6007                 vr_result.max =
6008                   positive_overflow_infinity (TREE_TYPE (vr_result.max));
6009               else
6010                 goto varying;
6011             }
6012         }
6013     }
6014
6015   /* If the new range is different than the previous value, keep
6016      iterating.  */
6017   if (update_value_range (lhs, &vr_result))
6018     return SSA_PROP_INTERESTING;
6019
6020   /* Nothing changed, don't add outgoing edges.  */
6021   return SSA_PROP_NOT_INTERESTING;
6022
6023   /* No match found.  Set the LHS to VARYING.  */
6024 varying:
6025   set_value_range_to_varying (lhs_vr);
6026   return SSA_PROP_VARYING;
6027 }
6028
6029 /* Simplify a division or modulo operator to a right shift or
6030    bitwise and if the first operand is unsigned or is greater
6031    than zero and the second operand is an exact power of two.  */
6032
6033 static void
6034 simplify_div_or_mod_using_ranges (tree stmt, tree rhs, enum tree_code rhs_code)
6035 {
6036   tree val = NULL;
6037   tree op = TREE_OPERAND (rhs, 0);
6038   value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
6039
6040   if (TYPE_UNSIGNED (TREE_TYPE (op)))
6041     {
6042       val = integer_one_node;
6043     }
6044   else
6045     {
6046       bool sop = false;
6047
6048       val = compare_range_with_value (GE_EXPR, vr, integer_zero_node, &sop);
6049
6050       if (val
6051           && sop
6052           && integer_onep (val)
6053           && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
6054         {
6055           location_t locus;
6056
6057           if (!EXPR_HAS_LOCATION (stmt))
6058             locus = input_location;
6059           else
6060             locus = EXPR_LOCATION (stmt);
6061           warning (OPT_Wstrict_overflow,
6062                    ("%Hassuming signed overflow does not occur when "
6063                     "simplifying / or %% to >> or &"),
6064                    &locus);
6065         }
6066     }
6067
6068   if (val && integer_onep (val))
6069     {
6070       tree t;
6071       tree op0 = TREE_OPERAND (rhs, 0);
6072       tree op1 = TREE_OPERAND (rhs, 1);
6073
6074       if (rhs_code == TRUNC_DIV_EXPR)
6075         {
6076           t = build_int_cst (NULL_TREE, tree_log2 (op1));
6077           t = build2 (RSHIFT_EXPR, TREE_TYPE (op0), op0, t);
6078         }
6079       else
6080         {
6081           t = build_int_cst (TREE_TYPE (op1), 1);
6082           t = int_const_binop (MINUS_EXPR, op1, t, 0);
6083           t = fold_convert (TREE_TYPE (op0), t);
6084           t = build2 (BIT_AND_EXPR, TREE_TYPE (op0), op0, t);
6085         }
6086
6087       GIMPLE_STMT_OPERAND (stmt, 1) = t;
6088       update_stmt (stmt);
6089     }
6090 }
6091
6092 /* If the operand to an ABS_EXPR is >= 0, then eliminate the
6093    ABS_EXPR.  If the operand is <= 0, then simplify the
6094    ABS_EXPR into a NEGATE_EXPR.  */
6095
6096 static void
6097 simplify_abs_using_ranges (tree stmt, tree rhs)
6098 {
6099   tree val = NULL;
6100   tree op = TREE_OPERAND (rhs, 0);
6101   tree type = TREE_TYPE (op);
6102   value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
6103
6104   if (TYPE_UNSIGNED (type))
6105     {
6106       val = integer_zero_node;
6107     }
6108   else if (vr)
6109     {
6110       bool sop = false;
6111
6112       val = compare_range_with_value (LE_EXPR, vr, integer_zero_node, &sop);
6113       if (!val)
6114         {
6115           sop = false;
6116           val = compare_range_with_value (GE_EXPR, vr, integer_zero_node,
6117                                           &sop);
6118
6119           if (val)
6120             {
6121               if (integer_zerop (val))
6122                 val = integer_one_node;
6123               else if (integer_onep (val))
6124                 val = integer_zero_node;
6125             }
6126         }
6127
6128       if (val
6129           && (integer_onep (val) || integer_zerop (val)))
6130         {
6131           tree t;
6132
6133           if (sop && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
6134             {
6135               location_t locus;
6136
6137               if (!EXPR_HAS_LOCATION (stmt))
6138                 locus = input_location;
6139               else
6140                 locus = EXPR_LOCATION (stmt);
6141               warning (OPT_Wstrict_overflow,
6142                        ("%Hassuming signed overflow does not occur when "
6143                         "simplifying abs (X) to X or -X"),
6144                        &locus);
6145             }
6146
6147           if (integer_onep (val))
6148             t = build1 (NEGATE_EXPR, TREE_TYPE (op), op);
6149           else
6150             t = op;
6151
6152           GIMPLE_STMT_OPERAND (stmt, 1) = t;
6153           update_stmt (stmt);
6154         }
6155     }
6156 }
6157
6158 /* We are comparing trees OP0 and OP1 using COND_CODE.  OP0 has
6159    a known value range VR.
6160
6161    If there is one and only one value which will satisfy the
6162    conditional, then return that value.  Else return NULL.  */
6163
6164 static tree
6165 test_for_singularity (enum tree_code cond_code, tree op0,
6166                       tree op1, value_range_t *vr)
6167 {
6168   tree min = NULL;
6169   tree max = NULL;
6170
6171   /* Extract minimum/maximum values which satisfy the
6172      the conditional as it was written.  */
6173   if (cond_code == LE_EXPR || cond_code == LT_EXPR)
6174     {
6175       /* This should not be negative infinity; there is no overflow
6176          here.  */
6177       min = TYPE_MIN_VALUE (TREE_TYPE (op0));
6178
6179       max = op1;
6180       if (cond_code == LT_EXPR && !is_overflow_infinity (max))
6181         {
6182           tree one = build_int_cst (TREE_TYPE (op0), 1);
6183           max = fold_build2 (MINUS_EXPR, TREE_TYPE (op0), max, one);
6184           if (EXPR_P (max))
6185             TREE_NO_WARNING (max) = 1;
6186         }
6187     }
6188   else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
6189     {
6190       /* This should not be positive infinity; there is no overflow
6191          here.  */
6192       max = TYPE_MAX_VALUE (TREE_TYPE (op0));
6193
6194       min = op1;
6195       if (cond_code == GT_EXPR && !is_overflow_infinity (min))
6196         {
6197           tree one = build_int_cst (TREE_TYPE (op0), 1);
6198           min = fold_build2 (PLUS_EXPR, TREE_TYPE (op0), min, one);
6199           if (EXPR_P (min))
6200             TREE_NO_WARNING (min) = 1;
6201         }
6202     }
6203
6204   /* Now refine the minimum and maximum values using any
6205      value range information we have for op0.  */
6206   if (min && max)
6207     {
6208       if (compare_values (vr->min, min) == -1)
6209         min = min;
6210       else
6211         min = vr->min;
6212       if (compare_values (vr->max, max) == 1)
6213         max = max;
6214       else
6215         max = vr->max;
6216
6217       /* If the new min/max values have converged to a single value,
6218          then there is only one value which can satisfy the condition,
6219          return that value.  */
6220       if (operand_equal_p (min, max, 0) && is_gimple_min_invariant (min))
6221         return min;
6222     }
6223   return NULL;
6224 }
6225
6226 /* Simplify a conditional using a relational operator to an equality
6227    test if the range information indicates only one value can satisfy
6228    the original conditional.  */
6229
6230 static void
6231 simplify_cond_using_ranges (tree stmt)
6232 {
6233   tree cond = COND_EXPR_COND (stmt);
6234   tree op0 = TREE_OPERAND (cond, 0);
6235   tree op1 = TREE_OPERAND (cond, 1);
6236   enum tree_code cond_code = TREE_CODE (cond);
6237
6238   if (cond_code != NE_EXPR
6239       && cond_code != EQ_EXPR
6240       && TREE_CODE (op0) == SSA_NAME
6241       && INTEGRAL_TYPE_P (TREE_TYPE (op0))
6242       && is_gimple_min_invariant (op1))
6243     {
6244       value_range_t *vr = get_value_range (op0);
6245           
6246       /* If we have range information for OP0, then we might be
6247          able to simplify this conditional. */
6248       if (vr->type == VR_RANGE)
6249         {
6250           tree new = test_for_singularity (cond_code, op0, op1, vr);
6251
6252           if (new)
6253             {
6254               if (dump_file)
6255                 {
6256                   fprintf (dump_file, "Simplified relational ");
6257                   print_generic_expr (dump_file, cond, 0);
6258                   fprintf (dump_file, " into ");
6259                 }
6260
6261               COND_EXPR_COND (stmt)
6262                 = build2 (EQ_EXPR, boolean_type_node, op0, new);
6263               update_stmt (stmt);
6264
6265               if (dump_file)
6266                 {
6267                   print_generic_expr (dump_file, COND_EXPR_COND (stmt), 0);
6268                   fprintf (dump_file, "\n");
6269                 }
6270               return;
6271
6272             }
6273
6274           /* Try again after inverting the condition.  We only deal
6275              with integral types here, so no need to worry about
6276              issues with inverting FP comparisons.  */
6277           cond_code = invert_tree_comparison (cond_code, false);
6278           new = test_for_singularity (cond_code, op0, op1, vr);
6279
6280           if (new)
6281             {
6282               if (dump_file)
6283                 {
6284                   fprintf (dump_file, "Simplified relational ");
6285                   print_generic_expr (dump_file, cond, 0);
6286                   fprintf (dump_file, " into ");
6287                 }
6288
6289               COND_EXPR_COND (stmt)
6290                 = build2 (NE_EXPR, boolean_type_node, op0, new);
6291               update_stmt (stmt);
6292
6293               if (dump_file)
6294                 {
6295                   print_generic_expr (dump_file, COND_EXPR_COND (stmt), 0);
6296                   fprintf (dump_file, "\n");
6297                 }
6298               return;
6299
6300             }
6301         }
6302     }
6303 }
6304
6305 /* Simplify a switch statement using the value range of the switch
6306    argument.  */
6307
6308 static void
6309 simplify_switch_using_ranges (tree stmt)
6310 {
6311   tree op = TREE_OPERAND (stmt, 0);
6312   value_range_t *vr;
6313   bool take_default;
6314   edge e;
6315   edge_iterator ei;
6316   size_t i = 0, j = 0, n, n2;
6317   tree vec, vec2;
6318   switch_update su;
6319
6320   if (TREE_CODE (op) != SSA_NAME)
6321     return;
6322
6323   vr = get_value_range (op);
6324
6325   /* We can only handle integer ranges.  */
6326   if (vr->type != VR_RANGE
6327       || symbolic_range_p (vr))
6328     return;
6329
6330   /* Find case label for min/max of the value range.  */
6331   vec = SWITCH_LABELS (stmt);
6332   n = TREE_VEC_LENGTH (vec);
6333   take_default = !find_case_label_range (vec, vr->min, vr->max, &i, &j);
6334
6335   /* Bail out if this is just all edges taken.  */
6336   if (i == 0
6337       && j == n - 2
6338       && take_default)
6339     return;
6340
6341   /* Build a new vector of taken case labels.  */
6342   vec2 = make_tree_vec (j - i + 1 + (int)take_default);
6343   for (n2 = 0; i <= j; ++i, ++n2)
6344     TREE_VEC_ELT (vec2, n2) = TREE_VEC_ELT (vec, i);
6345
6346   /* Add the default edge, if necessary.  */
6347   if (take_default)
6348     TREE_VEC_ELT (vec2, n2++) = TREE_VEC_ELT (vec, n - 1);
6349
6350   /* Mark needed edges.  */
6351   for (i = 0; i < n2; ++i)
6352     {
6353       e = find_edge (bb_for_stmt (stmt),
6354                      label_to_block (CASE_LABEL (TREE_VEC_ELT (vec2, i))));
6355       e->aux = (void *)-1;
6356     }
6357
6358   /* Queue not needed edges for later removal.  */
6359   FOR_EACH_EDGE (e, ei, bb_for_stmt (stmt)->succs)
6360     {
6361       if (e->aux == (void *)-1)
6362         {
6363           e->aux = NULL;
6364           continue;
6365         }
6366
6367       if (dump_file && (dump_flags & TDF_DETAILS))
6368         {
6369           fprintf (dump_file, "removing unreachable case label\n");
6370         }
6371       VEC_safe_push (edge, heap, to_remove_edges, e);
6372     }
6373
6374   /* And queue an update for the stmt.  */
6375   su.stmt = stmt;
6376   su.vec = vec2;
6377   VEC_safe_push (switch_update, heap, to_update_switch_stmts, &su);
6378 }
6379
6380 /* Simplify STMT using ranges if possible.  */
6381
6382 void
6383 simplify_stmt_using_ranges (tree stmt)
6384 {
6385   if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT)
6386     {
6387       tree rhs = GIMPLE_STMT_OPERAND (stmt, 1);
6388       enum tree_code rhs_code = TREE_CODE (rhs);
6389
6390       /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
6391          and BIT_AND_EXPR respectively if the first operand is greater
6392          than zero and the second operand is an exact power of two.  */
6393       if ((rhs_code == TRUNC_DIV_EXPR || rhs_code == TRUNC_MOD_EXPR)
6394           && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0)))
6395           && integer_pow2p (TREE_OPERAND (rhs, 1)))
6396         simplify_div_or_mod_using_ranges (stmt, rhs, rhs_code);
6397
6398       /* Transform ABS (X) into X or -X as appropriate.  */
6399       if (rhs_code == ABS_EXPR
6400           && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME
6401           && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0))))
6402         simplify_abs_using_ranges (stmt, rhs);
6403     }
6404   else if (TREE_CODE (stmt) == COND_EXPR
6405            && COMPARISON_CLASS_P (COND_EXPR_COND (stmt)))
6406     simplify_cond_using_ranges (stmt);
6407   else if (TREE_CODE (stmt) == SWITCH_EXPR)
6408     simplify_switch_using_ranges (stmt);
6409 }
6410
6411 /* Stack of dest,src equivalency pairs that need to be restored after
6412    each attempt to thread a block's incoming edge to an outgoing edge. 
6413
6414    A NULL entry is used to mark the end of pairs which need to be
6415    restored.  */
6416 static VEC(tree,heap) *stack;
6417
6418 /* A trivial wrapper so that we can present the generic jump threading
6419    code with a simple API for simplifying statements.  STMT is the
6420    statement we want to simplify, WITHIN_STMT provides the location
6421    for any overflow warnings.  */
6422
6423 static tree
6424 simplify_stmt_for_jump_threading (tree stmt, tree within_stmt)
6425 {
6426   tree conditional;
6427   /* We only use VRP information to simplify conditionals.  This is
6428      overly conservative, but it's unclear if doing more would be
6429      worth the compile time cost.  */
6430   if (TREE_CODE (stmt) != COND_EXPR)
6431     return NULL;
6432
6433   conditional = COND_EXPR_COND (stmt);
6434   if (TREE_CODE (conditional) == SSA_NAME)
6435     return vrp_evaluate_conditional (EQ_EXPR,
6436                                      conditional,
6437                                      boolean_true_node,
6438                                      within_stmt);
6439   else
6440     return vrp_evaluate_conditional (TREE_CODE (conditional),
6441                                      TREE_OPERAND (conditional, 0),
6442                                      TREE_OPERAND (conditional, 1),
6443                                      within_stmt);
6444 }
6445
6446 /* Blocks which have more than one predecessor and more than
6447    one successor present jump threading opportunities.  ie,
6448    when the block is reached from a specific predecessor, we
6449    may be able to determine which of the outgoing edges will
6450    be traversed.  When this optimization applies, we are able
6451    to avoid conditionals at runtime and we may expose secondary
6452    optimization opportunities.
6453
6454    This routine is effectively a driver for the generic jump
6455    threading code.  It basically just presents the generic code
6456    with edges that may be suitable for jump threading.
6457
6458    Unlike DOM, we do not iterate VRP if jump threading was successful.
6459    While iterating may expose new opportunities for VRP, it is expected
6460    those opportunities would be very limited and the compile time cost
6461    to expose those opportunities would be significant. 
6462
6463    As jump threading opportunities are discovered, they are registered
6464    for later realization.  */
6465
6466 static void
6467 identify_jump_threads (void)
6468 {
6469   basic_block bb;
6470   tree dummy;
6471   int i;
6472   edge e;
6473
6474   /* Ugh.  When substituting values earlier in this pass we can
6475      wipe the dominance information.  So rebuild the dominator
6476      information as we need it within the jump threading code.  */
6477   calculate_dominance_info (CDI_DOMINATORS);
6478
6479   /* We do not allow VRP information to be used for jump threading
6480      across a back edge in the CFG.  Otherwise it becomes too
6481      difficult to avoid eliminating loop exit tests.  Of course
6482      EDGE_DFS_BACK is not accurate at this time so we have to
6483      recompute it.  */
6484   mark_dfs_back_edges ();
6485
6486   /* Do not thread across edges we are about to remove.  Just marking
6487      them as EDGE_DFS_BACK will do.  */
6488   for (i = 0; VEC_iterate (edge, to_remove_edges, i, e); ++i)
6489     e->flags |= EDGE_DFS_BACK;
6490
6491   /* Allocate our unwinder stack to unwind any temporary equivalences
6492      that might be recorded.  */
6493   stack = VEC_alloc (tree, heap, 20);
6494
6495   /* To avoid lots of silly node creation, we create a single
6496      conditional and just modify it in-place when attempting to
6497      thread jumps.  */
6498   dummy = build2 (EQ_EXPR, boolean_type_node, NULL, NULL);
6499   dummy = build3 (COND_EXPR, void_type_node, dummy, NULL, NULL);
6500
6501   /* Walk through all the blocks finding those which present a
6502      potential jump threading opportunity.  We could set this up
6503      as a dominator walker and record data during the walk, but
6504      I doubt it's worth the effort for the classes of jump
6505      threading opportunities we are trying to identify at this
6506      point in compilation.  */
6507   FOR_EACH_BB (bb)
6508     {
6509       tree last, cond;
6510
6511       /* If the generic jump threading code does not find this block
6512          interesting, then there is nothing to do.  */
6513       if (! potentially_threadable_block (bb))
6514         continue;
6515
6516       /* We only care about blocks ending in a COND_EXPR.  While there
6517          may be some value in handling SWITCH_EXPR here, I doubt it's
6518          terribly important.  */
6519       last = bsi_stmt (bsi_last (bb));
6520       if (TREE_CODE (last) != COND_EXPR)
6521         continue;
6522
6523       /* We're basically looking for any kind of conditional with
6524          integral type arguments.  */
6525       cond = COND_EXPR_COND (last);
6526       if ((TREE_CODE (cond) == SSA_NAME
6527            && INTEGRAL_TYPE_P (TREE_TYPE (cond)))
6528           || (COMPARISON_CLASS_P (cond)
6529               && TREE_CODE (TREE_OPERAND (cond, 0)) == SSA_NAME
6530               && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (cond, 0)))
6531               && (TREE_CODE (TREE_OPERAND (cond, 1)) == SSA_NAME
6532                   || is_gimple_min_invariant (TREE_OPERAND (cond, 1)))
6533               && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (cond, 1)))))
6534         {
6535           edge_iterator ei;
6536
6537           /* We've got a block with multiple predecessors and multiple
6538              successors which also ends in a suitable conditional.  For
6539              each predecessor, see if we can thread it to a specific
6540              successor.  */
6541           FOR_EACH_EDGE (e, ei, bb->preds)
6542             {
6543               /* Do not thread across back edges or abnormal edges
6544                  in the CFG.  */
6545               if (e->flags & (EDGE_DFS_BACK | EDGE_COMPLEX))
6546                 continue;
6547
6548               thread_across_edge (dummy, e, true,
6549                                   &stack,
6550                                   simplify_stmt_for_jump_threading);
6551             }
6552         }
6553     }
6554
6555   /* We do not actually update the CFG or SSA graphs at this point as
6556      ASSERT_EXPRs are still in the IL and cfg cleanup code does not yet
6557      handle ASSERT_EXPRs gracefully.  */
6558 }
6559
6560 /* We identified all the jump threading opportunities earlier, but could
6561    not transform the CFG at that time.  This routine transforms the
6562    CFG and arranges for the dominator tree to be rebuilt if necessary.
6563
6564    Note the SSA graph update will occur during the normal TODO
6565    processing by the pass manager.  */
6566 static void
6567 finalize_jump_threads (void)
6568 {
6569   thread_through_all_blocks (false);
6570   VEC_free (tree, heap, stack);
6571 }
6572
6573
6574 /* Traverse all the blocks folding conditionals with known ranges.  */
6575
6576 static void
6577 vrp_finalize (void)
6578 {
6579   size_t i;
6580   prop_value_t *single_val_range;
6581   bool do_value_subst_p;
6582
6583   if (dump_file)
6584     {
6585       fprintf (dump_file, "\nValue ranges after VRP:\n\n");
6586       dump_all_value_ranges (dump_file);
6587       fprintf (dump_file, "\n");
6588     }
6589
6590   /* We may have ended with ranges that have exactly one value.  Those
6591      values can be substituted as any other copy/const propagated
6592      value using substitute_and_fold.  */
6593   single_val_range = XCNEWVEC (prop_value_t, num_ssa_names);
6594
6595   do_value_subst_p = false;
6596   for (i = 0; i < num_ssa_names; i++)
6597     if (vr_value[i]
6598         && vr_value[i]->type == VR_RANGE
6599         && vr_value[i]->min == vr_value[i]->max)
6600       {
6601         single_val_range[i].value = vr_value[i]->min;
6602         do_value_subst_p = true;
6603       }
6604
6605   if (!do_value_subst_p)
6606     {
6607       /* We found no single-valued ranges, don't waste time trying to
6608          do single value substitution in substitute_and_fold.  */
6609       free (single_val_range);
6610       single_val_range = NULL;
6611     }
6612
6613   substitute_and_fold (single_val_range, true);
6614
6615   if (warn_array_bounds)
6616       check_all_array_refs ();
6617
6618   /* We must identify jump threading opportunities before we release
6619      the datastructures built by VRP.  */
6620   identify_jump_threads ();
6621
6622   /* Free allocated memory.  */
6623   for (i = 0; i < num_ssa_names; i++)
6624     if (vr_value[i])
6625       {
6626         BITMAP_FREE (vr_value[i]->equiv);
6627         free (vr_value[i]);
6628       }
6629
6630   free (single_val_range);
6631   free (vr_value);
6632   free (vr_phi_edge_counts);
6633
6634   /* So that we can distinguish between VRP data being available
6635      and not available.  */
6636   vr_value = NULL;
6637   vr_phi_edge_counts = NULL;
6638 }
6639
6640 /* Calculates number of iterations for all loops, to ensure that they are
6641    cached.  */
6642
6643 static void
6644 record_numbers_of_iterations (void)
6645 {
6646   loop_iterator li;
6647   struct loop *loop;
6648
6649   FOR_EACH_LOOP (li, loop, 0)
6650     {
6651       number_of_latch_executions (loop);
6652     }
6653 }
6654
6655 /* Main entry point to VRP (Value Range Propagation).  This pass is
6656    loosely based on J. R. C. Patterson, ``Accurate Static Branch
6657    Prediction by Value Range Propagation,'' in SIGPLAN Conference on
6658    Programming Language Design and Implementation, pp. 67-78, 1995.
6659    Also available at http://citeseer.ist.psu.edu/patterson95accurate.html
6660
6661    This is essentially an SSA-CCP pass modified to deal with ranges
6662    instead of constants.
6663
6664    While propagating ranges, we may find that two or more SSA name
6665    have equivalent, though distinct ranges.  For instance,
6666
6667      1  x_9 = p_3->a;
6668      2  p_4 = ASSERT_EXPR <p_3, p_3 != 0>
6669      3  if (p_4 == q_2)
6670      4    p_5 = ASSERT_EXPR <p_4, p_4 == q_2>;
6671      5  endif
6672      6  if (q_2)
6673         
6674    In the code above, pointer p_5 has range [q_2, q_2], but from the
6675    code we can also determine that p_5 cannot be NULL and, if q_2 had
6676    a non-varying range, p_5's range should also be compatible with it.
6677
6678    These equivalences are created by two expressions: ASSERT_EXPR and
6679    copy operations.  Since p_5 is an assertion on p_4, and p_4 was the
6680    result of another assertion, then we can use the fact that p_5 and
6681    p_4 are equivalent when evaluating p_5's range.
6682
6683    Together with value ranges, we also propagate these equivalences
6684    between names so that we can take advantage of information from
6685    multiple ranges when doing final replacement.  Note that this
6686    equivalency relation is transitive but not symmetric.
6687    
6688    In the example above, p_5 is equivalent to p_4, q_2 and p_3, but we
6689    cannot assert that q_2 is equivalent to p_5 because q_2 may be used
6690    in contexts where that assertion does not hold (e.g., in line 6).
6691
6692    TODO, the main difference between this pass and Patterson's is that
6693    we do not propagate edge probabilities.  We only compute whether
6694    edges can be taken or not.  That is, instead of having a spectrum
6695    of jump probabilities between 0 and 1, we only deal with 0, 1 and
6696    DON'T KNOW.  In the future, it may be worthwhile to propagate
6697    probabilities to aid branch prediction.  */
6698
6699 static unsigned int
6700 execute_vrp (void)
6701 {
6702   int i;
6703   edge e;
6704   switch_update *su;
6705
6706   loop_optimizer_init (LOOPS_NORMAL | LOOPS_HAVE_RECORDED_EXITS);
6707   rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
6708   scev_initialize ();
6709
6710   insert_range_assertions ();
6711
6712   /* Compute the # of iterations for each loop before we start the VRP
6713      analysis.  The value ranges determined by VRP are used in expression
6714      simplification, that is also used by the # of iterations analysis.
6715      However, in the middle of the VRP analysis, the value ranges do not take
6716      all the possible paths in CFG into account, so they do not have to be
6717      correct, and the # of iterations analysis can obtain wrong results.
6718      This is a problem, since the results of the # of iterations analysis
6719      are cached, so these mistakes would not be corrected when the value
6720      ranges are corrected.  */
6721   record_numbers_of_iterations ();
6722
6723   to_remove_edges = VEC_alloc (edge, heap, 10);
6724   to_update_switch_stmts = VEC_alloc (switch_update, heap, 5);
6725
6726   vrp_initialize ();
6727   ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
6728   vrp_finalize ();
6729
6730   /* ASSERT_EXPRs must be removed before finalizing jump threads
6731      as finalizing jump threads calls the CFG cleanup code which
6732      does not properly handle ASSERT_EXPRs.  */
6733   remove_range_assertions ();
6734
6735   /* If we exposed any new variables, go ahead and put them into
6736      SSA form now, before we handle jump threading.  This simplifies
6737      interactions between rewriting of _DECL nodes into SSA form
6738      and rewriting SSA_NAME nodes into SSA form after block
6739      duplication and CFG manipulation.  */
6740   update_ssa (TODO_update_ssa);
6741
6742   finalize_jump_threads ();
6743
6744   /* Remove dead edges from SWITCH_EXPR optimization.  This leaves the
6745      CFG in a broken state and requires a cfg_cleanup run.  */
6746   for (i = 0; VEC_iterate (edge, to_remove_edges, i, e); ++i)
6747     remove_edge (e);
6748   /* Update SWITCH_EXPR case label vector.  */
6749   for (i = 0; VEC_iterate (switch_update, to_update_switch_stmts, i, su); ++i)
6750     SWITCH_LABELS (su->stmt) = su->vec;
6751
6752   if (VEC_length (edge, to_remove_edges) > 0)
6753     free_dominance_info (CDI_DOMINATORS);
6754
6755   VEC_free (edge, heap, to_remove_edges);
6756   VEC_free (switch_update, heap, to_update_switch_stmts);
6757
6758   scev_finalize ();
6759   loop_optimizer_finalize ();
6760
6761   return 0;
6762 }
6763
6764 static bool
6765 gate_vrp (void)
6766 {
6767   return flag_tree_vrp != 0;
6768 }
6769
6770 struct gimple_opt_pass pass_vrp =
6771 {
6772  {
6773   GIMPLE_PASS,
6774   "vrp",                                /* name */
6775   gate_vrp,                             /* gate */
6776   execute_vrp,                          /* execute */
6777   NULL,                                 /* sub */
6778   NULL,                                 /* next */
6779   0,                                    /* static_pass_number */
6780   TV_TREE_VRP,                          /* tv_id */
6781   PROP_ssa | PROP_alias,                /* properties_required */
6782   0,                                    /* properties_provided */
6783   0,                                    /* properties_destroyed */
6784   0,                                    /* todo_flags_start */
6785   TODO_cleanup_cfg
6786     | TODO_ggc_collect
6787     | TODO_verify_ssa
6788     | TODO_dump_func
6789     | TODO_update_ssa                   /* todo_flags_finish */
6790  }
6791 };