OSDN Git Service

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