OSDN Git Service

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