OSDN Git Service

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