OSDN Git Service

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