OSDN Git Service

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