OSDN Git Service

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