OSDN Git Service

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