OSDN Git Service

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