OSDN Git Service

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