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