OSDN Git Service

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