OSDN Git Service

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