OSDN Git Service

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