OSDN Git Service

2a51de7ba43bce43be90b1e67a4be1ef179e5d03
[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               && (!is_overflow_infinity (new_min)
2212                   || !is_overflow_infinity (new_max))
2213               && (cmp = compare_values (new_min, new_max)) <= 0
2214               && cmp >= -1)
2215             {
2216               set_value_range (vr, VR_RANGE, new_min, new_max, vr->equiv);
2217               return;
2218             }
2219         }
2220
2221       /* When converting types of different sizes, set the result to
2222          VARYING.  Things like sign extensions and precision loss may
2223          change the range.  For instance, if x_3 is of type 'long long
2224          int' and 'y_5 = (unsigned short) x_3', if x_3 is ~[0, 0], it
2225          is impossible to know at compile time whether y_5 will be
2226          ~[0, 0].  */
2227       if (TYPE_SIZE (inner_type) != TYPE_SIZE (outer_type)
2228           || TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
2229         {
2230           set_value_range_to_varying (vr);
2231           return;
2232         }
2233     }
2234
2235   /* Conversion of a VR_VARYING value to a wider type can result
2236      in a usable range.  So wait until after we've handled conversions
2237      before dropping the result to VR_VARYING if we had a source
2238      operand that is VR_VARYING.  */
2239   if (vr0.type == VR_VARYING)
2240     {
2241       set_value_range_to_varying (vr);
2242       return;
2243     }
2244
2245   /* Apply the operation to each end of the range and see what we end
2246      up with.  */
2247   if (code == NEGATE_EXPR
2248       && !TYPE_UNSIGNED (TREE_TYPE (expr)))
2249     {
2250       /* NEGATE_EXPR flips the range around.  We need to treat
2251          TYPE_MIN_VALUE specially.  */
2252       if (is_positive_overflow_infinity (vr0.max))
2253         min = negative_overflow_infinity (TREE_TYPE (expr));
2254       else if (is_negative_overflow_infinity (vr0.max))
2255         min = positive_overflow_infinity (TREE_TYPE (expr));
2256       else if (!vrp_val_is_min (vr0.max))
2257         min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
2258       else if (needs_overflow_infinity (TREE_TYPE (expr)))
2259         {
2260           if (supports_overflow_infinity (TREE_TYPE (expr))
2261               && !is_overflow_infinity (vr0.min)
2262               && !vrp_val_is_min (vr0.min))
2263             min = positive_overflow_infinity (TREE_TYPE (expr));
2264           else
2265             {
2266               set_value_range_to_varying (vr);
2267               return;
2268             }
2269         }
2270       else
2271         min = TYPE_MIN_VALUE (TREE_TYPE (expr));
2272
2273       if (is_positive_overflow_infinity (vr0.min))
2274         max = negative_overflow_infinity (TREE_TYPE (expr));
2275       else if (is_negative_overflow_infinity (vr0.min))
2276         max = positive_overflow_infinity (TREE_TYPE (expr));
2277       else if (!vrp_val_is_min (vr0.min))
2278         max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
2279       else if (needs_overflow_infinity (TREE_TYPE (expr)))
2280         {
2281           if (supports_overflow_infinity (TREE_TYPE (expr)))
2282             max = positive_overflow_infinity (TREE_TYPE (expr));
2283           else
2284             {
2285               set_value_range_to_varying (vr);
2286               return;
2287             }
2288         }
2289       else
2290         max = TYPE_MIN_VALUE (TREE_TYPE (expr));
2291     }
2292   else if (code == NEGATE_EXPR
2293            && TYPE_UNSIGNED (TREE_TYPE (expr)))
2294     {
2295       if (!range_includes_zero_p (&vr0))
2296         {
2297           max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
2298           min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
2299         }
2300       else
2301         {
2302           if (range_is_null (&vr0))
2303             set_value_range_to_null (vr, TREE_TYPE (expr));
2304           else
2305             set_value_range_to_varying (vr);
2306           return;
2307         }
2308     }
2309   else if (code == ABS_EXPR
2310            && !TYPE_UNSIGNED (TREE_TYPE (expr)))
2311     {
2312       /* -TYPE_MIN_VALUE = TYPE_MIN_VALUE with flag_wrapv so we can't get a
2313          useful range.  */
2314       if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (expr))
2315           && ((vr0.type == VR_RANGE
2316                && vrp_val_is_min (vr0.min))
2317               || (vr0.type == VR_ANTI_RANGE
2318                   && !vrp_val_is_min (vr0.min)
2319                   && !range_includes_zero_p (&vr0))))
2320         {
2321           set_value_range_to_varying (vr);
2322           return;
2323         }
2324         
2325       /* ABS_EXPR may flip the range around, if the original range
2326          included negative values.  */
2327       if (is_overflow_infinity (vr0.min))
2328         min = positive_overflow_infinity (TREE_TYPE (expr));
2329       else if (!vrp_val_is_min (vr0.min))
2330         min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
2331       else if (!needs_overflow_infinity (TREE_TYPE (expr)))
2332         min = TYPE_MAX_VALUE (TREE_TYPE (expr));
2333       else if (supports_overflow_infinity (TREE_TYPE (expr)))
2334         min = positive_overflow_infinity (TREE_TYPE (expr));
2335       else
2336         {
2337           set_value_range_to_varying (vr);
2338           return;
2339         }
2340
2341       if (is_overflow_infinity (vr0.max))
2342         max = positive_overflow_infinity (TREE_TYPE (expr));
2343       else if (!vrp_val_is_min (vr0.max))
2344         max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
2345       else if (!needs_overflow_infinity (TREE_TYPE (expr)))
2346         max = TYPE_MAX_VALUE (TREE_TYPE (expr));
2347       else if (supports_overflow_infinity (TREE_TYPE (expr)))
2348         max = positive_overflow_infinity (TREE_TYPE (expr));
2349       else
2350         {
2351           set_value_range_to_varying (vr);
2352           return;
2353         }
2354
2355       cmp = compare_values (min, max);
2356
2357       /* If a VR_ANTI_RANGEs contains zero, then we have
2358          ~[-INF, min(MIN, MAX)].  */
2359       if (vr0.type == VR_ANTI_RANGE)
2360         { 
2361           if (range_includes_zero_p (&vr0))
2362             {
2363               /* Take the lower of the two values.  */
2364               if (cmp != 1)
2365                 max = min;
2366
2367               /* Create ~[-INF, min (abs(MIN), abs(MAX))]
2368                  or ~[-INF + 1, min (abs(MIN), abs(MAX))] when
2369                  flag_wrapv is set and the original anti-range doesn't include
2370                  TYPE_MIN_VALUE, remember -TYPE_MIN_VALUE = TYPE_MIN_VALUE.  */
2371               if (TYPE_OVERFLOW_WRAPS (TREE_TYPE (expr)))
2372                 {
2373                   tree type_min_value = TYPE_MIN_VALUE (TREE_TYPE (expr));
2374
2375                   min = (vr0.min != type_min_value
2376                          ? int_const_binop (PLUS_EXPR, type_min_value,
2377                                             integer_one_node, 0)
2378                          : type_min_value);
2379                 }
2380               else
2381                 {
2382                   if (overflow_infinity_range_p (&vr0))
2383                     min = negative_overflow_infinity (TREE_TYPE (expr));
2384                   else
2385                     min = TYPE_MIN_VALUE (TREE_TYPE (expr));
2386                 }
2387             }
2388           else
2389             {
2390               /* All else has failed, so create the range [0, INF], even for
2391                  flag_wrapv since TYPE_MIN_VALUE is in the original
2392                  anti-range.  */
2393               vr0.type = VR_RANGE;
2394               min = build_int_cst (TREE_TYPE (expr), 0);
2395               if (needs_overflow_infinity (TREE_TYPE (expr)))
2396                 {
2397                   if (supports_overflow_infinity (TREE_TYPE (expr)))
2398                     max = positive_overflow_infinity (TREE_TYPE (expr));
2399                   else
2400                     {
2401                       set_value_range_to_varying (vr);
2402                       return;
2403                     }
2404                 }
2405               else
2406                 max = TYPE_MAX_VALUE (TREE_TYPE (expr));
2407             }
2408         }
2409
2410       /* If the range contains zero then we know that the minimum value in the
2411          range will be zero.  */
2412       else if (range_includes_zero_p (&vr0))
2413         {
2414           if (cmp == 1)
2415             max = min;
2416           min = build_int_cst (TREE_TYPE (expr), 0);
2417         }
2418       else
2419         {
2420           /* If the range was reversed, swap MIN and MAX.  */
2421           if (cmp == 1)
2422             {
2423               tree t = min;
2424               min = max;
2425               max = t;
2426             }
2427         }
2428     }
2429   else
2430     {
2431       /* Otherwise, operate on each end of the range.  */
2432       min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
2433       max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
2434
2435       if (needs_overflow_infinity (TREE_TYPE (expr)))
2436         {
2437           gcc_assert (code != NEGATE_EXPR && code != ABS_EXPR);
2438
2439           /* If both sides have overflowed, we don't know
2440              anything.  */
2441           if ((is_overflow_infinity (vr0.min)
2442                || TREE_OVERFLOW (min))
2443               && (is_overflow_infinity (vr0.max)
2444                   || TREE_OVERFLOW (max)))
2445             {
2446               set_value_range_to_varying (vr);
2447               return;
2448             }
2449
2450           if (is_overflow_infinity (vr0.min))
2451             min = vr0.min;
2452           else if (TREE_OVERFLOW (min))
2453             {
2454               if (supports_overflow_infinity (TREE_TYPE (expr)))
2455                 min = (tree_int_cst_sgn (min) >= 0
2456                        ? positive_overflow_infinity (TREE_TYPE (min))
2457                        : negative_overflow_infinity (TREE_TYPE (min)));
2458               else
2459                 {
2460                   set_value_range_to_varying (vr);
2461                   return;
2462                 }
2463             }
2464
2465           if (is_overflow_infinity (vr0.max))
2466             max = vr0.max;
2467           else if (TREE_OVERFLOW (max))
2468             {
2469               if (supports_overflow_infinity (TREE_TYPE (expr)))
2470                 max = (tree_int_cst_sgn (max) >= 0
2471                        ? positive_overflow_infinity (TREE_TYPE (max))
2472                        : negative_overflow_infinity (TREE_TYPE (max)));
2473               else
2474                 {
2475                   set_value_range_to_varying (vr);
2476                   return;
2477                 }
2478             }
2479         }
2480     }
2481
2482   cmp = compare_values (min, max);
2483   if (cmp == -2 || cmp == 1)
2484     {
2485       /* If the new range has its limits swapped around (MIN > MAX),
2486          then the operation caused one of them to wrap around, mark
2487          the new range VARYING.  */
2488       set_value_range_to_varying (vr);
2489     }
2490   else
2491     set_value_range (vr, vr0.type, min, max, NULL);
2492 }
2493
2494
2495 /* Extract range information from a conditional expression EXPR based on
2496    the ranges of each of its operands and the expression code.  */
2497
2498 static void
2499 extract_range_from_cond_expr (value_range_t *vr, tree expr)
2500 {
2501   tree op0, op1;
2502   value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
2503   value_range_t vr1 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
2504
2505   /* Get value ranges for each operand.  For constant operands, create
2506      a new value range with the operand to simplify processing.  */
2507   op0 = COND_EXPR_THEN (expr);
2508   if (TREE_CODE (op0) == SSA_NAME)
2509     vr0 = *(get_value_range (op0));
2510   else if (is_gimple_min_invariant (op0))
2511     set_value_range_to_value (&vr0, op0, NULL);
2512   else
2513     set_value_range_to_varying (&vr0);
2514
2515   op1 = COND_EXPR_ELSE (expr);
2516   if (TREE_CODE (op1) == SSA_NAME)
2517     vr1 = *(get_value_range (op1));
2518   else if (is_gimple_min_invariant (op1))
2519     set_value_range_to_value (&vr1, op1, NULL);
2520   else
2521     set_value_range_to_varying (&vr1);
2522
2523   /* The resulting value range is the union of the operand ranges */
2524   vrp_meet (&vr0, &vr1);
2525   copy_value_range (vr, &vr0);
2526 }
2527
2528
2529 /* Extract range information from a comparison expression EXPR based
2530    on the range of its operand and the expression code.  */
2531
2532 static void
2533 extract_range_from_comparison (value_range_t *vr, tree expr)
2534 {
2535   bool sop = false;
2536   tree val = vrp_evaluate_conditional_warnv (expr, false, &sop);
2537
2538   /* A disadvantage of using a special infinity as an overflow
2539      representation is that we lose the ability to record overflow
2540      when we don't have an infinity.  So we have to ignore a result
2541      which relies on overflow.  */
2542
2543   if (val && !is_overflow_infinity (val) && !sop)
2544     {
2545       /* Since this expression was found on the RHS of an assignment,
2546          its type may be different from _Bool.  Convert VAL to EXPR's
2547          type.  */
2548       val = fold_convert (TREE_TYPE (expr), val);
2549       if (is_gimple_min_invariant (val))
2550         set_value_range_to_value (vr, val, vr->equiv);
2551       else
2552         set_value_range (vr, VR_RANGE, val, val, vr->equiv);
2553     }
2554   else
2555     /* The result of a comparison is always true or false.  */
2556     set_value_range_to_truthvalue (vr, TREE_TYPE (expr));
2557 }
2558
2559
2560 /* Try to compute a useful range out of expression EXPR and store it
2561    in *VR.  */
2562
2563 static void
2564 extract_range_from_expr (value_range_t *vr, tree expr)
2565 {
2566   enum tree_code code = TREE_CODE (expr);
2567
2568   if (code == ASSERT_EXPR)
2569     extract_range_from_assert (vr, expr);
2570   else if (code == SSA_NAME)
2571     extract_range_from_ssa_name (vr, expr);
2572   else if (TREE_CODE_CLASS (code) == tcc_binary
2573            || code == TRUTH_ANDIF_EXPR
2574            || code == TRUTH_ORIF_EXPR
2575            || code == TRUTH_AND_EXPR
2576            || code == TRUTH_OR_EXPR
2577            || code == TRUTH_XOR_EXPR)
2578     extract_range_from_binary_expr (vr, expr);
2579   else if (TREE_CODE_CLASS (code) == tcc_unary)
2580     extract_range_from_unary_expr (vr, expr);
2581   else if (code == COND_EXPR)
2582     extract_range_from_cond_expr (vr, expr);
2583   else if (TREE_CODE_CLASS (code) == tcc_comparison)
2584     extract_range_from_comparison (vr, expr);
2585   else if (is_gimple_min_invariant (expr))
2586     set_value_range_to_value (vr, expr, NULL);
2587   else
2588     set_value_range_to_varying (vr);
2589
2590   /* If we got a varying range from the tests above, try a final
2591      time to derive a nonnegative or nonzero range.  This time
2592      relying primarily on generic routines in fold in conjunction
2593      with range data.  */
2594   if (vr->type == VR_VARYING)
2595     {
2596       bool sop = false;
2597
2598       if (INTEGRAL_TYPE_P (TREE_TYPE (expr))
2599           && vrp_expr_computes_nonnegative (expr, &sop))
2600         set_value_range_to_nonnegative (vr, TREE_TYPE (expr),
2601                                         sop || is_overflow_infinity (expr));
2602       else if (vrp_expr_computes_nonzero (expr, &sop)
2603                && !sop)
2604         set_value_range_to_nonnull (vr, TREE_TYPE (expr));
2605     }
2606 }
2607
2608 /* Given a range VR, a LOOP and a variable VAR, determine whether it
2609    would be profitable to adjust VR using scalar evolution information
2610    for VAR.  If so, update VR with the new limits.  */
2611
2612 static void
2613 adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt,
2614                         tree var)
2615 {
2616   tree init, step, chrec, tmin, tmax, min, max, type;
2617   enum ev_direction dir;
2618
2619   /* TODO.  Don't adjust anti-ranges.  An anti-range may provide
2620      better opportunities than a regular range, but I'm not sure.  */
2621   if (vr->type == VR_ANTI_RANGE)
2622     return;
2623
2624   chrec = instantiate_parameters (loop, analyze_scalar_evolution (loop, var));
2625   if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
2626     return;
2627
2628   init = initial_condition_in_loop_num (chrec, loop->num);
2629   step = evolution_part_in_loop_num (chrec, loop->num);
2630
2631   /* If STEP is symbolic, we can't know whether INIT will be the
2632      minimum or maximum value in the range.  Also, unless INIT is
2633      a simple expression, compare_values and possibly other functions
2634      in tree-vrp won't be able to handle it.  */
2635   if (step == NULL_TREE
2636       || !is_gimple_min_invariant (step)
2637       || !valid_value_p (init))
2638     return;
2639
2640   dir = scev_direction (chrec);
2641   if (/* Do not adjust ranges if we do not know whether the iv increases
2642          or decreases,  ... */
2643       dir == EV_DIR_UNKNOWN
2644       /* ... or if it may wrap.  */
2645       || scev_probably_wraps_p (init, step, stmt, get_chrec_loop (chrec),
2646                                 true))
2647     return;
2648
2649   /* We use TYPE_MIN_VALUE and TYPE_MAX_VALUE here instead of
2650      negative_overflow_infinity and positive_overflow_infinity,
2651      because we have concluded that the loop probably does not
2652      wrap.  */
2653
2654   type = TREE_TYPE (var);
2655   if (POINTER_TYPE_P (type) || !TYPE_MIN_VALUE (type))
2656     tmin = lower_bound_in_type (type, type);
2657   else
2658     tmin = TYPE_MIN_VALUE (type);
2659   if (POINTER_TYPE_P (type) || !TYPE_MAX_VALUE (type))
2660     tmax = upper_bound_in_type (type, type);
2661   else
2662     tmax = TYPE_MAX_VALUE (type);
2663
2664   if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
2665     {
2666       min = tmin;
2667       max = tmax;
2668
2669       /* For VARYING or UNDEFINED ranges, just about anything we get
2670          from scalar evolutions should be better.  */
2671
2672       if (dir == EV_DIR_DECREASES)
2673         max = init;
2674       else
2675         min = init;
2676
2677       /* If we would create an invalid range, then just assume we
2678          know absolutely nothing.  This may be over-conservative,
2679          but it's clearly safe, and should happen only in unreachable
2680          parts of code, or for invalid programs.  */
2681       if (compare_values (min, max) == 1)
2682         return;
2683
2684       set_value_range (vr, VR_RANGE, min, max, vr->equiv);
2685     }
2686   else if (vr->type == VR_RANGE)
2687     {
2688       min = vr->min;
2689       max = vr->max;
2690
2691       if (dir == EV_DIR_DECREASES)
2692         {
2693           /* INIT is the maximum value.  If INIT is lower than VR->MAX
2694              but no smaller than VR->MIN, set VR->MAX to INIT.  */
2695           if (compare_values (init, max) == -1)
2696             {
2697               max = init;
2698
2699               /* If we just created an invalid range with the minimum
2700                  greater than the maximum, we fail conservatively.
2701                  This should happen only in unreachable
2702                  parts of code, or for invalid programs.  */
2703               if (compare_values (min, max) == 1)
2704                 return;
2705             }
2706
2707           /* According to the loop information, the variable does not
2708              overflow.  If we think it does, probably because of an
2709              overflow due to arithmetic on a different INF value,
2710              reset now.  */
2711           if (is_negative_overflow_infinity (min))
2712             min = tmin;
2713         }
2714       else
2715         {
2716           /* If INIT is bigger than VR->MIN, set VR->MIN to INIT.  */
2717           if (compare_values (init, min) == 1)
2718             {
2719               min = init;
2720
2721               /* Again, avoid creating invalid range by failing.  */
2722               if (compare_values (min, max) == 1)
2723                 return;
2724             }
2725
2726           if (is_positive_overflow_infinity (max))
2727             max = tmax;
2728         }
2729
2730       set_value_range (vr, VR_RANGE, min, max, vr->equiv);
2731     }
2732 }
2733
2734 /* Return true if VAR may overflow at STMT.  This checks any available
2735    loop information to see if we can determine that VAR does not
2736    overflow.  */
2737
2738 static bool
2739 vrp_var_may_overflow (tree var, tree stmt)
2740 {
2741   struct loop *l;
2742   tree chrec, init, step;
2743
2744   if (current_loops == NULL)
2745     return true;
2746
2747   l = loop_containing_stmt (stmt);
2748   if (l == NULL)
2749     return true;
2750
2751   chrec = instantiate_parameters (l, analyze_scalar_evolution (l, var));
2752   if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
2753     return true;
2754
2755   init = initial_condition_in_loop_num (chrec, l->num);
2756   step = evolution_part_in_loop_num (chrec, l->num);
2757
2758   if (step == NULL_TREE
2759       || !is_gimple_min_invariant (step)
2760       || !valid_value_p (init))
2761     return true;
2762
2763   /* If we get here, we know something useful about VAR based on the
2764      loop information.  If it wraps, it may overflow.  */
2765
2766   if (scev_probably_wraps_p (init, step, stmt, get_chrec_loop (chrec),
2767                              true))
2768     return true;
2769
2770   if (dump_file && (dump_flags & TDF_DETAILS) != 0)
2771     {
2772       print_generic_expr (dump_file, var, 0);
2773       fprintf (dump_file, ": loop information indicates does not overflow\n");
2774     }
2775
2776   return false;
2777 }
2778
2779
2780 /* Given two numeric value ranges VR0, VR1 and a comparison code COMP:
2781    
2782    - Return BOOLEAN_TRUE_NODE if VR0 COMP VR1 always returns true for
2783      all the values in the ranges.
2784
2785    - Return BOOLEAN_FALSE_NODE if the comparison always returns false.
2786
2787    - Return NULL_TREE if it is not always possible to determine the
2788      value of the comparison.
2789
2790    Also set *STRICT_OVERFLOW_P to indicate whether a range with an
2791    overflow infinity was used in the test.  */
2792
2793
2794 static tree
2795 compare_ranges (enum tree_code comp, value_range_t *vr0, value_range_t *vr1,
2796                 bool *strict_overflow_p)
2797 {
2798   /* VARYING or UNDEFINED ranges cannot be compared.  */
2799   if (vr0->type == VR_VARYING
2800       || vr0->type == VR_UNDEFINED
2801       || vr1->type == VR_VARYING
2802       || vr1->type == VR_UNDEFINED)
2803     return NULL_TREE;
2804
2805   /* Anti-ranges need to be handled separately.  */
2806   if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
2807     {
2808       /* If both are anti-ranges, then we cannot compute any
2809          comparison.  */
2810       if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
2811         return NULL_TREE;
2812
2813       /* These comparisons are never statically computable.  */
2814       if (comp == GT_EXPR
2815           || comp == GE_EXPR
2816           || comp == LT_EXPR
2817           || comp == LE_EXPR)
2818         return NULL_TREE;
2819
2820       /* Equality can be computed only between a range and an
2821          anti-range.  ~[VAL1, VAL2] == [VAL1, VAL2] is always false.  */
2822       if (vr0->type == VR_RANGE)
2823         {
2824           /* To simplify processing, make VR0 the anti-range.  */
2825           value_range_t *tmp = vr0;
2826           vr0 = vr1;
2827           vr1 = tmp;
2828         }
2829
2830       gcc_assert (comp == NE_EXPR || comp == EQ_EXPR);
2831
2832       if (compare_values_warnv (vr0->min, vr1->min, strict_overflow_p) == 0
2833           && compare_values_warnv (vr0->max, vr1->max, strict_overflow_p) == 0)
2834         return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
2835
2836       return NULL_TREE;
2837     }
2838
2839   if (!usable_range_p (vr0, strict_overflow_p)
2840       || !usable_range_p (vr1, strict_overflow_p))
2841     return NULL_TREE;
2842
2843   /* Simplify processing.  If COMP is GT_EXPR or GE_EXPR, switch the
2844      operands around and change the comparison code.  */
2845   if (comp == GT_EXPR || comp == GE_EXPR)
2846     {
2847       value_range_t *tmp;
2848       comp = (comp == GT_EXPR) ? LT_EXPR : LE_EXPR;
2849       tmp = vr0;
2850       vr0 = vr1;
2851       vr1 = tmp;
2852     }
2853
2854   if (comp == EQ_EXPR)
2855     {
2856       /* Equality may only be computed if both ranges represent
2857          exactly one value.  */
2858       if (compare_values_warnv (vr0->min, vr0->max, strict_overflow_p) == 0
2859           && compare_values_warnv (vr1->min, vr1->max, strict_overflow_p) == 0)
2860         {
2861           int cmp_min = compare_values_warnv (vr0->min, vr1->min,
2862                                               strict_overflow_p);
2863           int cmp_max = compare_values_warnv (vr0->max, vr1->max,
2864                                               strict_overflow_p);
2865           if (cmp_min == 0 && cmp_max == 0)
2866             return boolean_true_node;
2867           else if (cmp_min != -2 && cmp_max != -2)
2868             return boolean_false_node;
2869         }
2870       /* If [V0_MIN, V1_MAX] < [V1_MIN, V1_MAX] then V0 != V1.  */
2871       else if (compare_values_warnv (vr0->min, vr1->max,
2872                                      strict_overflow_p) == 1
2873                || compare_values_warnv (vr1->min, vr0->max,
2874                                         strict_overflow_p) == 1)
2875         return boolean_false_node;
2876
2877       return NULL_TREE;
2878     }
2879   else if (comp == NE_EXPR)
2880     {
2881       int cmp1, cmp2;
2882
2883       /* If VR0 is completely to the left or completely to the right
2884          of VR1, they are always different.  Notice that we need to
2885          make sure that both comparisons yield similar results to
2886          avoid comparing values that cannot be compared at
2887          compile-time.  */
2888       cmp1 = compare_values_warnv (vr0->max, vr1->min, strict_overflow_p);
2889       cmp2 = compare_values_warnv (vr0->min, vr1->max, strict_overflow_p);
2890       if ((cmp1 == -1 && cmp2 == -1) || (cmp1 == 1 && cmp2 == 1))
2891         return boolean_true_node;
2892
2893       /* If VR0 and VR1 represent a single value and are identical,
2894          return false.  */
2895       else if (compare_values_warnv (vr0->min, vr0->max,
2896                                      strict_overflow_p) == 0
2897                && compare_values_warnv (vr1->min, vr1->max,
2898                                         strict_overflow_p) == 0
2899                && compare_values_warnv (vr0->min, vr1->min,
2900                                         strict_overflow_p) == 0
2901                && compare_values_warnv (vr0->max, vr1->max,
2902                                         strict_overflow_p) == 0)
2903         return boolean_false_node;
2904
2905       /* Otherwise, they may or may not be different.  */
2906       else
2907         return NULL_TREE;
2908     }
2909   else if (comp == LT_EXPR || comp == LE_EXPR)
2910     {
2911       int tst;
2912
2913       /* If VR0 is to the left of VR1, return true.  */
2914       tst = compare_values_warnv (vr0->max, vr1->min, strict_overflow_p);
2915       if ((comp == LT_EXPR && tst == -1)
2916           || (comp == LE_EXPR && (tst == -1 || tst == 0)))
2917         {
2918           if (overflow_infinity_range_p (vr0)
2919               || overflow_infinity_range_p (vr1))
2920             *strict_overflow_p = true;
2921           return boolean_true_node;
2922         }
2923
2924       /* If VR0 is to the right of VR1, return false.  */
2925       tst = compare_values_warnv (vr0->min, vr1->max, strict_overflow_p);
2926       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
2927           || (comp == LE_EXPR && tst == 1))
2928         {
2929           if (overflow_infinity_range_p (vr0)
2930               || overflow_infinity_range_p (vr1))
2931             *strict_overflow_p = true;
2932           return boolean_false_node;
2933         }
2934
2935       /* Otherwise, we don't know.  */
2936       return NULL_TREE;
2937     }
2938     
2939   gcc_unreachable ();
2940 }
2941
2942
2943 /* Given a value range VR, a value VAL and a comparison code COMP, return
2944    BOOLEAN_TRUE_NODE if VR COMP VAL always returns true for all the
2945    values in VR.  Return BOOLEAN_FALSE_NODE if the comparison
2946    always returns false.  Return NULL_TREE if it is not always
2947    possible to determine the value of the comparison.  Also set
2948    *STRICT_OVERFLOW_P to indicate whether a range with an overflow
2949    infinity was used in the test.  */
2950
2951 static tree
2952 compare_range_with_value (enum tree_code comp, value_range_t *vr, tree val,
2953                           bool *strict_overflow_p)
2954 {
2955   if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
2956     return NULL_TREE;
2957
2958   /* Anti-ranges need to be handled separately.  */
2959   if (vr->type == VR_ANTI_RANGE)
2960     {
2961       /* For anti-ranges, the only predicates that we can compute at
2962          compile time are equality and inequality.  */
2963       if (comp == GT_EXPR
2964           || comp == GE_EXPR
2965           || comp == LT_EXPR
2966           || comp == LE_EXPR)
2967         return NULL_TREE;
2968
2969       /* ~[VAL_1, VAL_2] OP VAL is known if VAL_1 <= VAL <= VAL_2.  */
2970       if (value_inside_range (val, vr) == 1)
2971         return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
2972
2973       return NULL_TREE;
2974     }
2975
2976   if (!usable_range_p (vr, strict_overflow_p))
2977     return NULL_TREE;
2978
2979   if (comp == EQ_EXPR)
2980     {
2981       /* EQ_EXPR may only be computed if VR represents exactly
2982          one value.  */
2983       if (compare_values_warnv (vr->min, vr->max, strict_overflow_p) == 0)
2984         {
2985           int cmp = compare_values_warnv (vr->min, val, strict_overflow_p);
2986           if (cmp == 0)
2987             return boolean_true_node;
2988           else if (cmp == -1 || cmp == 1 || cmp == 2)
2989             return boolean_false_node;
2990         }
2991       else if (compare_values_warnv (val, vr->min, strict_overflow_p) == -1
2992                || compare_values_warnv (vr->max, val, strict_overflow_p) == -1)
2993         return boolean_false_node;
2994
2995       return NULL_TREE;
2996     }
2997   else if (comp == NE_EXPR)
2998     {
2999       /* If VAL is not inside VR, then they are always different.  */
3000       if (compare_values_warnv (vr->max, val, strict_overflow_p) == -1
3001           || compare_values_warnv (vr->min, val, strict_overflow_p) == 1)
3002         return boolean_true_node;
3003
3004       /* If VR represents exactly one value equal to VAL, then return
3005          false.  */
3006       if (compare_values_warnv (vr->min, vr->max, strict_overflow_p) == 0
3007           && compare_values_warnv (vr->min, val, strict_overflow_p) == 0)
3008         return boolean_false_node;
3009
3010       /* Otherwise, they may or may not be different.  */
3011       return NULL_TREE;
3012     }
3013   else if (comp == LT_EXPR || comp == LE_EXPR)
3014     {
3015       int tst;
3016
3017       /* If VR is to the left of VAL, return true.  */
3018       tst = compare_values_warnv (vr->max, val, strict_overflow_p);
3019       if ((comp == LT_EXPR && tst == -1)
3020           || (comp == LE_EXPR && (tst == -1 || tst == 0)))
3021         {
3022           if (overflow_infinity_range_p (vr))
3023             *strict_overflow_p = true;
3024           return boolean_true_node;
3025         }
3026
3027       /* If VR is to the right of VAL, return false.  */
3028       tst = compare_values_warnv (vr->min, val, strict_overflow_p);
3029       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
3030           || (comp == LE_EXPR && tst == 1))
3031         {
3032           if (overflow_infinity_range_p (vr))
3033             *strict_overflow_p = true;
3034           return boolean_false_node;
3035         }
3036
3037       /* Otherwise, we don't know.  */
3038       return NULL_TREE;
3039     }
3040   else if (comp == GT_EXPR || comp == GE_EXPR)
3041     {
3042       int tst;
3043
3044       /* If VR is to the right of VAL, return true.  */
3045       tst = compare_values_warnv (vr->min, val, strict_overflow_p);
3046       if ((comp == GT_EXPR && tst == 1)
3047           || (comp == GE_EXPR && (tst == 0 || tst == 1)))
3048         {
3049           if (overflow_infinity_range_p (vr))
3050             *strict_overflow_p = true;
3051           return boolean_true_node;
3052         }
3053
3054       /* If VR is to the left of VAL, return false.  */
3055       tst = compare_values_warnv (vr->max, val, strict_overflow_p);
3056       if ((comp == GT_EXPR && (tst == -1 || tst == 0))
3057           || (comp == GE_EXPR && tst == -1))
3058         {
3059           if (overflow_infinity_range_p (vr))
3060             *strict_overflow_p = true;
3061           return boolean_false_node;
3062         }
3063
3064       /* Otherwise, we don't know.  */
3065       return NULL_TREE;
3066     }
3067
3068   gcc_unreachable ();
3069 }
3070
3071
3072 /* Debugging dumps.  */
3073
3074 void dump_value_range (FILE *, value_range_t *);
3075 void debug_value_range (value_range_t *);
3076 void dump_all_value_ranges (FILE *);
3077 void debug_all_value_ranges (void);
3078 void dump_vr_equiv (FILE *, bitmap);
3079 void debug_vr_equiv (bitmap);
3080
3081
3082 /* Dump value range VR to FILE.  */
3083
3084 void
3085 dump_value_range (FILE *file, value_range_t *vr)
3086 {
3087   if (vr == NULL)
3088     fprintf (file, "[]");
3089   else if (vr->type == VR_UNDEFINED)
3090     fprintf (file, "UNDEFINED");
3091   else if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
3092     {
3093       tree type = TREE_TYPE (vr->min);
3094
3095       fprintf (file, "%s[", (vr->type == VR_ANTI_RANGE) ? "~" : "");
3096
3097       if (is_negative_overflow_infinity (vr->min))
3098         fprintf (file, "-INF(OVF)");
3099       else if (INTEGRAL_TYPE_P (type)
3100                && !TYPE_UNSIGNED (type)
3101                && vrp_val_is_min (vr->min))
3102         fprintf (file, "-INF");
3103       else
3104         print_generic_expr (file, vr->min, 0);
3105
3106       fprintf (file, ", ");
3107
3108       if (is_positive_overflow_infinity (vr->max))
3109         fprintf (file, "+INF(OVF)");
3110       else if (INTEGRAL_TYPE_P (type)
3111                && vrp_val_is_max (vr->max))
3112         fprintf (file, "+INF");
3113       else
3114         print_generic_expr (file, vr->max, 0);
3115
3116       fprintf (file, "]");
3117
3118       if (vr->equiv)
3119         {
3120           bitmap_iterator bi;
3121           unsigned i, c = 0;
3122
3123           fprintf (file, "  EQUIVALENCES: { ");
3124
3125           EXECUTE_IF_SET_IN_BITMAP (vr->equiv, 0, i, bi)
3126             {
3127               print_generic_expr (file, ssa_name (i), 0);
3128               fprintf (file, " ");
3129               c++;
3130             }
3131
3132           fprintf (file, "} (%u elements)", c);
3133         }
3134     }
3135   else if (vr->type == VR_VARYING)
3136     fprintf (file, "VARYING");
3137   else
3138     fprintf (file, "INVALID RANGE");
3139 }
3140
3141
3142 /* Dump value range VR to stderr.  */
3143
3144 void
3145 debug_value_range (value_range_t *vr)
3146 {
3147   dump_value_range (stderr, vr);
3148   fprintf (stderr, "\n");
3149 }
3150
3151
3152 /* Dump value ranges of all SSA_NAMEs to FILE.  */
3153
3154 void
3155 dump_all_value_ranges (FILE *file)
3156 {
3157   size_t i;
3158
3159   for (i = 0; i < num_ssa_names; i++)
3160     {
3161       if (vr_value[i])
3162         {
3163           print_generic_expr (file, ssa_name (i), 0);
3164           fprintf (file, ": ");
3165           dump_value_range (file, vr_value[i]);
3166           fprintf (file, "\n");
3167         }
3168     }
3169
3170   fprintf (file, "\n");
3171 }
3172
3173
3174 /* Dump all value ranges to stderr.  */
3175
3176 void
3177 debug_all_value_ranges (void)
3178 {
3179   dump_all_value_ranges (stderr);
3180 }
3181
3182
3183 /* Given a COND_EXPR COND of the form 'V OP W', and an SSA name V,
3184    create a new SSA name N and return the assertion assignment
3185    'V = ASSERT_EXPR <V, V OP W>'.  */
3186
3187 static tree
3188 build_assert_expr_for (tree cond, tree v)
3189 {
3190   tree n, assertion;
3191
3192   gcc_assert (TREE_CODE (v) == SSA_NAME);
3193   n = duplicate_ssa_name (v, NULL_TREE);
3194
3195   if (COMPARISON_CLASS_P (cond))
3196     {
3197       tree a = build2 (ASSERT_EXPR, TREE_TYPE (v), v, cond); 
3198       assertion = build_gimple_modify_stmt (n, a);
3199     }
3200   else if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
3201     {
3202       /* Given !V, build the assignment N = false.  */
3203       tree op0 = TREE_OPERAND (cond, 0);
3204       gcc_assert (op0 == v);
3205       assertion = build_gimple_modify_stmt (n, boolean_false_node);
3206     }
3207   else if (TREE_CODE (cond) == SSA_NAME)
3208     {
3209       /* Given V, build the assignment N = true.  */
3210       gcc_assert (v == cond);
3211       assertion = build_gimple_modify_stmt (n, boolean_true_node);
3212     }
3213   else
3214     gcc_unreachable ();
3215
3216   SSA_NAME_DEF_STMT (n) = assertion;
3217
3218   /* The new ASSERT_EXPR, creates a new SSA name that replaces the
3219      operand of the ASSERT_EXPR. Register the new name and the old one
3220      in the replacement table so that we can fix the SSA web after
3221      adding all the ASSERT_EXPRs.  */
3222   register_new_name_mapping (n, v);
3223
3224   return assertion;
3225 }
3226
3227
3228 /* Return false if EXPR is a predicate expression involving floating
3229    point values.  */
3230
3231 static inline bool
3232 fp_predicate (tree expr)
3233 {
3234   return (COMPARISON_CLASS_P (expr)
3235           && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 0))));
3236 }
3237
3238
3239 /* If the range of values taken by OP can be inferred after STMT executes,
3240    return the comparison code (COMP_CODE_P) and value (VAL_P) that
3241    describes the inferred range.  Return true if a range could be
3242    inferred.  */
3243
3244 static bool
3245 infer_value_range (tree stmt, tree op, enum tree_code *comp_code_p, tree *val_p)
3246 {
3247   *val_p = NULL_TREE;
3248   *comp_code_p = ERROR_MARK;
3249
3250   /* Do not attempt to infer anything in names that flow through
3251      abnormal edges.  */
3252   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
3253     return false;
3254
3255   /* Similarly, don't infer anything from statements that may throw
3256      exceptions.  */
3257   if (tree_could_throw_p (stmt))
3258     return false;
3259
3260   /* If STMT is the last statement of a basic block with no
3261      successors, there is no point inferring anything about any of its
3262      operands.  We would not be able to find a proper insertion point
3263      for the assertion, anyway.  */
3264   if (stmt_ends_bb_p (stmt) && EDGE_COUNT (bb_for_stmt (stmt)->succs) == 0)
3265     return false;
3266
3267   /* We can only assume that a pointer dereference will yield
3268      non-NULL if -fdelete-null-pointer-checks is enabled.  */
3269   if (flag_delete_null_pointer_checks && POINTER_TYPE_P (TREE_TYPE (op)))
3270     {
3271       unsigned num_uses, num_loads, num_stores;
3272
3273       count_uses_and_derefs (op, stmt, &num_uses, &num_loads, &num_stores);
3274       if (num_loads + num_stores > 0)
3275         {
3276           *val_p = build_int_cst (TREE_TYPE (op), 0);
3277           *comp_code_p = NE_EXPR;
3278           return true;
3279         }
3280     }
3281
3282   return false;
3283 }
3284
3285
3286 void dump_asserts_for (FILE *, tree);
3287 void debug_asserts_for (tree);
3288 void dump_all_asserts (FILE *);
3289 void debug_all_asserts (void);
3290
3291 /* Dump all the registered assertions for NAME to FILE.  */
3292
3293 void
3294 dump_asserts_for (FILE *file, tree name)
3295 {
3296   assert_locus_t loc;
3297
3298   fprintf (file, "Assertions to be inserted for ");
3299   print_generic_expr (file, name, 0);
3300   fprintf (file, "\n");
3301
3302   loc = asserts_for[SSA_NAME_VERSION (name)];
3303   while (loc)
3304     {
3305       fprintf (file, "\t");
3306       print_generic_expr (file, bsi_stmt (loc->si), 0);
3307       fprintf (file, "\n\tBB #%d", loc->bb->index);
3308       if (loc->e)
3309         {
3310           fprintf (file, "\n\tEDGE %d->%d", loc->e->src->index,
3311                    loc->e->dest->index);
3312           dump_edge_info (file, loc->e, 0);
3313         }
3314       fprintf (file, "\n\tPREDICATE: ");
3315       print_generic_expr (file, name, 0);
3316       fprintf (file, " %s ", tree_code_name[(int)loc->comp_code]);
3317       print_generic_expr (file, loc->val, 0);
3318       fprintf (file, "\n\n");
3319       loc = loc->next;
3320     }
3321
3322   fprintf (file, "\n");
3323 }
3324
3325
3326 /* Dump all the registered assertions for NAME to stderr.  */
3327
3328 void
3329 debug_asserts_for (tree name)
3330 {
3331   dump_asserts_for (stderr, name);
3332 }
3333
3334
3335 /* Dump all the registered assertions for all the names to FILE.  */
3336
3337 void
3338 dump_all_asserts (FILE *file)
3339 {
3340   unsigned i;
3341   bitmap_iterator bi;
3342
3343   fprintf (file, "\nASSERT_EXPRs to be inserted\n\n");
3344   EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
3345     dump_asserts_for (file, ssa_name (i));
3346   fprintf (file, "\n");
3347 }
3348
3349
3350 /* Dump all the registered assertions for all the names to stderr.  */
3351
3352 void
3353 debug_all_asserts (void)
3354 {
3355   dump_all_asserts (stderr);
3356 }
3357
3358
3359 /* If NAME doesn't have an ASSERT_EXPR registered for asserting
3360    'NAME COMP_CODE VAL' at a location that dominates block BB or
3361    E->DEST, then register this location as a possible insertion point
3362    for ASSERT_EXPR <NAME, NAME COMP_CODE VAL>.
3363
3364    BB, E and SI provide the exact insertion point for the new
3365    ASSERT_EXPR.  If BB is NULL, then the ASSERT_EXPR is to be inserted
3366    on edge E.  Otherwise, if E is NULL, the ASSERT_EXPR is inserted on
3367    BB.  If SI points to a COND_EXPR or a SWITCH_EXPR statement, then E
3368    must not be NULL.  */
3369
3370 static void
3371 register_new_assert_for (tree name,
3372                          enum tree_code comp_code,
3373                          tree val,
3374                          basic_block bb,
3375                          edge e,
3376                          block_stmt_iterator si)
3377 {
3378   assert_locus_t n, loc, last_loc;
3379   bool found;
3380   basic_block dest_bb;
3381
3382 #if defined ENABLE_CHECKING
3383   gcc_assert (bb == NULL || e == NULL);
3384
3385   if (e == NULL)
3386     gcc_assert (TREE_CODE (bsi_stmt (si)) != COND_EXPR
3387                 && TREE_CODE (bsi_stmt (si)) != SWITCH_EXPR);
3388 #endif
3389
3390   /* The new assertion A will be inserted at BB or E.  We need to
3391      determine if the new location is dominated by a previously
3392      registered location for A.  If we are doing an edge insertion,
3393      assume that A will be inserted at E->DEST.  Note that this is not
3394      necessarily true.
3395      
3396      If E is a critical edge, it will be split.  But even if E is
3397      split, the new block will dominate the same set of blocks that
3398      E->DEST dominates.
3399      
3400      The reverse, however, is not true, blocks dominated by E->DEST
3401      will not be dominated by the new block created to split E.  So,
3402      if the insertion location is on a critical edge, we will not use
3403      the new location to move another assertion previously registered
3404      at a block dominated by E->DEST.  */
3405   dest_bb = (bb) ? bb : e->dest;
3406
3407   /* If NAME already has an ASSERT_EXPR registered for COMP_CODE and
3408      VAL at a block dominating DEST_BB, then we don't need to insert a new
3409      one.  Similarly, if the same assertion already exists at a block
3410      dominated by DEST_BB and the new location is not on a critical
3411      edge, then update the existing location for the assertion (i.e.,
3412      move the assertion up in the dominance tree).
3413
3414      Note, this is implemented as a simple linked list because there
3415      should not be more than a handful of assertions registered per
3416      name.  If this becomes a performance problem, a table hashed by
3417      COMP_CODE and VAL could be implemented.  */
3418   loc = asserts_for[SSA_NAME_VERSION (name)];
3419   last_loc = loc;
3420   found = false;
3421   while (loc)
3422     {
3423       if (loc->comp_code == comp_code
3424           && (loc->val == val
3425               || operand_equal_p (loc->val, val, 0)))
3426         {
3427           /* If the assertion NAME COMP_CODE VAL has already been
3428              registered at a basic block that dominates DEST_BB, then
3429              we don't need to insert the same assertion again.  Note
3430              that we don't check strict dominance here to avoid
3431              replicating the same assertion inside the same basic
3432              block more than once (e.g., when a pointer is
3433              dereferenced several times inside a block).
3434
3435              An exception to this rule are edge insertions.  If the
3436              new assertion is to be inserted on edge E, then it will
3437              dominate all the other insertions that we may want to
3438              insert in DEST_BB.  So, if we are doing an edge
3439              insertion, don't do this dominance check.  */
3440           if (e == NULL
3441               && dominated_by_p (CDI_DOMINATORS, dest_bb, loc->bb))
3442             return;
3443
3444           /* Otherwise, if E is not a critical edge and DEST_BB
3445              dominates the existing location for the assertion, move
3446              the assertion up in the dominance tree by updating its
3447              location information.  */
3448           if ((e == NULL || !EDGE_CRITICAL_P (e))
3449               && dominated_by_p (CDI_DOMINATORS, loc->bb, dest_bb))
3450             {
3451               loc->bb = dest_bb;
3452               loc->e = e;
3453               loc->si = si;
3454               return;
3455             }
3456         }
3457
3458       /* Update the last node of the list and move to the next one.  */
3459       last_loc = loc;
3460       loc = loc->next;
3461     }
3462
3463   /* If we didn't find an assertion already registered for
3464      NAME COMP_CODE VAL, add a new one at the end of the list of
3465      assertions associated with NAME.  */
3466   n = XNEW (struct assert_locus_d);
3467   n->bb = dest_bb;
3468   n->e = e;
3469   n->si = si;
3470   n->comp_code = comp_code;
3471   n->val = val;
3472   n->next = NULL;
3473
3474   if (last_loc)
3475     last_loc->next = n;
3476   else
3477     asserts_for[SSA_NAME_VERSION (name)] = n;
3478
3479   bitmap_set_bit (need_assert_for, SSA_NAME_VERSION (name));
3480 }
3481
3482 /* COND is a predicate which uses NAME.  Extract a suitable test code
3483    and value and store them into *CODE_P and *VAL_P so the predicate
3484    is normalized to NAME *CODE_P *VAL_P.
3485
3486    If no extraction was possible, return FALSE, otherwise return TRUE.
3487
3488    If INVERT is true, then we invert the result stored into *CODE_P.  */
3489
3490 static bool
3491 extract_code_and_val_from_cond (tree name, tree cond, bool invert,
3492                                 enum tree_code *code_p, tree *val_p)
3493 {
3494   enum tree_code comp_code;
3495   tree val;
3496
3497   /* Predicates may be a single SSA name or NAME OP VAL.  */
3498   if (cond == name)
3499     {
3500       /* If the predicate is a name, it must be NAME, in which
3501          case we create the predicate NAME == true or
3502          NAME == false accordingly.  */
3503       comp_code = EQ_EXPR;
3504       val = invert ? boolean_false_node : boolean_true_node;
3505     }
3506   else
3507     {
3508       /* Otherwise, we have a comparison of the form NAME COMP VAL
3509          or VAL COMP NAME.  */
3510       if (name == TREE_OPERAND (cond, 1))
3511         {
3512           /* If the predicate is of the form VAL COMP NAME, flip
3513              COMP around because we need to register NAME as the
3514              first operand in the predicate.  */
3515           comp_code = swap_tree_comparison (TREE_CODE (cond));
3516           val = TREE_OPERAND (cond, 0);
3517         }
3518       else
3519         {
3520           /* The comparison is of the form NAME COMP VAL, so the
3521              comparison code remains unchanged.  */
3522           comp_code = TREE_CODE (cond);
3523           val = TREE_OPERAND (cond, 1);
3524         }
3525
3526       /* Invert the comparison code as necessary.  */
3527       if (invert)
3528         comp_code = invert_tree_comparison (comp_code, 0);
3529
3530       /* VRP does not handle float types.  */
3531       if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (val)))
3532         return false;
3533
3534       /* Do not register always-false predicates.
3535          FIXME:  this works around a limitation in fold() when dealing with
3536          enumerations.  Given 'enum { N1, N2 } x;', fold will not
3537          fold 'if (x > N2)' to 'if (0)'.  */
3538       if ((comp_code == GT_EXPR || comp_code == LT_EXPR)
3539           && INTEGRAL_TYPE_P (TREE_TYPE (val)))
3540         {
3541           tree min = TYPE_MIN_VALUE (TREE_TYPE (val));
3542           tree max = TYPE_MAX_VALUE (TREE_TYPE (val));
3543
3544           if (comp_code == GT_EXPR
3545               && (!max
3546                   || compare_values (val, max) == 0))
3547             return false;
3548
3549           if (comp_code == LT_EXPR
3550               && (!min
3551                   || compare_values (val, min) == 0))
3552             return false;
3553         }
3554     }
3555   *code_p = comp_code;
3556   *val_p = val;
3557   return true;
3558 }
3559
3560 /* OP is an operand of a truth value expression which is known to have
3561    a particular value.  Register any asserts for OP and for any
3562    operands in OP's defining statement. 
3563
3564    If CODE is EQ_EXPR, then we want to register OP is zero (false),
3565    if CODE is NE_EXPR, then we want to register OP is nonzero (true).   */
3566
3567 static bool
3568 register_edge_assert_for_1 (tree op, enum tree_code code,
3569                             edge e, block_stmt_iterator bsi)
3570 {
3571   bool retval = false;
3572   tree op_def, rhs, val;
3573
3574   /* We only care about SSA_NAMEs.  */
3575   if (TREE_CODE (op) != SSA_NAME)
3576     return false;
3577
3578   /* We know that OP will have a zero or nonzero value.  If OP is used
3579      more than once go ahead and register an assert for OP. 
3580
3581      The FOUND_IN_SUBGRAPH support is not helpful in this situation as
3582      it will always be set for OP (because OP is used in a COND_EXPR in
3583      the subgraph).  */
3584   if (!has_single_use (op))
3585     {
3586       val = build_int_cst (TREE_TYPE (op), 0);
3587       register_new_assert_for (op, code, val, NULL, e, bsi);
3588       retval = true;
3589     }
3590
3591   /* Now look at how OP is set.  If it's set from a comparison,
3592      a truth operation or some bit operations, then we may be able
3593      to register information about the operands of that assignment.  */
3594   op_def = SSA_NAME_DEF_STMT (op);
3595   if (TREE_CODE (op_def) != GIMPLE_MODIFY_STMT)
3596     return retval;
3597
3598   rhs = GIMPLE_STMT_OPERAND (op_def, 1);
3599
3600   if (COMPARISON_CLASS_P (rhs))
3601     {
3602       bool invert = (code == EQ_EXPR ? true : false);
3603       tree op0 = TREE_OPERAND (rhs, 0);
3604       tree op1 = TREE_OPERAND (rhs, 1);
3605
3606       /* Conditionally register an assert for each SSA_NAME in the
3607          comparison.  */
3608       if (TREE_CODE (op0) == SSA_NAME
3609           && !has_single_use (op0)
3610           && extract_code_and_val_from_cond (op0, rhs,
3611                                              invert, &code, &val))
3612         {
3613           register_new_assert_for (op0, code, val, NULL, e, bsi);
3614           retval = true;
3615         }
3616
3617       /* Similarly for the second operand of the comparison.  */
3618       if (TREE_CODE (op1) == SSA_NAME
3619           && !has_single_use (op1)
3620           && extract_code_and_val_from_cond (op1, rhs,
3621                                              invert, &code, &val))
3622         {
3623           register_new_assert_for (op1, code, val, NULL, e, bsi);
3624           retval = true;
3625         }
3626     }
3627   else if ((code == NE_EXPR
3628             && (TREE_CODE (rhs) == TRUTH_AND_EXPR
3629                 || TREE_CODE (rhs) == BIT_AND_EXPR))
3630            || (code == EQ_EXPR
3631                && (TREE_CODE (rhs) == TRUTH_OR_EXPR
3632                    || TREE_CODE (rhs) == BIT_IOR_EXPR)))
3633     {
3634       /* Recurse on each operand.  */
3635       retval |= register_edge_assert_for_1 (TREE_OPERAND (rhs, 0),
3636                                             code, e, bsi);
3637       retval |= register_edge_assert_for_1 (TREE_OPERAND (rhs, 1),
3638                                             code, e, bsi);
3639     }
3640   else if (TREE_CODE (rhs) == TRUTH_NOT_EXPR)
3641     {
3642       /* Recurse, flipping CODE.  */
3643       code = invert_tree_comparison (code, false);
3644       retval |= register_edge_assert_for_1 (TREE_OPERAND (rhs, 0),
3645                                             code, e, bsi);
3646     }
3647   else if (TREE_CODE (rhs) == SSA_NAME)
3648     {
3649       /* Recurse through the copy.  */
3650       retval |= register_edge_assert_for_1 (rhs, code, e, bsi);
3651     }
3652   else if (TREE_CODE (rhs) == NOP_EXPR
3653            || TREE_CODE (rhs) == CONVERT_EXPR
3654            || TREE_CODE (rhs) == NON_LVALUE_EXPR)
3655     { 
3656       /* Recurse through the type conversion.  */
3657       retval |= register_edge_assert_for_1 (TREE_OPERAND (rhs, 0),
3658                                             code, e, bsi);
3659     }
3660
3661   return retval;
3662 }
3663
3664 /* Try to register an edge assertion for SSA name NAME on edge E for
3665    the condition COND contributing to the conditional jump pointed to by SI.
3666    Return true if an assertion for NAME could be registered.  */
3667
3668 static bool
3669 register_edge_assert_for (tree name, edge e, block_stmt_iterator si, tree cond)
3670 {
3671   tree val;
3672   enum tree_code comp_code;
3673   bool retval = false;
3674   bool is_else_edge = (e->flags & EDGE_FALSE_VALUE) != 0;
3675
3676   /* Do not attempt to infer anything in names that flow through
3677      abnormal edges.  */
3678   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
3679     return false;
3680
3681   if (!extract_code_and_val_from_cond (name, cond, is_else_edge,
3682                                        &comp_code, &val))
3683     return false;
3684
3685   /* Only register an ASSERT_EXPR if NAME was found in the sub-graph
3686      reachable from E.  */
3687   if (TEST_BIT (found_in_subgraph, SSA_NAME_VERSION (name)))
3688     {
3689       register_new_assert_for (name, comp_code, val, NULL, e, si);
3690       retval = true;
3691     }
3692
3693   /* If COND is effectively an equality test of an SSA_NAME against
3694      the value zero or one, then we may be able to assert values
3695      for SSA_NAMEs which flow into COND.  */
3696
3697   /* In the case of NAME == 1 or NAME != 0, for TRUTH_AND_EXPR defining
3698      statement of NAME we can assert both operands of the TRUTH_AND_EXPR
3699      have nonzero value.  */
3700   if (((comp_code == EQ_EXPR && integer_onep (val))
3701        || (comp_code == NE_EXPR && integer_zerop (val))))
3702     {
3703       tree def_stmt = SSA_NAME_DEF_STMT (name);
3704
3705       if (TREE_CODE (def_stmt) == GIMPLE_MODIFY_STMT
3706           && (TREE_CODE (GIMPLE_STMT_OPERAND (def_stmt, 1)) == TRUTH_AND_EXPR
3707               || TREE_CODE (GIMPLE_STMT_OPERAND (def_stmt, 1)) == BIT_AND_EXPR))
3708         {
3709           tree op0 = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 0);
3710           tree op1 = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 1);
3711           retval |= register_edge_assert_for_1 (op0, NE_EXPR, e, si);
3712           retval |= register_edge_assert_for_1 (op1, NE_EXPR, e, si);
3713         }
3714     }
3715
3716   /* In the case of NAME == 0 or NAME != 1, for TRUTH_OR_EXPR defining
3717      statement of NAME we can assert both operands of the TRUTH_OR_EXPR
3718      have zero value.  */
3719   if (((comp_code == EQ_EXPR && integer_zerop (val))
3720        || (comp_code == NE_EXPR && integer_onep (val))))
3721     {
3722       tree def_stmt = SSA_NAME_DEF_STMT (name);
3723
3724       if (TREE_CODE (def_stmt) == GIMPLE_MODIFY_STMT
3725           && (TREE_CODE (GIMPLE_STMT_OPERAND (def_stmt, 1)) == TRUTH_OR_EXPR
3726               || TREE_CODE (GIMPLE_STMT_OPERAND (def_stmt, 1)) == BIT_IOR_EXPR))
3727         {
3728           tree op0 = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 0);
3729           tree op1 = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 1);
3730           retval |= register_edge_assert_for_1 (op0, EQ_EXPR, e, si);
3731           retval |= register_edge_assert_for_1 (op1, EQ_EXPR, e, si);
3732         }
3733     }
3734
3735   return retval;
3736 }
3737
3738
3739 static bool find_assert_locations (basic_block bb);
3740
3741 /* Determine whether the outgoing edges of BB should receive an
3742    ASSERT_EXPR for each of the operands of BB's LAST statement.
3743    The last statement of BB must be a COND_EXPR.
3744
3745    If any of the sub-graphs rooted at BB have an interesting use of
3746    the predicate operands, an assert location node is added to the
3747    list of assertions for the corresponding operands.  */
3748
3749 static bool
3750 find_conditional_asserts (basic_block bb, tree last)
3751 {
3752   bool need_assert;
3753   block_stmt_iterator bsi;
3754   tree op;
3755   edge_iterator ei;
3756   edge e;
3757   ssa_op_iter iter;
3758
3759   need_assert = false;
3760   bsi = bsi_for_stmt (last);
3761
3762   /* Look for uses of the operands in each of the sub-graphs
3763      rooted at BB.  We need to check each of the outgoing edges
3764      separately, so that we know what kind of ASSERT_EXPR to
3765      insert.  */
3766   FOR_EACH_EDGE (e, ei, bb->succs)
3767     {
3768       if (e->dest == bb)
3769         continue;
3770
3771       /* Remove the COND_EXPR operands from the FOUND_IN_SUBGRAPH bitmap.
3772          Otherwise, when we finish traversing each of the sub-graphs, we
3773          won't know whether the variables were found in the sub-graphs or
3774          if they had been found in a block upstream from BB. 
3775
3776          This is actually a bad idea is some cases, particularly jump
3777          threading.  Consider a CFG like the following:
3778
3779                     0
3780                    /|
3781                   1 |
3782                    \|
3783                     2
3784                    / \
3785                   3   4
3786
3787          Assume that one or more operands in the conditional at the
3788          end of block 0 are used in a conditional in block 2, but not
3789          anywhere in block 1.  In this case we will not insert any
3790          assert statements in block 1, which may cause us to miss
3791          opportunities to optimize, particularly for jump threading.  */
3792       FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
3793         RESET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
3794
3795       /* Traverse the strictly dominated sub-graph rooted at E->DEST
3796          to determine if any of the operands in the conditional
3797          predicate are used.  */
3798       if (e->dest != bb)
3799         need_assert |= find_assert_locations (e->dest);
3800
3801       /* Register the necessary assertions for each operand in the
3802          conditional predicate.  */
3803       FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
3804         need_assert |= register_edge_assert_for (op, e, bsi,
3805                                                  COND_EXPR_COND (last));
3806     }
3807
3808   /* Finally, indicate that we have found the operands in the
3809      conditional.  */
3810   FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
3811     SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
3812
3813   return need_assert;
3814 }
3815
3816 /* Compare two case labels sorting first by the destination label uid
3817    and then by the case value.  */
3818
3819 static int
3820 compare_case_labels (const void *p1, const void *p2)
3821 {
3822   tree case1 = *(tree *)p1;
3823   tree case2 = *(tree *)p2;
3824   unsigned int uid1 = DECL_UID (CASE_LABEL (case1));
3825   unsigned int uid2 = DECL_UID (CASE_LABEL (case2));
3826
3827   if (uid1 < uid2)
3828     return -1;
3829   else if (uid1 == uid2)
3830     {
3831       /* Make sure the default label is first in a group.  */
3832       if (!CASE_LOW (case1))
3833         return -1;
3834       else if (!CASE_LOW (case2))
3835         return 1;
3836       else
3837         return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
3838     }
3839   else
3840     return 1;
3841 }
3842
3843 /* Determine whether the outgoing edges of BB should receive an
3844    ASSERT_EXPR for each of the operands of BB's LAST statement.
3845    The last statement of BB must be a SWITCH_EXPR.
3846
3847    If any of the sub-graphs rooted at BB have an interesting use of
3848    the predicate operands, an assert location node is added to the
3849    list of assertions for the corresponding operands.  */
3850
3851 static bool
3852 find_switch_asserts (basic_block bb, tree last)
3853 {
3854   bool need_assert;
3855   block_stmt_iterator bsi;
3856   tree op, cond;
3857   edge e;
3858   tree vec = SWITCH_LABELS (last), vec2;
3859   size_t n = TREE_VEC_LENGTH (vec);
3860   unsigned int idx;
3861
3862   need_assert = false;
3863   bsi = bsi_for_stmt (last);
3864   op = TREE_OPERAND (last, 0);
3865   if (TREE_CODE (op) != SSA_NAME)
3866     return false;
3867
3868   /* Build a vector of case labels sorted by destination label.  */
3869   vec2 = make_tree_vec (n);
3870   for (idx = 0; idx < n; ++idx)
3871     TREE_VEC_ELT (vec2, idx) = TREE_VEC_ELT (vec, idx);
3872   qsort (&TREE_VEC_ELT (vec2, 0), n, sizeof (tree), compare_case_labels);
3873
3874   for (idx = 0; idx < n; ++idx)
3875     {
3876       tree min, max;
3877       tree cl = TREE_VEC_ELT (vec2, idx);
3878
3879       min = CASE_LOW (cl);
3880       max = CASE_HIGH (cl);
3881
3882       /* If there are multiple case labels with the same destination
3883          we need to combine them to a single value range for the edge.  */
3884       if (idx + 1 < n
3885           && CASE_LABEL (cl) == CASE_LABEL (TREE_VEC_ELT (vec2, idx + 1)))
3886         {
3887           /* Skip labels until the last of the group.  */
3888           do {
3889             ++idx;
3890           } while (idx < n
3891                    && CASE_LABEL (cl) == CASE_LABEL (TREE_VEC_ELT (vec2, idx)));
3892           --idx;
3893
3894           /* Pick up the maximum of the case label range.  */
3895           if (CASE_HIGH (TREE_VEC_ELT (vec2, idx)))
3896             max = CASE_HIGH (TREE_VEC_ELT (vec2, idx));
3897           else
3898             max = CASE_LOW (TREE_VEC_ELT (vec2, idx));
3899         }
3900
3901       /* Nothing to do if the range includes the default label until we
3902          can register anti-ranges.  */
3903       if (min == NULL_TREE)
3904         continue;
3905
3906       /* Find the edge to register the assert expr on.  */
3907       e = find_edge (bb, label_to_block (CASE_LABEL (cl)));
3908
3909       /* Remove the SWITCH_EXPR operand from the FOUND_IN_SUBGRAPH bitmap.
3910          Otherwise, when we finish traversing each of the sub-graphs, we
3911          won't know whether the variables were found in the sub-graphs or
3912          if they had been found in a block upstream from BB.  */
3913       RESET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
3914
3915       /* Traverse the strictly dominated sub-graph rooted at E->DEST
3916          to determine if any of the operands in the conditional
3917          predicate are used.  */
3918       if (e->dest != bb)
3919         need_assert |= find_assert_locations (e->dest);
3920
3921       /* Register the necessary assertions for the operand in the
3922          SWITCH_EXPR.  */
3923       cond = build2 (max ? GE_EXPR : EQ_EXPR, boolean_type_node,
3924                      op, fold_convert (TREE_TYPE (op), min));
3925       need_assert |= register_edge_assert_for (op, e, bsi, cond);
3926       if (max)
3927         {
3928           cond = build2 (LE_EXPR, boolean_type_node,
3929                          op, fold_convert (TREE_TYPE (op), max));
3930           need_assert |= register_edge_assert_for (op, e, bsi, cond);
3931         }
3932     }
3933
3934   /* Finally, indicate that we have found the operand in the
3935      SWITCH_EXPR.  */
3936   SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
3937
3938   return need_assert;
3939 }
3940
3941
3942 /* Traverse all the statements in block BB looking for statements that
3943    may generate useful assertions for the SSA names in their operand.
3944    If a statement produces a useful assertion A for name N_i, then the
3945    list of assertions already generated for N_i is scanned to
3946    determine if A is actually needed.
3947    
3948    If N_i already had the assertion A at a location dominating the
3949    current location, then nothing needs to be done.  Otherwise, the
3950    new location for A is recorded instead.
3951
3952    1- For every statement S in BB, all the variables used by S are
3953       added to bitmap FOUND_IN_SUBGRAPH.
3954
3955    2- If statement S uses an operand N in a way that exposes a known
3956       value range for N, then if N was not already generated by an
3957       ASSERT_EXPR, create a new assert location for N.  For instance,
3958       if N is a pointer and the statement dereferences it, we can
3959       assume that N is not NULL.
3960
3961    3- COND_EXPRs are a special case of #2.  We can derive range
3962       information from the predicate but need to insert different
3963       ASSERT_EXPRs for each of the sub-graphs rooted at the
3964       conditional block.  If the last statement of BB is a conditional
3965       expression of the form 'X op Y', then
3966
3967       a) Remove X and Y from the set FOUND_IN_SUBGRAPH.
3968
3969       b) If the conditional is the only entry point to the sub-graph
3970          corresponding to the THEN_CLAUSE, recurse into it.  On
3971          return, if X and/or Y are marked in FOUND_IN_SUBGRAPH, then
3972          an ASSERT_EXPR is added for the corresponding variable.
3973
3974       c) Repeat step (b) on the ELSE_CLAUSE.
3975
3976       d) Mark X and Y in FOUND_IN_SUBGRAPH.
3977
3978       For instance,
3979
3980             if (a == 9)
3981               b = a;
3982             else
3983               b = c + 1;
3984
3985       In this case, an assertion on the THEN clause is useful to
3986       determine that 'a' is always 9 on that edge.  However, an assertion
3987       on the ELSE clause would be unnecessary.
3988
3989    4- If BB does not end in a conditional expression, then we recurse
3990       into BB's dominator children.
3991    
3992    At the end of the recursive traversal, every SSA name will have a
3993    list of locations where ASSERT_EXPRs should be added.  When a new
3994    location for name N is found, it is registered by calling
3995    register_new_assert_for.  That function keeps track of all the
3996    registered assertions to prevent adding unnecessary assertions.
3997    For instance, if a pointer P_4 is dereferenced more than once in a
3998    dominator tree, only the location dominating all the dereference of
3999    P_4 will receive an ASSERT_EXPR.
4000
4001    If this function returns true, then it means that there are names
4002    for which we need to generate ASSERT_EXPRs.  Those assertions are
4003    inserted by process_assert_insertions.  */
4004
4005 static bool
4006 find_assert_locations (basic_block bb)
4007 {
4008   block_stmt_iterator si;
4009   tree last, phi;
4010   bool need_assert;
4011   basic_block son;
4012
4013   if (TEST_BIT (blocks_visited, bb->index))
4014     return false;
4015
4016   SET_BIT (blocks_visited, bb->index);
4017
4018   need_assert = false;
4019
4020   /* Traverse all PHI nodes in BB marking used operands.  */
4021   for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
4022     {
4023       use_operand_p arg_p;
4024       ssa_op_iter i;
4025
4026       FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_USE)
4027         {
4028           tree arg = USE_FROM_PTR (arg_p);
4029           if (TREE_CODE (arg) == SSA_NAME)
4030             {
4031               gcc_assert (is_gimple_reg (PHI_RESULT (phi)));
4032               SET_BIT (found_in_subgraph, SSA_NAME_VERSION (arg));
4033             }
4034         }
4035     }
4036
4037   /* Traverse all the statements in BB marking used names and looking
4038      for statements that may infer assertions for their used operands.  */
4039   last = NULL_TREE;
4040   for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
4041     {
4042       tree stmt, op;
4043       ssa_op_iter i;
4044
4045       stmt = bsi_stmt (si);
4046
4047       /* See if we can derive an assertion for any of STMT's operands.  */
4048       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
4049         {
4050           tree value;
4051           enum tree_code comp_code;
4052
4053           /* Mark OP in bitmap FOUND_IN_SUBGRAPH.  If STMT is inside
4054              the sub-graph of a conditional block, when we return from
4055              this recursive walk, our parent will use the
4056              FOUND_IN_SUBGRAPH bitset to determine if one of the
4057              operands it was looking for was present in the sub-graph.  */
4058           SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
4059
4060           /* If OP is used in such a way that we can infer a value
4061              range for it, and we don't find a previous assertion for
4062              it, create a new assertion location node for OP.  */
4063           if (infer_value_range (stmt, op, &comp_code, &value))
4064             {
4065               /* If we are able to infer a nonzero value range for OP,
4066                  then walk backwards through the use-def chain to see if OP
4067                  was set via a typecast.
4068
4069                  If so, then we can also infer a nonzero value range
4070                  for the operand of the NOP_EXPR.  */
4071               if (comp_code == NE_EXPR && integer_zerop (value))
4072                 {
4073                   tree t = op;
4074                   tree def_stmt = SSA_NAME_DEF_STMT (t);
4075         
4076                   while (TREE_CODE (def_stmt) == GIMPLE_MODIFY_STMT
4077                          && TREE_CODE
4078                              (GIMPLE_STMT_OPERAND (def_stmt, 1)) == NOP_EXPR
4079                          && TREE_CODE
4080                              (TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1),
4081                                             0)) == SSA_NAME
4082                          && POINTER_TYPE_P
4083                              (TREE_TYPE (TREE_OPERAND
4084                                           (GIMPLE_STMT_OPERAND (def_stmt,
4085                                                                 1), 0))))
4086                     {
4087                       t = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 0);
4088                       def_stmt = SSA_NAME_DEF_STMT (t);
4089
4090                       /* Note we want to register the assert for the
4091                          operand of the NOP_EXPR after SI, not after the
4092                          conversion.  */
4093                       if (! has_single_use (t))
4094                         {
4095                           register_new_assert_for (t, comp_code, value,
4096                                                    bb, NULL, si);
4097                           need_assert = true;
4098                         }
4099                     }
4100                 }
4101
4102               /* If OP is used only once, namely in this STMT, don't
4103                  bother creating an ASSERT_EXPR for it.  Such an
4104                  ASSERT_EXPR would do nothing but increase compile time.  */
4105               if (!has_single_use (op))
4106                 {
4107                   register_new_assert_for (op, comp_code, value, bb, NULL, si);
4108                   need_assert = true;
4109                 }
4110             }
4111         }
4112
4113       /* Remember the last statement of the block.  */
4114       last = stmt;
4115     }
4116
4117   /* If BB's last statement is a conditional expression
4118      involving integer operands, recurse into each of the sub-graphs
4119      rooted at BB to determine if we need to add ASSERT_EXPRs.  */
4120   if (last
4121       && TREE_CODE (last) == COND_EXPR
4122       && !fp_predicate (COND_EXPR_COND (last))
4123       && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
4124     need_assert |= find_conditional_asserts (bb, last);
4125
4126   if (last
4127       && TREE_CODE (last) == SWITCH_EXPR
4128       && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
4129     need_assert |= find_switch_asserts (bb, last);
4130
4131   /* Recurse into the dominator children of BB.  */
4132   for (son = first_dom_son (CDI_DOMINATORS, bb);
4133        son;
4134        son = next_dom_son (CDI_DOMINATORS, son))
4135     need_assert |= find_assert_locations (son);
4136
4137   return need_assert;
4138 }
4139
4140
4141 /* Create an ASSERT_EXPR for NAME and insert it in the location
4142    indicated by LOC.  Return true if we made any edge insertions.  */
4143
4144 static bool
4145 process_assert_insertions_for (tree name, assert_locus_t loc)
4146 {
4147   /* Build the comparison expression NAME_i COMP_CODE VAL.  */
4148   tree stmt, cond, assert_expr;
4149   edge_iterator ei;
4150   edge e;
4151
4152   cond = build2 (loc->comp_code, boolean_type_node, name, loc->val);
4153   assert_expr = build_assert_expr_for (cond, name);
4154
4155   if (loc->e)
4156     {
4157       /* We have been asked to insert the assertion on an edge.  This
4158          is used only by COND_EXPR and SWITCH_EXPR assertions.  */
4159 #if defined ENABLE_CHECKING
4160       gcc_assert (TREE_CODE (bsi_stmt (loc->si)) == COND_EXPR
4161           || TREE_CODE (bsi_stmt (loc->si)) == SWITCH_EXPR);
4162 #endif
4163
4164       bsi_insert_on_edge (loc->e, assert_expr);
4165       return true;
4166     }
4167
4168   /* Otherwise, we can insert right after LOC->SI iff the
4169      statement must not be the last statement in the block.  */
4170   stmt = bsi_stmt (loc->si);
4171   if (!stmt_ends_bb_p (stmt))
4172     {
4173       bsi_insert_after (&loc->si, assert_expr, BSI_SAME_STMT);
4174       return false;
4175     }
4176
4177   /* If STMT must be the last statement in BB, we can only insert new
4178      assertions on the non-abnormal edge out of BB.  Note that since
4179      STMT is not control flow, there may only be one non-abnormal edge
4180      out of BB.  */
4181   FOR_EACH_EDGE (e, ei, loc->bb->succs)
4182     if (!(e->flags & EDGE_ABNORMAL))
4183       {
4184         bsi_insert_on_edge (e, assert_expr);
4185         return true;
4186       }
4187
4188   gcc_unreachable ();
4189 }
4190
4191
4192 /* Process all the insertions registered for every name N_i registered
4193    in NEED_ASSERT_FOR.  The list of assertions to be inserted are
4194    found in ASSERTS_FOR[i].  */
4195
4196 static void
4197 process_assert_insertions (void)
4198 {
4199   unsigned i;
4200   bitmap_iterator bi;
4201   bool update_edges_p = false;
4202   int num_asserts = 0;
4203
4204   if (dump_file && (dump_flags & TDF_DETAILS))
4205     dump_all_asserts (dump_file);
4206
4207   EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
4208     {
4209       assert_locus_t loc = asserts_for[i];
4210       gcc_assert (loc);
4211
4212       while (loc)
4213         {
4214           assert_locus_t next = loc->next;
4215           update_edges_p |= process_assert_insertions_for (ssa_name (i), loc);
4216           free (loc);
4217           loc = next;
4218           num_asserts++;
4219         }
4220     }
4221
4222   if (update_edges_p)
4223     bsi_commit_edge_inserts ();
4224
4225   if (dump_file && (dump_flags & TDF_STATS))
4226     fprintf (dump_file, "\nNumber of ASSERT_EXPR expressions inserted: %d\n\n",
4227              num_asserts);
4228 }
4229
4230
4231 /* Traverse the flowgraph looking for conditional jumps to insert range
4232    expressions.  These range expressions are meant to provide information
4233    to optimizations that need to reason in terms of value ranges.  They
4234    will not be expanded into RTL.  For instance, given:
4235
4236    x = ...
4237    y = ...
4238    if (x < y)
4239      y = x - 2;
4240    else
4241      x = y + 3;
4242
4243    this pass will transform the code into:
4244
4245    x = ...
4246    y = ...
4247    if (x < y)
4248     {
4249       x = ASSERT_EXPR <x, x < y>
4250       y = x - 2
4251     }
4252    else
4253     {
4254       y = ASSERT_EXPR <y, x <= y>
4255       x = y + 3
4256     }
4257
4258    The idea is that once copy and constant propagation have run, other
4259    optimizations will be able to determine what ranges of values can 'x'
4260    take in different paths of the code, simply by checking the reaching
4261    definition of 'x'.  */
4262
4263 static void
4264 insert_range_assertions (void)
4265 {
4266   edge e;
4267   edge_iterator ei;
4268   bool update_ssa_p;
4269   
4270   found_in_subgraph = sbitmap_alloc (num_ssa_names);
4271   sbitmap_zero (found_in_subgraph);
4272
4273   blocks_visited = sbitmap_alloc (last_basic_block);
4274   sbitmap_zero (blocks_visited);
4275
4276   need_assert_for = BITMAP_ALLOC (NULL);
4277   asserts_for = XCNEWVEC (assert_locus_t, num_ssa_names);
4278
4279   calculate_dominance_info (CDI_DOMINATORS);
4280
4281   update_ssa_p = false;
4282   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
4283     if (find_assert_locations (e->dest))
4284       update_ssa_p = true;
4285
4286   if (update_ssa_p)
4287     {
4288       process_assert_insertions ();
4289       update_ssa (TODO_update_ssa_no_phi);
4290     }
4291
4292   if (dump_file && (dump_flags & TDF_DETAILS))
4293     {
4294       fprintf (dump_file, "\nSSA form after inserting ASSERT_EXPRs\n");
4295       dump_function_to_file (current_function_decl, dump_file, dump_flags);
4296     }
4297
4298   sbitmap_free (found_in_subgraph);
4299   free (asserts_for);
4300   BITMAP_FREE (need_assert_for);
4301 }
4302
4303 /* Checks one ARRAY_REF in REF, located at LOCUS. Ignores flexible arrays
4304    and "struct" hacks. If VRP can determine that the
4305    array subscript is a constant, check if it is outside valid
4306    range. If the array subscript is a RANGE, warn if it is
4307    non-overlapping with valid range.
4308    IGNORE_OFF_BY_ONE is true if the ARRAY_REF is inside a ADDR_EXPR.  */
4309
4310 static void
4311 check_array_ref (tree ref, location_t* locus, bool ignore_off_by_one)
4312 {
4313   value_range_t* vr = NULL;
4314   tree low_sub, up_sub;
4315   tree low_bound, up_bound = array_ref_up_bound (ref);
4316
4317   low_sub = up_sub = TREE_OPERAND (ref, 1);
4318
4319   if (!up_bound || !locus || TREE_NO_WARNING (ref)
4320       || TREE_CODE (up_bound) != INTEGER_CST
4321       /* Can not check flexible arrays.  */
4322       || (TYPE_SIZE (TREE_TYPE (ref)) == NULL_TREE
4323           && TYPE_DOMAIN (TREE_TYPE (ref)) != NULL_TREE
4324           && TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (ref))) == NULL_TREE)
4325       /* Accesses after the end of arrays of size 0 (gcc
4326          extension) and 1 are likely intentional ("struct
4327          hack").  */
4328       || compare_tree_int (up_bound, 1) <= 0)
4329     return;
4330
4331   low_bound = array_ref_low_bound (ref);
4332
4333   if (TREE_CODE (low_sub) == SSA_NAME)
4334     {
4335       vr = get_value_range (low_sub);
4336       if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
4337         {
4338           low_sub = vr->type == VR_RANGE ? vr->max : vr->min;
4339           up_sub = vr->type == VR_RANGE ? vr->min : vr->max;
4340         }
4341     }
4342
4343   if (vr && vr->type == VR_ANTI_RANGE)
4344     {
4345       if (TREE_CODE (up_sub) == INTEGER_CST
4346           && tree_int_cst_lt (up_bound, up_sub)
4347           && TREE_CODE (low_sub) == INTEGER_CST
4348           && tree_int_cst_lt (low_sub, low_bound))
4349         {
4350           warning (OPT_Warray_bounds,
4351                    "%Harray subscript is outside array bounds", locus);
4352           TREE_NO_WARNING (ref) = 1;
4353         }
4354     }
4355   else if (TREE_CODE (up_sub) == INTEGER_CST
4356            && tree_int_cst_lt (up_bound, up_sub)
4357            && !tree_int_cst_equal (up_bound, up_sub)
4358            && (!ignore_off_by_one
4359                || !tree_int_cst_equal (int_const_binop (PLUS_EXPR,
4360                                                         up_bound,
4361                                                         integer_one_node,
4362                                                         0),
4363                                        up_sub)))
4364     {
4365       warning (OPT_Warray_bounds, "%Harray subscript is above array bounds",
4366                locus);
4367       TREE_NO_WARNING (ref) = 1;
4368     }
4369   else if (TREE_CODE (low_sub) == INTEGER_CST
4370            && tree_int_cst_lt (low_sub, low_bound))
4371     {
4372       warning (OPT_Warray_bounds, "%Harray subscript is below array bounds",
4373                locus);
4374       TREE_NO_WARNING (ref) = 1;
4375     }
4376 }
4377
4378 /* Searches if the expr T, located at LOCATION computes
4379    address of an ARRAY_REF, and call check_array_ref on it.  */
4380
4381 static void
4382 search_for_addr_array(tree t, location_t* location)
4383 {
4384   while (TREE_CODE (t) == SSA_NAME)
4385     {
4386       t = SSA_NAME_DEF_STMT (t);
4387       if (TREE_CODE (t) != GIMPLE_MODIFY_STMT)
4388         return;
4389       t = GIMPLE_STMT_OPERAND (t, 1);
4390     }
4391
4392
4393   /* We are only interested in addresses of ARRAY_REF's.  */
4394   if (TREE_CODE (t) != ADDR_EXPR) 
4395     return;
4396
4397   /* Check each ARRAY_REFs in the reference chain. */
4398   do 
4399     {
4400       if (TREE_CODE (t) == ARRAY_REF)
4401         check_array_ref (t, location, true /*ignore_off_by_one*/);
4402
4403       t = TREE_OPERAND(t,0);
4404     }
4405   while (handled_component_p (t));
4406 }
4407
4408 /* walk_tree() callback that checks if *TP is
4409    an ARRAY_REF inside an ADDR_EXPR (in which an array
4410    subscript one outside the valid range is allowed). Call
4411    check_array_ref for each ARRAY_REF found. The location is 
4412    passed in DATA.  */
4413
4414 static tree
4415 check_array_bounds (tree *tp, int *walk_subtree, void *data)
4416 {
4417   tree t = *tp;
4418   tree stmt = (tree)data;
4419   location_t *location = EXPR_LOCUS (stmt);
4420
4421   *walk_subtree = TRUE;
4422
4423   if (TREE_CODE (t) == ARRAY_REF)
4424     check_array_ref (t, location, false /*ignore_off_by_one*/);
4425
4426   if (TREE_CODE (t) == INDIRECT_REF
4427       || (TREE_CODE (t) == RETURN_EXPR && TREE_OPERAND (t, 0)))
4428     search_for_addr_array (TREE_OPERAND (t, 0), location);
4429   else if (TREE_CODE (t) == CALL_EXPR)
4430     {
4431       tree arg;
4432       call_expr_arg_iterator iter;
4433
4434       FOR_EACH_CALL_EXPR_ARG (arg, iter, t) 
4435         search_for_addr_array (arg, location);
4436     }
4437
4438   if (TREE_CODE (t) == ADDR_EXPR)
4439     *walk_subtree = FALSE;
4440
4441   return NULL_TREE;
4442 }
4443
4444 /* Walk over all statements of all reachable BBs and call check_array_bounds
4445    on them.  */
4446
4447 static void
4448 check_all_array_refs (void)
4449 {
4450   basic_block bb;
4451   block_stmt_iterator si;
4452
4453   FOR_EACH_BB (bb)
4454     {
4455       /* Skip bb's that are clearly unreachable.  */
4456       if (single_pred_p (bb))
4457       {
4458         basic_block pred_bb = EDGE_PRED (bb, 0)->src;
4459         tree ls = NULL_TREE;
4460
4461         if (!bsi_end_p (bsi_last (pred_bb)))
4462           ls = bsi_stmt (bsi_last (pred_bb));
4463
4464         if (ls && TREE_CODE (ls) == COND_EXPR
4465             && ((COND_EXPR_COND (ls) == boolean_false_node
4466                  && (EDGE_PRED (bb, 0)->flags & EDGE_TRUE_VALUE))
4467                 || (COND_EXPR_COND (ls) == boolean_true_node
4468                     && (EDGE_PRED (bb, 0)->flags & EDGE_FALSE_VALUE))))
4469           continue;
4470       }
4471       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
4472         walk_tree (bsi_stmt_ptr (si), check_array_bounds,
4473                    bsi_stmt (si), NULL);
4474     }
4475 }
4476
4477 /* Convert range assertion expressions into the implied copies and
4478    copy propagate away the copies.  Doing the trivial copy propagation
4479    here avoids the need to run the full copy propagation pass after
4480    VRP. 
4481    
4482    FIXME, this will eventually lead to copy propagation removing the
4483    names that had useful range information attached to them.  For
4484    instance, if we had the assertion N_i = ASSERT_EXPR <N_j, N_j > 3>,
4485    then N_i will have the range [3, +INF].
4486    
4487    However, by converting the assertion into the implied copy
4488    operation N_i = N_j, we will then copy-propagate N_j into the uses
4489    of N_i and lose the range information.  We may want to hold on to
4490    ASSERT_EXPRs a little while longer as the ranges could be used in
4491    things like jump threading.
4492    
4493    The problem with keeping ASSERT_EXPRs around is that passes after
4494    VRP need to handle them appropriately. 
4495
4496    Another approach would be to make the range information a first
4497    class property of the SSA_NAME so that it can be queried from
4498    any pass.  This is made somewhat more complex by the need for
4499    multiple ranges to be associated with one SSA_NAME.  */
4500
4501 static void
4502 remove_range_assertions (void)
4503 {
4504   basic_block bb;
4505   block_stmt_iterator si;
4506
4507   /* Note that the BSI iterator bump happens at the bottom of the
4508      loop and no bump is necessary if we're removing the statement
4509      referenced by the current BSI.  */
4510   FOR_EACH_BB (bb)
4511     for (si = bsi_start (bb); !bsi_end_p (si);)
4512       {
4513         tree stmt = bsi_stmt (si);
4514         tree use_stmt;
4515
4516         if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
4517             && TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 1)) == ASSERT_EXPR)
4518           {
4519             tree rhs = GIMPLE_STMT_OPERAND (stmt, 1), var;
4520             tree cond = fold (ASSERT_EXPR_COND (rhs));
4521             use_operand_p use_p;
4522             imm_use_iterator iter;
4523
4524             gcc_assert (cond != boolean_false_node);
4525
4526             /* Propagate the RHS into every use of the LHS.  */
4527             var = ASSERT_EXPR_VAR (rhs);
4528             FOR_EACH_IMM_USE_STMT (use_stmt, iter,
4529                                    GIMPLE_STMT_OPERAND (stmt, 0))
4530               FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
4531                 {
4532                   SET_USE (use_p, var);
4533                   gcc_assert (TREE_CODE (var) == SSA_NAME);
4534                 }
4535
4536             /* And finally, remove the copy, it is not needed.  */
4537             bsi_remove (&si, true);
4538             release_defs (stmt); 
4539           }
4540         else
4541           bsi_next (&si);
4542       }
4543
4544   sbitmap_free (blocks_visited);
4545 }
4546
4547
4548 /* Return true if STMT is interesting for VRP.  */
4549
4550 static bool
4551 stmt_interesting_for_vrp (tree stmt)
4552 {
4553   if (TREE_CODE (stmt) == PHI_NODE
4554       && is_gimple_reg (PHI_RESULT (stmt))
4555       && (INTEGRAL_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))
4556           || POINTER_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))))
4557     return true;
4558   else if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT)
4559     {
4560       tree lhs = GIMPLE_STMT_OPERAND (stmt, 0);
4561       tree rhs = GIMPLE_STMT_OPERAND (stmt, 1);
4562
4563       /* In general, assignments with virtual operands are not useful
4564          for deriving ranges, with the obvious exception of calls to
4565          builtin functions.  */
4566       if (TREE_CODE (lhs) == SSA_NAME
4567           && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
4568               || POINTER_TYPE_P (TREE_TYPE (lhs)))
4569           && ((TREE_CODE (rhs) == CALL_EXPR
4570                && TREE_CODE (CALL_EXPR_FN (rhs)) == ADDR_EXPR
4571                && DECL_P (TREE_OPERAND (CALL_EXPR_FN (rhs), 0))
4572                && DECL_IS_BUILTIN (TREE_OPERAND (CALL_EXPR_FN (rhs), 0)))
4573               || ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS)))
4574         return true;
4575     }
4576   else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
4577     return true;
4578
4579   return false;
4580 }
4581
4582
4583 /* Initialize local data structures for VRP.  */
4584
4585 static void
4586 vrp_initialize (void)
4587 {
4588   basic_block bb;
4589
4590   vr_value = XCNEWVEC (value_range_t *, num_ssa_names);
4591   vr_phi_edge_counts = XCNEWVEC (int, num_ssa_names);
4592
4593   FOR_EACH_BB (bb)
4594     {
4595       block_stmt_iterator si;
4596       tree phi;
4597
4598       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
4599         {
4600           if (!stmt_interesting_for_vrp (phi))
4601             {
4602               tree lhs = PHI_RESULT (phi);
4603               set_value_range_to_varying (get_value_range (lhs));
4604               DONT_SIMULATE_AGAIN (phi) = true;
4605             }
4606           else
4607             DONT_SIMULATE_AGAIN (phi) = false;
4608         }
4609
4610       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
4611         {
4612           tree stmt = bsi_stmt (si);
4613
4614           if (!stmt_interesting_for_vrp (stmt))
4615             {
4616               ssa_op_iter i;
4617               tree def;
4618               FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
4619                 set_value_range_to_varying (get_value_range (def));
4620               DONT_SIMULATE_AGAIN (stmt) = true;
4621             }
4622           else
4623             {
4624               DONT_SIMULATE_AGAIN (stmt) = false;
4625             }
4626         }
4627     }
4628 }
4629
4630
4631 /* Visit assignment STMT.  If it produces an interesting range, record
4632    the SSA name in *OUTPUT_P.  */
4633
4634 static enum ssa_prop_result
4635 vrp_visit_assignment (tree stmt, tree *output_p)
4636 {
4637   tree lhs, rhs, def;
4638   ssa_op_iter iter;
4639
4640   lhs = GIMPLE_STMT_OPERAND (stmt, 0);
4641   rhs = GIMPLE_STMT_OPERAND (stmt, 1);
4642
4643   /* We only keep track of ranges in integral and pointer types.  */
4644   if (TREE_CODE (lhs) == SSA_NAME
4645       && ((INTEGRAL_TYPE_P (TREE_TYPE (lhs))
4646            /* It is valid to have NULL MIN/MAX values on a type.  See
4647               build_range_type.  */
4648            && TYPE_MIN_VALUE (TREE_TYPE (lhs))
4649            && TYPE_MAX_VALUE (TREE_TYPE (lhs)))
4650           || POINTER_TYPE_P (TREE_TYPE (lhs))))
4651     {
4652       struct loop *l;
4653       value_range_t new_vr = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
4654
4655       extract_range_from_expr (&new_vr, rhs);
4656
4657       /* If STMT is inside a loop, we may be able to know something
4658          else about the range of LHS by examining scalar evolution
4659          information.  */
4660       if (current_loops && (l = loop_containing_stmt (stmt)))
4661         adjust_range_with_scev (&new_vr, l, stmt, lhs);
4662
4663       if (update_value_range (lhs, &new_vr))
4664         {
4665           *output_p = lhs;
4666
4667           if (dump_file && (dump_flags & TDF_DETAILS))
4668             {
4669               fprintf (dump_file, "Found new range for ");
4670               print_generic_expr (dump_file, lhs, 0);
4671               fprintf (dump_file, ": ");
4672               dump_value_range (dump_file, &new_vr);
4673               fprintf (dump_file, "\n\n");
4674             }
4675
4676           if (new_vr.type == VR_VARYING)
4677             return SSA_PROP_VARYING;
4678
4679           return SSA_PROP_INTERESTING;
4680         }
4681
4682       return SSA_PROP_NOT_INTERESTING;
4683     }
4684   
4685   /* Every other statement produces no useful ranges.  */
4686   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
4687     set_value_range_to_varying (get_value_range (def));
4688
4689   return SSA_PROP_VARYING;
4690 }
4691
4692 /* Helper that gets the value range of the SSA_NAME with version I
4693    or a symbolic range containing the SSA_NAME only if the value range
4694    is varying or undefined.  */
4695
4696 static inline value_range_t
4697 get_vr_for_comparison (int i)
4698 {
4699   value_range_t vr = *(vr_value[i]);
4700
4701   /* If name N_i does not have a valid range, use N_i as its own
4702      range.  This allows us to compare against names that may
4703      have N_i in their ranges.  */
4704   if (vr.type == VR_VARYING || vr.type == VR_UNDEFINED)
4705     {
4706       vr.type = VR_RANGE;
4707       vr.min = ssa_name (i);
4708       vr.max = ssa_name (i);
4709     }
4710
4711   return vr;
4712 }
4713
4714 /* Compare all the value ranges for names equivalent to VAR with VAL
4715    using comparison code COMP.  Return the same value returned by
4716    compare_range_with_value, including the setting of
4717    *STRICT_OVERFLOW_P.  */
4718
4719 static tree
4720 compare_name_with_value (enum tree_code comp, tree var, tree val,
4721                          bool *strict_overflow_p)
4722 {
4723   bitmap_iterator bi;
4724   unsigned i;
4725   bitmap e;
4726   tree retval, t;
4727   int used_strict_overflow;
4728   bool sop;
4729   value_range_t equiv_vr;
4730
4731   /* Get the set of equivalences for VAR.  */
4732   e = get_value_range (var)->equiv;
4733
4734   /* Start at -1.  Set it to 0 if we do a comparison without relying
4735      on overflow, or 1 if all comparisons rely on overflow.  */
4736   used_strict_overflow = -1;
4737
4738   /* Compare vars' value range with val.  */
4739   equiv_vr = get_vr_for_comparison (SSA_NAME_VERSION (var));
4740   sop = false;
4741   retval = compare_range_with_value (comp, &equiv_vr, val, &sop);
4742   if (retval)
4743     used_strict_overflow = sop ? 1 : 0;
4744
4745   /* If the equiv set is empty we have done all work we need to do.  */
4746   if (e == NULL)
4747     {
4748       if (retval
4749           && used_strict_overflow > 0)
4750         *strict_overflow_p = true;
4751       return retval;
4752     }
4753
4754   EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
4755     {
4756       equiv_vr = get_vr_for_comparison (i);
4757       sop = false;
4758       t = compare_range_with_value (comp, &equiv_vr, val, &sop);
4759       if (t)
4760         {
4761           /* If we get different answers from different members
4762              of the equivalence set this check must be in a dead
4763              code region.  Folding it to a trap representation
4764              would be correct here.  For now just return don't-know.  */
4765           if (retval != NULL
4766               && t != retval)
4767             {
4768               retval = NULL_TREE;
4769               break;
4770             }
4771           retval = t;
4772
4773           if (!sop)
4774             used_strict_overflow = 0;
4775           else if (used_strict_overflow < 0)
4776             used_strict_overflow = 1;
4777         }
4778     }
4779
4780   if (retval
4781       && used_strict_overflow > 0)
4782     *strict_overflow_p = true;
4783
4784   return retval;
4785 }
4786
4787
4788 /* Given a comparison code COMP and names N1 and N2, compare all the
4789    ranges equivalent to N1 against all the ranges equivalent to N2
4790    to determine the value of N1 COMP N2.  Return the same value
4791    returned by compare_ranges.  Set *STRICT_OVERFLOW_P to indicate
4792    whether we relied on an overflow infinity in the comparison.  */
4793
4794
4795 static tree
4796 compare_names (enum tree_code comp, tree n1, tree n2,
4797                bool *strict_overflow_p)
4798 {
4799   tree t, retval;
4800   bitmap e1, e2;
4801   bitmap_iterator bi1, bi2;
4802   unsigned i1, i2;
4803   int used_strict_overflow;
4804   static bitmap_obstack *s_obstack = NULL;
4805   static bitmap s_e1 = NULL, s_e2 = NULL;
4806
4807   /* Compare the ranges of every name equivalent to N1 against the
4808      ranges of every name equivalent to N2.  */
4809   e1 = get_value_range (n1)->equiv;
4810   e2 = get_value_range (n2)->equiv;
4811
4812   /* Use the fake bitmaps if e1 or e2 are not available.  */
4813   if (s_obstack == NULL)
4814     {
4815       s_obstack = XNEW (bitmap_obstack);
4816       bitmap_obstack_initialize (s_obstack);
4817       s_e1 = BITMAP_ALLOC (s_obstack);
4818       s_e2 = BITMAP_ALLOC (s_obstack);
4819     }
4820   if (e1 == NULL)
4821     e1 = s_e1;
4822   if (e2 == NULL)
4823     e2 = s_e2;
4824
4825   /* Add N1 and N2 to their own set of equivalences to avoid
4826      duplicating the body of the loop just to check N1 and N2
4827      ranges.  */
4828   bitmap_set_bit (e1, SSA_NAME_VERSION (n1));
4829   bitmap_set_bit (e2, SSA_NAME_VERSION (n2));
4830
4831   /* If the equivalence sets have a common intersection, then the two
4832      names can be compared without checking their ranges.  */
4833   if (bitmap_intersect_p (e1, e2))
4834     {
4835       bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
4836       bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
4837
4838       return (comp == EQ_EXPR || comp == GE_EXPR || comp == LE_EXPR)
4839              ? boolean_true_node
4840              : boolean_false_node;
4841     }
4842
4843   /* Start at -1.  Set it to 0 if we do a comparison without relying
4844      on overflow, or 1 if all comparisons rely on overflow.  */
4845   used_strict_overflow = -1;
4846
4847   /* Otherwise, compare all the equivalent ranges.  First, add N1 and
4848      N2 to their own set of equivalences to avoid duplicating the body
4849      of the loop just to check N1 and N2 ranges.  */
4850   EXECUTE_IF_SET_IN_BITMAP (e1, 0, i1, bi1)
4851     {
4852       value_range_t vr1 = get_vr_for_comparison (i1);
4853
4854       t = retval = NULL_TREE;
4855       EXECUTE_IF_SET_IN_BITMAP (e2, 0, i2, bi2)
4856         {
4857           bool sop = false;
4858
4859           value_range_t vr2 = get_vr_for_comparison (i2);
4860
4861           t = compare_ranges (comp, &vr1, &vr2, &sop);
4862           if (t)
4863             {
4864               /* If we get different answers from different members
4865                  of the equivalence set this check must be in a dead
4866                  code region.  Folding it to a trap representation
4867                  would be correct here.  For now just return don't-know.  */
4868               if (retval != NULL
4869                   && t != retval)
4870                 {
4871                   bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
4872                   bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
4873                   return NULL_TREE;
4874                 }
4875               retval = t;
4876
4877               if (!sop)
4878                 used_strict_overflow = 0;
4879               else if (used_strict_overflow < 0)
4880                 used_strict_overflow = 1;
4881             }
4882         }
4883
4884       if (retval)
4885         {
4886           bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
4887           bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
4888           if (used_strict_overflow > 0)
4889             *strict_overflow_p = true;
4890           return retval;
4891         }
4892     }
4893
4894   /* None of the equivalent ranges are useful in computing this
4895      comparison.  */
4896   bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
4897   bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
4898   return NULL_TREE;
4899 }
4900
4901
4902 /* Given a conditional predicate COND, try to determine if COND yields
4903    true or false based on the value ranges of its operands.  Return
4904    BOOLEAN_TRUE_NODE if the conditional always evaluates to true,
4905    BOOLEAN_FALSE_NODE if the conditional always evaluates to false, and,
4906    NULL if the conditional cannot be evaluated at compile time.
4907
4908    If USE_EQUIV_P is true, the ranges of all the names equivalent with
4909    the operands in COND are used when trying to compute its value.
4910    This is only used during final substitution.  During propagation,
4911    we only check the range of each variable and not its equivalents.
4912
4913    Set *STRICT_OVERFLOW_P to indicate whether we relied on an overflow
4914    infinity to produce the result.  */
4915
4916 static tree
4917 vrp_evaluate_conditional_warnv (tree cond, bool use_equiv_p,
4918                                 bool *strict_overflow_p)
4919 {
4920   gcc_assert (TREE_CODE (cond) == SSA_NAME
4921               || TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison);
4922
4923   if (TREE_CODE (cond) == SSA_NAME)
4924     {
4925       value_range_t *vr;
4926       tree retval;
4927
4928       if (use_equiv_p)
4929         retval = compare_name_with_value (NE_EXPR, cond, boolean_false_node,
4930                                           strict_overflow_p);
4931       else
4932         {
4933           value_range_t *vr = get_value_range (cond);
4934           retval = compare_range_with_value (NE_EXPR, vr, boolean_false_node,
4935                                              strict_overflow_p);
4936         }
4937
4938       /* If COND has a known boolean range, return it.  */
4939       if (retval)
4940         return retval;
4941
4942       /* Otherwise, if COND has a symbolic range of exactly one value,
4943          return it.  */
4944       vr = get_value_range (cond);
4945       if (vr->type == VR_RANGE && vr->min == vr->max)
4946         return vr->min;
4947     }
4948   else
4949     {
4950       tree op0 = TREE_OPERAND (cond, 0);
4951       tree op1 = TREE_OPERAND (cond, 1);
4952
4953       /* We only deal with integral and pointer types.  */
4954       if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
4955           && !POINTER_TYPE_P (TREE_TYPE (op0)))
4956         return NULL_TREE;
4957
4958       if (use_equiv_p)
4959         {
4960           if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME)
4961             return compare_names (TREE_CODE (cond), op0, op1,
4962                                   strict_overflow_p);
4963           else if (TREE_CODE (op0) == SSA_NAME)
4964             return compare_name_with_value (TREE_CODE (cond), op0, op1,
4965                                             strict_overflow_p);
4966           else if (TREE_CODE (op1) == SSA_NAME)
4967             return (compare_name_with_value
4968                     (swap_tree_comparison (TREE_CODE (cond)), op1, op0,
4969                      strict_overflow_p));
4970         }
4971       else
4972         {
4973           value_range_t *vr0, *vr1;
4974
4975           vr0 = (TREE_CODE (op0) == SSA_NAME) ? get_value_range (op0) : NULL;
4976           vr1 = (TREE_CODE (op1) == SSA_NAME) ? get_value_range (op1) : NULL;
4977
4978           if (vr0 && vr1)
4979             return compare_ranges (TREE_CODE (cond), vr0, vr1,
4980                                    strict_overflow_p);
4981           else if (vr0 && vr1 == NULL)
4982             return compare_range_with_value (TREE_CODE (cond), vr0, op1,
4983                                              strict_overflow_p);
4984           else if (vr0 == NULL && vr1)
4985             return (compare_range_with_value
4986                     (swap_tree_comparison (TREE_CODE (cond)), vr1, op0,
4987                      strict_overflow_p));
4988         }
4989     }
4990
4991   /* Anything else cannot be computed statically.  */
4992   return NULL_TREE;
4993 }
4994
4995 /* Given COND within STMT, try to simplify it based on value range
4996    information.  Return NULL if the conditional can not be evaluated.
4997    The ranges of all the names equivalent with the operands in COND
4998    will be used when trying to compute the value.  If the result is
4999    based on undefined signed overflow, issue a warning if
5000    appropriate.  */
5001
5002 tree
5003 vrp_evaluate_conditional (tree cond, tree stmt)
5004 {
5005   bool sop;
5006   tree ret;
5007
5008   sop = false;
5009   ret = vrp_evaluate_conditional_warnv (cond, true, &sop);
5010
5011   if (ret && sop)
5012     {
5013       enum warn_strict_overflow_code wc;
5014       const char* warnmsg;
5015
5016       if (is_gimple_min_invariant (ret))
5017         {
5018           wc = WARN_STRICT_OVERFLOW_CONDITIONAL;
5019           warnmsg = G_("assuming signed overflow does not occur when "
5020                        "simplifying conditional to constant");
5021         }
5022       else
5023         {
5024           wc = WARN_STRICT_OVERFLOW_COMPARISON;
5025           warnmsg = G_("assuming signed overflow does not occur when "
5026                        "simplifying conditional");
5027         }
5028
5029       if (issue_strict_overflow_warning (wc))
5030         {
5031           location_t locus;
5032
5033           if (!EXPR_HAS_LOCATION (stmt))
5034             locus = input_location;
5035           else
5036             locus = EXPR_LOCATION (stmt);
5037           warning (OPT_Wstrict_overflow, "%H%s", &locus, warnmsg);
5038         }
5039     }
5040
5041   return ret;
5042 }
5043
5044
5045 /* Visit conditional statement STMT.  If we can determine which edge
5046    will be taken out of STMT's basic block, record it in
5047    *TAKEN_EDGE_P and return SSA_PROP_INTERESTING.  Otherwise, return
5048    SSA_PROP_VARYING.  */
5049
5050 static enum ssa_prop_result
5051 vrp_visit_cond_stmt (tree stmt, edge *taken_edge_p)
5052 {
5053   tree cond, val;
5054   bool sop;
5055
5056   *taken_edge_p = NULL;
5057
5058   /* FIXME.  Handle SWITCH_EXPRs.  */
5059   if (TREE_CODE (stmt) == SWITCH_EXPR)
5060     return SSA_PROP_VARYING;
5061
5062   cond = COND_EXPR_COND (stmt);
5063
5064   if (dump_file && (dump_flags & TDF_DETAILS))
5065     {
5066       tree use;
5067       ssa_op_iter i;
5068
5069       fprintf (dump_file, "\nVisiting conditional with predicate: ");
5070       print_generic_expr (dump_file, cond, 0);
5071       fprintf (dump_file, "\nWith known ranges\n");
5072       
5073       FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
5074         {
5075           fprintf (dump_file, "\t");
5076           print_generic_expr (dump_file, use, 0);
5077           fprintf (dump_file, ": ");
5078           dump_value_range (dump_file, vr_value[SSA_NAME_VERSION (use)]);
5079         }
5080
5081       fprintf (dump_file, "\n");
5082     }
5083
5084   /* Compute the value of the predicate COND by checking the known
5085      ranges of each of its operands.
5086      
5087      Note that we cannot evaluate all the equivalent ranges here
5088      because those ranges may not yet be final and with the current
5089      propagation strategy, we cannot determine when the value ranges
5090      of the names in the equivalence set have changed.
5091
5092      For instance, given the following code fragment
5093
5094         i_5 = PHI <8, i_13>
5095         ...
5096         i_14 = ASSERT_EXPR <i_5, i_5 != 0>
5097         if (i_14 == 1)
5098           ...
5099
5100      Assume that on the first visit to i_14, i_5 has the temporary
5101      range [8, 8] because the second argument to the PHI function is
5102      not yet executable.  We derive the range ~[0, 0] for i_14 and the
5103      equivalence set { i_5 }.  So, when we visit 'if (i_14 == 1)' for
5104      the first time, since i_14 is equivalent to the range [8, 8], we
5105      determine that the predicate is always false.
5106
5107      On the next round of propagation, i_13 is determined to be
5108      VARYING, which causes i_5 to drop down to VARYING.  So, another
5109      visit to i_14 is scheduled.  In this second visit, we compute the
5110      exact same range and equivalence set for i_14, namely ~[0, 0] and
5111      { i_5 }.  But we did not have the previous range for i_5
5112      registered, so vrp_visit_assignment thinks that the range for
5113      i_14 has not changed.  Therefore, the predicate 'if (i_14 == 1)'
5114      is not visited again, which stops propagation from visiting
5115      statements in the THEN clause of that if().
5116
5117      To properly fix this we would need to keep the previous range
5118      value for the names in the equivalence set.  This way we would've
5119      discovered that from one visit to the other i_5 changed from
5120      range [8, 8] to VR_VARYING.
5121
5122      However, fixing this apparent limitation may not be worth the
5123      additional checking.  Testing on several code bases (GCC, DLV,
5124      MICO, TRAMP3D and SPEC2000) showed that doing this results in
5125      4 more predicates folded in SPEC.  */
5126   sop = false;
5127   val = vrp_evaluate_conditional_warnv (cond, false, &sop);
5128   if (val)
5129     {
5130       if (!sop)
5131         *taken_edge_p = find_taken_edge (bb_for_stmt (stmt), val);
5132       else
5133         {
5134           if (dump_file && (dump_flags & TDF_DETAILS))
5135             fprintf (dump_file,
5136                      "\nIgnoring predicate evaluation because "
5137                      "it assumes that signed overflow is undefined");
5138           val = NULL_TREE;
5139         }
5140     }
5141
5142   if (dump_file && (dump_flags & TDF_DETAILS))
5143     {
5144       fprintf (dump_file, "\nPredicate evaluates to: ");
5145       if (val == NULL_TREE)
5146         fprintf (dump_file, "DON'T KNOW\n");
5147       else
5148         print_generic_stmt (dump_file, val, 0);
5149     }
5150
5151   return (*taken_edge_p) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
5152 }
5153
5154
5155 /* Evaluate statement STMT.  If the statement produces a useful range,
5156    return SSA_PROP_INTERESTING and record the SSA name with the
5157    interesting range into *OUTPUT_P.
5158
5159    If STMT is a conditional branch and we can determine its truth
5160    value, the taken edge is recorded in *TAKEN_EDGE_P.
5161
5162    If STMT produces a varying value, return SSA_PROP_VARYING.  */
5163
5164 static enum ssa_prop_result
5165 vrp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p)
5166 {
5167   tree def;
5168   ssa_op_iter iter;
5169   stmt_ann_t ann;
5170
5171   if (dump_file && (dump_flags & TDF_DETAILS))
5172     {
5173       fprintf (dump_file, "\nVisiting statement:\n");
5174       print_generic_stmt (dump_file, stmt, dump_flags);
5175       fprintf (dump_file, "\n");
5176     }
5177
5178   ann = stmt_ann (stmt);
5179   if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT)
5180     {
5181       tree rhs = GIMPLE_STMT_OPERAND (stmt, 1);
5182
5183       /* In general, assignments with virtual operands are not useful
5184          for deriving ranges, with the obvious exception of calls to
5185          builtin functions.  */
5186       if ((TREE_CODE (rhs) == CALL_EXPR
5187            && TREE_CODE (CALL_EXPR_FN (rhs)) == ADDR_EXPR
5188            && DECL_P (TREE_OPERAND (CALL_EXPR_FN (rhs), 0))
5189            && DECL_IS_BUILTIN (TREE_OPERAND (CALL_EXPR_FN (rhs), 0)))
5190           || ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
5191         return vrp_visit_assignment (stmt, output_p);
5192     }
5193   else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
5194     return vrp_visit_cond_stmt (stmt, taken_edge_p);
5195
5196   /* All other statements produce nothing of interest for VRP, so mark
5197      their outputs varying and prevent further simulation.  */
5198   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
5199     set_value_range_to_varying (get_value_range (def));
5200
5201   return SSA_PROP_VARYING;
5202 }
5203
5204
5205 /* Meet operation for value ranges.  Given two value ranges VR0 and
5206    VR1, store in VR0 a range that contains both VR0 and VR1.  This
5207    may not be the smallest possible such range.  */
5208
5209 static void
5210 vrp_meet (value_range_t *vr0, value_range_t *vr1)
5211 {
5212   if (vr0->type == VR_UNDEFINED)
5213     {
5214       copy_value_range (vr0, vr1);
5215       return;
5216     }
5217
5218   if (vr1->type == VR_UNDEFINED)
5219     {
5220       /* Nothing to do.  VR0 already has the resulting range.  */
5221       return;
5222     }
5223
5224   if (vr0->type == VR_VARYING)
5225     {
5226       /* Nothing to do.  VR0 already has the resulting range.  */
5227       return;
5228     }
5229
5230   if (vr1->type == VR_VARYING)
5231     {
5232       set_value_range_to_varying (vr0);
5233       return;
5234     }
5235
5236   if (vr0->type == VR_RANGE && vr1->type == VR_RANGE)
5237     {
5238       int cmp;
5239       tree min, max;
5240
5241       /* Compute the convex hull of the ranges.  The lower limit of
5242          the new range is the minimum of the two ranges.  If they
5243          cannot be compared, then give up.  */
5244       cmp = compare_values (vr0->min, vr1->min);
5245       if (cmp == 0 || cmp == 1)
5246         min = vr1->min;
5247       else if (cmp == -1)
5248         min = vr0->min;
5249       else
5250         goto give_up;
5251
5252       /* Similarly, the upper limit of the new range is the maximum
5253          of the two ranges.  If they cannot be compared, then
5254          give up.  */
5255       cmp = compare_values (vr0->max, vr1->max);
5256       if (cmp == 0 || cmp == -1)
5257         max = vr1->max;
5258       else if (cmp == 1)
5259         max = vr0->max;
5260       else
5261         goto give_up;
5262
5263       /* Check for useless ranges.  */
5264       if (INTEGRAL_TYPE_P (TREE_TYPE (min))
5265           && ((vrp_val_is_min (min) || is_overflow_infinity (min))
5266               && (vrp_val_is_max (max) || is_overflow_infinity (max))))
5267         goto give_up;
5268
5269       /* The resulting set of equivalences is the intersection of
5270          the two sets.  */
5271       if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
5272         bitmap_and_into (vr0->equiv, vr1->equiv);
5273       else if (vr0->equiv && !vr1->equiv)
5274         bitmap_clear (vr0->equiv);
5275
5276       set_value_range (vr0, vr0->type, min, max, vr0->equiv);
5277     }
5278   else if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
5279     {
5280       /* Two anti-ranges meet only if their complements intersect.
5281          Only handle the case of identical ranges.  */
5282       if (compare_values (vr0->min, vr1->min) == 0
5283           && compare_values (vr0->max, vr1->max) == 0
5284           && compare_values (vr0->min, vr0->max) == 0)
5285         {
5286           /* The resulting set of equivalences is the intersection of
5287              the two sets.  */
5288           if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
5289             bitmap_and_into (vr0->equiv, vr1->equiv);
5290           else if (vr0->equiv && !vr1->equiv)
5291             bitmap_clear (vr0->equiv);
5292         }
5293       else
5294         goto give_up;
5295     }
5296   else if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
5297     {
5298       /* For a numeric range [VAL1, VAL2] and an anti-range ~[VAL3, VAL4],
5299          only handle the case where the ranges have an empty intersection.
5300          The result of the meet operation is the anti-range.  */
5301       if (!symbolic_range_p (vr0)
5302           && !symbolic_range_p (vr1)
5303           && !value_ranges_intersect_p (vr0, vr1))
5304         {
5305           /* Copy most of VR1 into VR0.  Don't copy VR1's equivalence
5306              set.  We need to compute the intersection of the two
5307              equivalence sets.  */
5308           if (vr1->type == VR_ANTI_RANGE)
5309             set_value_range (vr0, vr1->type, vr1->min, vr1->max, vr0->equiv);
5310
5311           /* The resulting set of equivalences is the intersection of
5312              the two sets.  */
5313           if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
5314             bitmap_and_into (vr0->equiv, vr1->equiv);
5315           else if (vr0->equiv && !vr1->equiv)
5316             bitmap_clear (vr0->equiv);
5317         }
5318       else
5319         goto give_up;
5320     }
5321   else
5322     gcc_unreachable ();
5323
5324   return;
5325
5326 give_up:
5327   /* Failed to find an efficient meet.  Before giving up and setting
5328      the result to VARYING, see if we can at least derive a useful
5329      anti-range.  FIXME, all this nonsense about distinguishing
5330      anti-ranges from ranges is necessary because of the odd
5331      semantics of range_includes_zero_p and friends.  */
5332   if (!symbolic_range_p (vr0)
5333       && ((vr0->type == VR_RANGE && !range_includes_zero_p (vr0))
5334           || (vr0->type == VR_ANTI_RANGE && range_includes_zero_p (vr0)))
5335       && !symbolic_range_p (vr1)
5336       && ((vr1->type == VR_RANGE && !range_includes_zero_p (vr1))
5337           || (vr1->type == VR_ANTI_RANGE && range_includes_zero_p (vr1))))
5338     {
5339       set_value_range_to_nonnull (vr0, TREE_TYPE (vr0->min));
5340
5341       /* Since this meet operation did not result from the meeting of
5342          two equivalent names, VR0 cannot have any equivalences.  */
5343       if (vr0->equiv)
5344         bitmap_clear (vr0->equiv);
5345     }
5346   else
5347     set_value_range_to_varying (vr0);
5348 }
5349
5350
5351 /* Visit all arguments for PHI node PHI that flow through executable
5352    edges.  If a valid value range can be derived from all the incoming
5353    value ranges, set a new range for the LHS of PHI.  */
5354
5355 static enum ssa_prop_result
5356 vrp_visit_phi_node (tree phi)
5357 {
5358   int i;
5359   tree lhs = PHI_RESULT (phi);
5360   value_range_t *lhs_vr = get_value_range (lhs);
5361   value_range_t vr_result = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
5362   int edges, old_edges;
5363
5364   copy_value_range (&vr_result, lhs_vr);
5365
5366   if (dump_file && (dump_flags & TDF_DETAILS))
5367     {
5368       fprintf (dump_file, "\nVisiting PHI node: ");
5369       print_generic_expr (dump_file, phi, dump_flags);
5370     }
5371
5372   edges = 0;
5373   for (i = 0; i < PHI_NUM_ARGS (phi); i++)
5374     {
5375       edge e = PHI_ARG_EDGE (phi, i);
5376
5377       if (dump_file && (dump_flags & TDF_DETAILS))
5378         {
5379           fprintf (dump_file,
5380               "\n    Argument #%d (%d -> %d %sexecutable)\n",
5381               i, e->src->index, e->dest->index,
5382               (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
5383         }
5384
5385       if (e->flags & EDGE_EXECUTABLE)
5386         {
5387           tree arg = PHI_ARG_DEF (phi, i);
5388           value_range_t vr_arg;
5389
5390           ++edges;
5391
5392           if (TREE_CODE (arg) == SSA_NAME)
5393             {
5394               vr_arg = *(get_value_range (arg));
5395             }
5396           else
5397             {
5398               if (is_overflow_infinity (arg))
5399                 {
5400                   arg = copy_node (arg);
5401                   TREE_OVERFLOW (arg) = 0;
5402                 }
5403
5404               vr_arg.type = VR_RANGE;
5405               vr_arg.min = arg;
5406               vr_arg.max = arg;
5407               vr_arg.equiv = NULL;
5408             }
5409
5410           if (dump_file && (dump_flags & TDF_DETAILS))
5411             {
5412               fprintf (dump_file, "\t");
5413               print_generic_expr (dump_file, arg, dump_flags);
5414               fprintf (dump_file, "\n\tValue: ");
5415               dump_value_range (dump_file, &vr_arg);
5416               fprintf (dump_file, "\n");
5417             }
5418
5419           vrp_meet (&vr_result, &vr_arg);
5420
5421           if (vr_result.type == VR_VARYING)
5422             break;
5423         }
5424     }
5425
5426   if (vr_result.type == VR_VARYING)
5427     goto varying;
5428
5429   old_edges = vr_phi_edge_counts[SSA_NAME_VERSION (lhs)];
5430   vr_phi_edge_counts[SSA_NAME_VERSION (lhs)] = edges;
5431
5432   /* To prevent infinite iterations in the algorithm, derive ranges
5433      when the new value is slightly bigger or smaller than the
5434      previous one.  We don't do this if we have seen a new executable
5435      edge; this helps us avoid an overflow infinity for conditionals
5436      which are not in a loop.  */
5437   if (lhs_vr->type == VR_RANGE && vr_result.type == VR_RANGE
5438       && edges <= old_edges)
5439     {
5440       if (!POINTER_TYPE_P (TREE_TYPE (lhs)))
5441         {
5442           int cmp_min = compare_values (lhs_vr->min, vr_result.min);
5443           int cmp_max = compare_values (lhs_vr->max, vr_result.max);
5444
5445           /* If the new minimum is smaller or larger than the previous
5446              one, go all the way to -INF.  In the first case, to avoid
5447              iterating millions of times to reach -INF, and in the
5448              other case to avoid infinite bouncing between different
5449              minimums.  */
5450           if (cmp_min > 0 || cmp_min < 0)
5451             {
5452               /* If we will end up with a (-INF, +INF) range, set it
5453                  to VARYING.  */
5454               if (vrp_val_is_max (vr_result.max))
5455                 goto varying;
5456
5457               if (!needs_overflow_infinity (TREE_TYPE (vr_result.min))
5458                   || !vrp_var_may_overflow (lhs, phi))
5459                 vr_result.min = TYPE_MIN_VALUE (TREE_TYPE (vr_result.min));
5460               else if (supports_overflow_infinity (TREE_TYPE (vr_result.min)))
5461                 vr_result.min =
5462                   negative_overflow_infinity (TREE_TYPE (vr_result.min));
5463               else
5464                 goto varying;
5465             }
5466
5467           /* Similarly, if the new maximum is smaller or larger than
5468              the previous one, go all the way to +INF.  */
5469           if (cmp_max < 0 || cmp_max > 0)
5470             {
5471               /* If we will end up with a (-INF, +INF) range, set it
5472                  to VARYING.  */
5473               if (vrp_val_is_min (vr_result.min))
5474                 goto varying;
5475
5476               if (!needs_overflow_infinity (TREE_TYPE (vr_result.max))
5477                   || !vrp_var_may_overflow (lhs, phi))
5478                 vr_result.max = TYPE_MAX_VALUE (TREE_TYPE (vr_result.max));
5479               else if (supports_overflow_infinity (TREE_TYPE (vr_result.max)))
5480                 vr_result.max =
5481                   positive_overflow_infinity (TREE_TYPE (vr_result.max));
5482               else
5483                 goto varying;
5484             }
5485         }
5486     }
5487
5488   /* If the new range is different than the previous value, keep
5489      iterating.  */
5490   if (update_value_range (lhs, &vr_result))
5491     return SSA_PROP_INTERESTING;
5492
5493   /* Nothing changed, don't add outgoing edges.  */
5494   return SSA_PROP_NOT_INTERESTING;
5495
5496   /* No match found.  Set the LHS to VARYING.  */
5497 varying:
5498   set_value_range_to_varying (lhs_vr);
5499   return SSA_PROP_VARYING;
5500 }
5501
5502 /* Simplify a division or modulo operator to a right shift or
5503    bitwise and if the first operand is unsigned or is greater
5504    than zero and the second operand is an exact power of two.  */
5505
5506 static void
5507 simplify_div_or_mod_using_ranges (tree stmt, tree rhs, enum tree_code rhs_code)
5508 {
5509   tree val = NULL;
5510   tree op = TREE_OPERAND (rhs, 0);
5511   value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
5512
5513   if (TYPE_UNSIGNED (TREE_TYPE (op)))
5514     {
5515       val = integer_one_node;
5516     }
5517   else
5518     {
5519       bool sop = false;
5520
5521       val = compare_range_with_value (GT_EXPR, vr, integer_zero_node, &sop);
5522
5523       if (val
5524           && sop
5525           && integer_onep (val)
5526           && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
5527         {
5528           location_t locus;
5529
5530           if (!EXPR_HAS_LOCATION (stmt))
5531             locus = input_location;
5532           else
5533             locus = EXPR_LOCATION (stmt);
5534           warning (OPT_Wstrict_overflow,
5535                    ("%Hassuming signed overflow does not occur when "
5536                     "simplifying / or %% to >> or &"),
5537                    &locus);
5538         }
5539     }
5540
5541   if (val && integer_onep (val))
5542     {
5543       tree t;
5544       tree op0 = TREE_OPERAND (rhs, 0);
5545       tree op1 = TREE_OPERAND (rhs, 1);
5546
5547       if (rhs_code == TRUNC_DIV_EXPR)
5548         {
5549           t = build_int_cst (NULL_TREE, tree_log2 (op1));
5550           t = build2 (RSHIFT_EXPR, TREE_TYPE (op0), op0, t);
5551         }
5552       else
5553         {
5554           t = build_int_cst (TREE_TYPE (op1), 1);
5555           t = int_const_binop (MINUS_EXPR, op1, t, 0);
5556           t = fold_convert (TREE_TYPE (op0), t);
5557           t = build2 (BIT_AND_EXPR, TREE_TYPE (op0), op0, t);
5558         }
5559
5560       GIMPLE_STMT_OPERAND (stmt, 1) = t;
5561       update_stmt (stmt);
5562     }
5563 }
5564
5565 /* If the operand to an ABS_EXPR is >= 0, then eliminate the
5566    ABS_EXPR.  If the operand is <= 0, then simplify the
5567    ABS_EXPR into a NEGATE_EXPR.  */
5568
5569 static void
5570 simplify_abs_using_ranges (tree stmt, tree rhs)
5571 {
5572   tree val = NULL;
5573   tree op = TREE_OPERAND (rhs, 0);
5574   tree type = TREE_TYPE (op);
5575   value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
5576
5577   if (TYPE_UNSIGNED (type))
5578     {
5579       val = integer_zero_node;
5580     }
5581   else if (vr)
5582     {
5583       bool sop = false;
5584
5585       val = compare_range_with_value (LE_EXPR, vr, integer_zero_node, &sop);
5586       if (!val)
5587         {
5588           sop = false;
5589           val = compare_range_with_value (GE_EXPR, vr, integer_zero_node,
5590                                           &sop);
5591
5592           if (val)
5593             {
5594               if (integer_zerop (val))
5595                 val = integer_one_node;
5596               else if (integer_onep (val))
5597                 val = integer_zero_node;
5598             }
5599         }
5600
5601       if (val
5602           && (integer_onep (val) || integer_zerop (val)))
5603         {
5604           tree t;
5605
5606           if (sop && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
5607             {
5608               location_t locus;
5609
5610               if (!EXPR_HAS_LOCATION (stmt))
5611                 locus = input_location;
5612               else
5613                 locus = EXPR_LOCATION (stmt);
5614               warning (OPT_Wstrict_overflow,
5615                        ("%Hassuming signed overflow does not occur when "
5616                         "simplifying abs (X) to X or -X"),
5617                        &locus);
5618             }
5619
5620           if (integer_onep (val))
5621             t = build1 (NEGATE_EXPR, TREE_TYPE (op), op);
5622           else
5623             t = op;
5624
5625           GIMPLE_STMT_OPERAND (stmt, 1) = t;
5626           update_stmt (stmt);
5627         }
5628     }
5629 }
5630
5631 /* We are comparing trees OP0 and OP1 using COND_CODE.  OP0 has
5632    a known value range VR.
5633
5634    If there is one and only one value which will satisfy the
5635    conditional, then return that value.  Else return NULL.  */
5636
5637 static tree
5638 test_for_singularity (enum tree_code cond_code, tree op0,
5639                       tree op1, value_range_t *vr)
5640 {
5641   tree min = NULL;
5642   tree max = NULL;
5643
5644   /* Extract minimum/maximum values which satisfy the
5645      the conditional as it was written.  */
5646   if (cond_code == LE_EXPR || cond_code == LT_EXPR)
5647     {
5648       /* This should not be negative infinity; there is no overflow
5649          here.  */
5650       min = TYPE_MIN_VALUE (TREE_TYPE (op0));
5651
5652       max = op1;
5653       if (cond_code == LT_EXPR && !is_overflow_infinity (max))
5654         {
5655           tree one = build_int_cst (TREE_TYPE (op0), 1);
5656           max = fold_build2 (MINUS_EXPR, TREE_TYPE (op0), max, one);
5657           if (EXPR_P (max))
5658             TREE_NO_WARNING (max) = 1;
5659         }
5660     }
5661   else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
5662     {
5663       /* This should not be positive infinity; there is no overflow
5664          here.  */
5665       max = TYPE_MAX_VALUE (TREE_TYPE (op0));
5666
5667       min = op1;
5668       if (cond_code == GT_EXPR && !is_overflow_infinity (min))
5669         {
5670           tree one = build_int_cst (TREE_TYPE (op0), 1);
5671           min = fold_build2 (PLUS_EXPR, TREE_TYPE (op0), min, one);
5672           if (EXPR_P (min))
5673             TREE_NO_WARNING (min) = 1;
5674         }
5675     }
5676
5677   /* Now refine the minimum and maximum values using any
5678      value range information we have for op0.  */
5679   if (min && max)
5680     {
5681       if (compare_values (vr->min, min) == -1)
5682         min = min;
5683       else
5684         min = vr->min;
5685       if (compare_values (vr->max, max) == 1)
5686         max = max;
5687       else
5688         max = vr->max;
5689
5690       /* If the new min/max values have converged to a single value,
5691          then there is only one value which can satisfy the condition,
5692          return that value.  */
5693       if (operand_equal_p (min, max, 0) && is_gimple_min_invariant (min))
5694         return min;
5695     }
5696   return NULL;
5697 }
5698
5699 /* Simplify a conditional using a relational operator to an equality
5700    test if the range information indicates only one value can satisfy
5701    the original conditional.  */
5702
5703 static void
5704 simplify_cond_using_ranges (tree stmt)
5705 {
5706   tree cond = COND_EXPR_COND (stmt);
5707   tree op0 = TREE_OPERAND (cond, 0);
5708   tree op1 = TREE_OPERAND (cond, 1);
5709   enum tree_code cond_code = TREE_CODE (cond);
5710
5711   if (cond_code != NE_EXPR
5712       && cond_code != EQ_EXPR
5713       && TREE_CODE (op0) == SSA_NAME
5714       && INTEGRAL_TYPE_P (TREE_TYPE (op0))
5715       && is_gimple_min_invariant (op1))
5716     {
5717       value_range_t *vr = get_value_range (op0);
5718           
5719       /* If we have range information for OP0, then we might be
5720          able to simplify this conditional. */
5721       if (vr->type == VR_RANGE)
5722         {
5723           tree new = test_for_singularity (cond_code, op0, op1, vr);
5724
5725           if (new)
5726             {
5727               if (dump_file)
5728                 {
5729                   fprintf (dump_file, "Simplified relational ");
5730                   print_generic_expr (dump_file, cond, 0);
5731                   fprintf (dump_file, " into ");
5732                 }
5733
5734               COND_EXPR_COND (stmt)
5735                 = build2 (EQ_EXPR, boolean_type_node, op0, new);
5736               update_stmt (stmt);
5737
5738               if (dump_file)
5739                 {
5740                   print_generic_expr (dump_file, COND_EXPR_COND (stmt), 0);
5741                   fprintf (dump_file, "\n");
5742                 }
5743               return;
5744
5745             }
5746
5747           /* Try again after inverting the condition.  We only deal
5748              with integral types here, so no need to worry about
5749              issues with inverting FP comparisons.  */
5750           cond_code = invert_tree_comparison (cond_code, false);
5751           new = test_for_singularity (cond_code, op0, op1, vr);
5752
5753           if (new)
5754             {
5755               if (dump_file)
5756                 {
5757                   fprintf (dump_file, "Simplified relational ");
5758                   print_generic_expr (dump_file, cond, 0);
5759                   fprintf (dump_file, " into ");
5760                 }
5761
5762               COND_EXPR_COND (stmt)
5763                 = build2 (NE_EXPR, boolean_type_node, op0, new);
5764               update_stmt (stmt);
5765
5766               if (dump_file)
5767                 {
5768                   print_generic_expr (dump_file, COND_EXPR_COND (stmt), 0);
5769                   fprintf (dump_file, "\n");
5770                 }
5771               return;
5772
5773             }
5774         }
5775     }
5776 }
5777
5778 /* Simplify STMT using ranges if possible.  */
5779
5780 void
5781 simplify_stmt_using_ranges (tree stmt)
5782 {
5783   if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT)
5784     {
5785       tree rhs = GIMPLE_STMT_OPERAND (stmt, 1);
5786       enum tree_code rhs_code = TREE_CODE (rhs);
5787
5788       /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
5789          and BIT_AND_EXPR respectively if the first operand is greater
5790          than zero and the second operand is an exact power of two.  */
5791       if ((rhs_code == TRUNC_DIV_EXPR || rhs_code == TRUNC_MOD_EXPR)
5792           && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0)))
5793           && integer_pow2p (TREE_OPERAND (rhs, 1)))
5794         simplify_div_or_mod_using_ranges (stmt, rhs, rhs_code);
5795
5796       /* Transform ABS (X) into X or -X as appropriate.  */
5797       if (rhs_code == ABS_EXPR
5798           && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME
5799           && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0))))
5800         simplify_abs_using_ranges (stmt, rhs);
5801     }
5802   else if (TREE_CODE (stmt) == COND_EXPR
5803            && COMPARISON_CLASS_P (COND_EXPR_COND (stmt)))
5804     {
5805       simplify_cond_using_ranges (stmt);
5806     }
5807 }
5808
5809 /* Stack of dest,src equivalency pairs that need to be restored after
5810    each attempt to thread a block's incoming edge to an outgoing edge. 
5811
5812    A NULL entry is used to mark the end of pairs which need to be
5813    restored.  */
5814 static VEC(tree,heap) *stack;
5815
5816 /* A trivial wrapper so that we can present the generic jump threading
5817    code with a simple API for simplifying statements.  STMT is the
5818    statement we want to simplify, WITHIN_STMT provides the location
5819    for any overflow warnings.  */
5820
5821 static tree
5822 simplify_stmt_for_jump_threading (tree stmt, tree within_stmt)
5823 {
5824   /* We only use VRP information to simplify conditionals.  This is
5825      overly conservative, but it's unclear if doing more would be
5826      worth the compile time cost.  */
5827   if (TREE_CODE (stmt) != COND_EXPR)
5828     return NULL;
5829
5830   return vrp_evaluate_conditional (COND_EXPR_COND (stmt), within_stmt);
5831 }
5832
5833 /* Blocks which have more than one predecessor and more than
5834    one successor present jump threading opportunities.  ie,
5835    when the block is reached from a specific predecessor, we
5836    may be able to determine which of the outgoing edges will
5837    be traversed.  When this optimization applies, we are able
5838    to avoid conditionals at runtime and we may expose secondary
5839    optimization opportunities.
5840
5841    This routine is effectively a driver for the generic jump
5842    threading code.  It basically just presents the generic code
5843    with edges that may be suitable for jump threading.
5844
5845    Unlike DOM, we do not iterate VRP if jump threading was successful.
5846    While iterating may expose new opportunities for VRP, it is expected
5847    those opportunities would be very limited and the compile time cost
5848    to expose those opportunities would be significant. 
5849
5850    As jump threading opportunities are discovered, they are registered
5851    for later realization.  */
5852
5853 static void
5854 identify_jump_threads (void)
5855 {
5856   basic_block bb;
5857   tree dummy;
5858
5859   /* Ugh.  When substituting values earlier in this pass we can
5860      wipe the dominance information.  So rebuild the dominator
5861      information as we need it within the jump threading code.  */
5862   calculate_dominance_info (CDI_DOMINATORS);
5863
5864   /* We do not allow VRP information to be used for jump threading
5865      across a back edge in the CFG.  Otherwise it becomes too
5866      difficult to avoid eliminating loop exit tests.  Of course
5867      EDGE_DFS_BACK is not accurate at this time so we have to
5868      recompute it.  */
5869   mark_dfs_back_edges ();
5870
5871   /* Allocate our unwinder stack to unwind any temporary equivalences
5872      that might be recorded.  */
5873   stack = VEC_alloc (tree, heap, 20);
5874
5875   /* To avoid lots of silly node creation, we create a single
5876      conditional and just modify it in-place when attempting to
5877      thread jumps.  */
5878   dummy = build2 (EQ_EXPR, boolean_type_node, NULL, NULL);
5879   dummy = build3 (COND_EXPR, void_type_node, dummy, NULL, NULL);
5880
5881   /* Walk through all the blocks finding those which present a
5882      potential jump threading opportunity.  We could set this up
5883      as a dominator walker and record data during the walk, but
5884      I doubt it's worth the effort for the classes of jump
5885      threading opportunities we are trying to identify at this
5886      point in compilation.  */
5887   FOR_EACH_BB (bb)
5888     {
5889       tree last, cond;
5890
5891       /* If the generic jump threading code does not find this block
5892          interesting, then there is nothing to do.  */
5893       if (! potentially_threadable_block (bb))
5894         continue;
5895
5896       /* We only care about blocks ending in a COND_EXPR.  While there
5897          may be some value in handling SWITCH_EXPR here, I doubt it's
5898          terribly important.  */
5899       last = bsi_stmt (bsi_last (bb));
5900       if (TREE_CODE (last) != COND_EXPR)
5901         continue;
5902
5903       /* We're basically looking for any kind of conditional with
5904          integral type arguments.  */
5905       cond = COND_EXPR_COND (last);
5906       if ((TREE_CODE (cond) == SSA_NAME
5907            && INTEGRAL_TYPE_P (TREE_TYPE (cond)))
5908           || (COMPARISON_CLASS_P (cond)
5909               && TREE_CODE (TREE_OPERAND (cond, 0)) == SSA_NAME
5910               && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (cond, 0)))
5911               && (TREE_CODE (TREE_OPERAND (cond, 1)) == SSA_NAME
5912                   || is_gimple_min_invariant (TREE_OPERAND (cond, 1)))
5913               && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (cond, 1)))))
5914         {
5915           edge_iterator ei;
5916           edge e;
5917
5918           /* We've got a block with multiple predecessors and multiple
5919              successors which also ends in a suitable conditional.  For
5920              each predecessor, see if we can thread it to a specific
5921              successor.  */
5922           FOR_EACH_EDGE (e, ei, bb->preds)
5923             {
5924               /* Do not thread across back edges or abnormal edges
5925                  in the CFG.  */
5926               if (e->flags & (EDGE_DFS_BACK | EDGE_COMPLEX))
5927                 continue;
5928
5929               thread_across_edge (dummy, e, true,
5930                                   &stack,
5931                                   simplify_stmt_for_jump_threading);
5932             }
5933         }
5934     }
5935
5936   /* We do not actually update the CFG or SSA graphs at this point as
5937      ASSERT_EXPRs are still in the IL and cfg cleanup code does not yet
5938      handle ASSERT_EXPRs gracefully.  */
5939 }
5940
5941 /* We identified all the jump threading opportunities earlier, but could
5942    not transform the CFG at that time.  This routine transforms the
5943    CFG and arranges for the dominator tree to be rebuilt if necessary.
5944
5945    Note the SSA graph update will occur during the normal TODO
5946    processing by the pass manager.  */
5947 static void
5948 finalize_jump_threads (void)
5949 {
5950   thread_through_all_blocks (false);
5951   VEC_free (tree, heap, stack);
5952 }
5953
5954
5955 /* Traverse all the blocks folding conditionals with known ranges.  */
5956
5957 static void
5958 vrp_finalize (void)
5959 {
5960   size_t i;
5961   prop_value_t *single_val_range;
5962   bool do_value_subst_p;
5963
5964   if (dump_file)
5965     {
5966       fprintf (dump_file, "\nValue ranges after VRP:\n\n");
5967       dump_all_value_ranges (dump_file);
5968       fprintf (dump_file, "\n");
5969     }
5970
5971   /* We may have ended with ranges that have exactly one value.  Those
5972      values can be substituted as any other copy/const propagated
5973      value using substitute_and_fold.  */
5974   single_val_range = XCNEWVEC (prop_value_t, num_ssa_names);
5975
5976   do_value_subst_p = false;
5977   for (i = 0; i < num_ssa_names; i++)
5978     if (vr_value[i]
5979         && vr_value[i]->type == VR_RANGE
5980         && vr_value[i]->min == vr_value[i]->max)
5981       {
5982         single_val_range[i].value = vr_value[i]->min;
5983         do_value_subst_p = true;
5984       }
5985
5986   if (!do_value_subst_p)
5987     {
5988       /* We found no single-valued ranges, don't waste time trying to
5989          do single value substitution in substitute_and_fold.  */
5990       free (single_val_range);
5991       single_val_range = NULL;
5992     }
5993
5994   substitute_and_fold (single_val_range, true);
5995
5996   if (warn_array_bounds)
5997       check_all_array_refs ();
5998
5999   /* We must identify jump threading opportunities before we release
6000      the datastructures built by VRP.  */
6001   identify_jump_threads ();
6002
6003   /* Free allocated memory.  */
6004   for (i = 0; i < num_ssa_names; i++)
6005     if (vr_value[i])
6006       {
6007         BITMAP_FREE (vr_value[i]->equiv);
6008         free (vr_value[i]);
6009       }
6010
6011   free (single_val_range);
6012   free (vr_value);
6013   free (vr_phi_edge_counts);
6014
6015   /* So that we can distinguish between VRP data being available
6016      and not available.  */
6017   vr_value = NULL;
6018   vr_phi_edge_counts = NULL;
6019 }
6020
6021
6022 /* Main entry point to VRP (Value Range Propagation).  This pass is
6023    loosely based on J. R. C. Patterson, ``Accurate Static Branch
6024    Prediction by Value Range Propagation,'' in SIGPLAN Conference on
6025    Programming Language Design and Implementation, pp. 67-78, 1995.
6026    Also available at http://citeseer.ist.psu.edu/patterson95accurate.html
6027
6028    This is essentially an SSA-CCP pass modified to deal with ranges
6029    instead of constants.
6030
6031    While propagating ranges, we may find that two or more SSA name
6032    have equivalent, though distinct ranges.  For instance,
6033
6034      1  x_9 = p_3->a;
6035      2  p_4 = ASSERT_EXPR <p_3, p_3 != 0>
6036      3  if (p_4 == q_2)
6037      4    p_5 = ASSERT_EXPR <p_4, p_4 == q_2>;
6038      5  endif
6039      6  if (q_2)
6040         
6041    In the code above, pointer p_5 has range [q_2, q_2], but from the
6042    code we can also determine that p_5 cannot be NULL and, if q_2 had
6043    a non-varying range, p_5's range should also be compatible with it.
6044
6045    These equivalences are created by two expressions: ASSERT_EXPR and
6046    copy operations.  Since p_5 is an assertion on p_4, and p_4 was the
6047    result of another assertion, then we can use the fact that p_5 and
6048    p_4 are equivalent when evaluating p_5's range.
6049
6050    Together with value ranges, we also propagate these equivalences
6051    between names so that we can take advantage of information from
6052    multiple ranges when doing final replacement.  Note that this
6053    equivalency relation is transitive but not symmetric.
6054    
6055    In the example above, p_5 is equivalent to p_4, q_2 and p_3, but we
6056    cannot assert that q_2 is equivalent to p_5 because q_2 may be used
6057    in contexts where that assertion does not hold (e.g., in line 6).
6058
6059    TODO, the main difference between this pass and Patterson's is that
6060    we do not propagate edge probabilities.  We only compute whether
6061    edges can be taken or not.  That is, instead of having a spectrum
6062    of jump probabilities between 0 and 1, we only deal with 0, 1 and
6063    DON'T KNOW.  In the future, it may be worthwhile to propagate
6064    probabilities to aid branch prediction.  */
6065
6066 static unsigned int
6067 execute_vrp (void)
6068 {
6069   loop_optimizer_init (LOOPS_NORMAL | LOOPS_HAVE_RECORDED_EXITS);
6070   rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
6071   scev_initialize ();
6072
6073   insert_range_assertions ();
6074
6075   vrp_initialize ();
6076   ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
6077   vrp_finalize ();
6078
6079   /* ASSERT_EXPRs must be removed before finalizing jump threads
6080      as finalizing jump threads calls the CFG cleanup code which
6081      does not properly handle ASSERT_EXPRs.  */
6082   remove_range_assertions ();
6083
6084   /* If we exposed any new variables, go ahead and put them into
6085      SSA form now, before we handle jump threading.  This simplifies
6086      interactions between rewriting of _DECL nodes into SSA form
6087      and rewriting SSA_NAME nodes into SSA form after block
6088      duplication and CFG manipulation.  */
6089   update_ssa (TODO_update_ssa);
6090
6091   finalize_jump_threads ();
6092   scev_finalize ();
6093   loop_optimizer_finalize ();
6094
6095   return 0;
6096 }
6097
6098 static bool
6099 gate_vrp (void)
6100 {
6101   return flag_tree_vrp != 0;
6102 }
6103
6104 struct tree_opt_pass pass_vrp =
6105 {
6106   "vrp",                                /* name */
6107   gate_vrp,                             /* gate */
6108   execute_vrp,                          /* execute */
6109   NULL,                                 /* sub */
6110   NULL,                                 /* next */
6111   0,                                    /* static_pass_number */
6112   TV_TREE_VRP,                          /* tv_id */
6113   PROP_ssa | PROP_alias,                /* properties_required */
6114   0,                                    /* properties_provided */
6115   0,                                    /* properties_destroyed */
6116   0,                                    /* todo_flags_start */
6117   TODO_cleanup_cfg
6118     | TODO_ggc_collect
6119     | TODO_verify_ssa
6120     | TODO_dump_func
6121     | TODO_update_ssa,                  /* todo_flags_finish */
6122   0                                     /* letter */
6123 };