OSDN Git Service

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