OSDN Git Service

PR c++/49165
[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      We are interested in the number of executions of the latch, while
3408      nb_iterations_upper_bound includes the last execution of the exit test.  */
3409   if (TREE_CODE (step) == INTEGER_CST
3410       && loop->any_upper_bound
3411       && !double_int_zero_p (loop->nb_iterations_upper_bound)
3412       && is_gimple_val (init)
3413       && (TREE_CODE (init) != SSA_NAME
3414           || get_value_range (init)->type == VR_RANGE))
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),
3422                                        double_int_sub (
3423                                            loop->nb_iterations_upper_bound,
3424                                            double_int_one),
3425                                        unsigned_p, &overflow);
3426       tem = double_int_to_tree (TREE_TYPE (init), dtmp);
3427       /* If the multiplication overflowed we can't do a meaningful
3428          adjustment.  */
3429       if (!overflow && double_int_equal_p (dtmp, tree_to_double_int (tem)))
3430         {
3431           extract_range_from_binary_expr (&maxvr, PLUS_EXPR,
3432                                           TREE_TYPE (init), init, tem);
3433           /* Likewise if the addition did.  */
3434           if (maxvr.type == VR_RANGE)
3435             {
3436               tmin = maxvr.min;
3437               tmax = maxvr.max;
3438             }
3439         }
3440     }
3441
3442   if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
3443     {
3444       min = tmin;
3445       max = tmax;
3446
3447       /* For VARYING or UNDEFINED ranges, just about anything we get
3448          from scalar evolutions should be better.  */
3449
3450       if (dir == EV_DIR_DECREASES)
3451         max = init;
3452       else
3453         min = init;
3454
3455       /* If we would create an invalid range, then just assume we
3456          know absolutely nothing.  This may be over-conservative,
3457          but it's clearly safe, and should happen only in unreachable
3458          parts of code, or for invalid programs.  */
3459       if (compare_values (min, max) == 1)
3460         return;
3461
3462       set_value_range (vr, VR_RANGE, min, max, vr->equiv);
3463     }
3464   else if (vr->type == VR_RANGE)
3465     {
3466       min = vr->min;
3467       max = vr->max;
3468
3469       if (dir == EV_DIR_DECREASES)
3470         {
3471           /* INIT is the maximum value.  If INIT is lower than VR->MAX
3472              but no smaller than VR->MIN, set VR->MAX to INIT.  */
3473           if (compare_values (init, max) == -1)
3474             max = init;
3475
3476           /* According to the loop information, the variable does not
3477              overflow.  If we think it does, probably because of an
3478              overflow due to arithmetic on a different INF value,
3479              reset now.  */
3480           if (is_negative_overflow_infinity (min)
3481               || compare_values (min, tmin) == -1)
3482             min = tmin;
3483
3484         }
3485       else
3486         {
3487           /* If INIT is bigger than VR->MIN, set VR->MIN to INIT.  */
3488           if (compare_values (init, min) == 1)
3489             min = init;
3490
3491           if (is_positive_overflow_infinity (max)
3492               || compare_values (tmax, max) == -1)
3493             max = tmax;
3494         }
3495
3496       /* If we just created an invalid range with the minimum
3497          greater than the maximum, we fail conservatively.
3498          This should happen only in unreachable
3499          parts of code, or for invalid programs.  */
3500       if (compare_values (min, max) == 1)
3501         return;
3502
3503       set_value_range (vr, VR_RANGE, min, max, vr->equiv);
3504     }
3505 }
3506
3507 /* Return true if VAR may overflow at STMT.  This checks any available
3508    loop information to see if we can determine that VAR does not
3509    overflow.  */
3510
3511 static bool
3512 vrp_var_may_overflow (tree var, gimple stmt)
3513 {
3514   struct loop *l;
3515   tree chrec, init, step;
3516
3517   if (current_loops == NULL)
3518     return true;
3519
3520   l = loop_containing_stmt (stmt);
3521   if (l == NULL
3522       || !loop_outer (l))
3523     return true;
3524
3525   chrec = instantiate_parameters (l, analyze_scalar_evolution (l, var));
3526   if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
3527     return true;
3528
3529   init = initial_condition_in_loop_num (chrec, l->num);
3530   step = evolution_part_in_loop_num (chrec, l->num);
3531
3532   if (step == NULL_TREE
3533       || !is_gimple_min_invariant (step)
3534       || !valid_value_p (init))
3535     return true;
3536
3537   /* If we get here, we know something useful about VAR based on the
3538      loop information.  If it wraps, it may overflow.  */
3539
3540   if (scev_probably_wraps_p (init, step, stmt, get_chrec_loop (chrec),
3541                              true))
3542     return true;
3543
3544   if (dump_file && (dump_flags & TDF_DETAILS) != 0)
3545     {
3546       print_generic_expr (dump_file, var, 0);
3547       fprintf (dump_file, ": loop information indicates does not overflow\n");
3548     }
3549
3550   return false;
3551 }
3552
3553
3554 /* Given two numeric value ranges VR0, VR1 and a comparison code COMP:
3555
3556    - Return BOOLEAN_TRUE_NODE if VR0 COMP VR1 always returns true for
3557      all the values in the ranges.
3558
3559    - Return BOOLEAN_FALSE_NODE if the comparison always returns false.
3560
3561    - Return NULL_TREE if it is not always possible to determine the
3562      value of the comparison.
3563
3564    Also set *STRICT_OVERFLOW_P to indicate whether a range with an
3565    overflow infinity was used in the test.  */
3566
3567
3568 static tree
3569 compare_ranges (enum tree_code comp, value_range_t *vr0, value_range_t *vr1,
3570                 bool *strict_overflow_p)
3571 {
3572   /* VARYING or UNDEFINED ranges cannot be compared.  */
3573   if (vr0->type == VR_VARYING
3574       || vr0->type == VR_UNDEFINED
3575       || vr1->type == VR_VARYING
3576       || vr1->type == VR_UNDEFINED)
3577     return NULL_TREE;
3578
3579   /* Anti-ranges need to be handled separately.  */
3580   if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
3581     {
3582       /* If both are anti-ranges, then we cannot compute any
3583          comparison.  */
3584       if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
3585         return NULL_TREE;
3586
3587       /* These comparisons are never statically computable.  */
3588       if (comp == GT_EXPR
3589           || comp == GE_EXPR
3590           || comp == LT_EXPR
3591           || comp == LE_EXPR)
3592         return NULL_TREE;
3593
3594       /* Equality can be computed only between a range and an
3595          anti-range.  ~[VAL1, VAL2] == [VAL1, VAL2] is always false.  */
3596       if (vr0->type == VR_RANGE)
3597         {
3598           /* To simplify processing, make VR0 the anti-range.  */
3599           value_range_t *tmp = vr0;
3600           vr0 = vr1;
3601           vr1 = tmp;
3602         }
3603
3604       gcc_assert (comp == NE_EXPR || comp == EQ_EXPR);
3605
3606       if (compare_values_warnv (vr0->min, vr1->min, strict_overflow_p) == 0
3607           && compare_values_warnv (vr0->max, vr1->max, strict_overflow_p) == 0)
3608         return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
3609
3610       return NULL_TREE;
3611     }
3612
3613   if (!usable_range_p (vr0, strict_overflow_p)
3614       || !usable_range_p (vr1, strict_overflow_p))
3615     return NULL_TREE;
3616
3617   /* Simplify processing.  If COMP is GT_EXPR or GE_EXPR, switch the
3618      operands around and change the comparison code.  */
3619   if (comp == GT_EXPR || comp == GE_EXPR)
3620     {
3621       value_range_t *tmp;
3622       comp = (comp == GT_EXPR) ? LT_EXPR : LE_EXPR;
3623       tmp = vr0;
3624       vr0 = vr1;
3625       vr1 = tmp;
3626     }
3627
3628   if (comp == EQ_EXPR)
3629     {
3630       /* Equality may only be computed if both ranges represent
3631          exactly one value.  */
3632       if (compare_values_warnv (vr0->min, vr0->max, strict_overflow_p) == 0
3633           && compare_values_warnv (vr1->min, vr1->max, strict_overflow_p) == 0)
3634         {
3635           int cmp_min = compare_values_warnv (vr0->min, vr1->min,
3636                                               strict_overflow_p);
3637           int cmp_max = compare_values_warnv (vr0->max, vr1->max,
3638                                               strict_overflow_p);
3639           if (cmp_min == 0 && cmp_max == 0)
3640             return boolean_true_node;
3641           else if (cmp_min != -2 && cmp_max != -2)
3642             return boolean_false_node;
3643         }
3644       /* If [V0_MIN, V1_MAX] < [V1_MIN, V1_MAX] then V0 != V1.  */
3645       else if (compare_values_warnv (vr0->min, vr1->max,
3646                                      strict_overflow_p) == 1
3647                || compare_values_warnv (vr1->min, vr0->max,
3648                                         strict_overflow_p) == 1)
3649         return boolean_false_node;
3650
3651       return NULL_TREE;
3652     }
3653   else if (comp == NE_EXPR)
3654     {
3655       int cmp1, cmp2;
3656
3657       /* If VR0 is completely to the left or completely to the right
3658          of VR1, they are always different.  Notice that we need to
3659          make sure that both comparisons yield similar results to
3660          avoid comparing values that cannot be compared at
3661          compile-time.  */
3662       cmp1 = compare_values_warnv (vr0->max, vr1->min, strict_overflow_p);
3663       cmp2 = compare_values_warnv (vr0->min, vr1->max, strict_overflow_p);
3664       if ((cmp1 == -1 && cmp2 == -1) || (cmp1 == 1 && cmp2 == 1))
3665         return boolean_true_node;
3666
3667       /* If VR0 and VR1 represent a single value and are identical,
3668          return false.  */
3669       else if (compare_values_warnv (vr0->min, vr0->max,
3670                                      strict_overflow_p) == 0
3671                && compare_values_warnv (vr1->min, vr1->max,
3672                                         strict_overflow_p) == 0
3673                && compare_values_warnv (vr0->min, vr1->min,
3674                                         strict_overflow_p) == 0
3675                && compare_values_warnv (vr0->max, vr1->max,
3676                                         strict_overflow_p) == 0)
3677         return boolean_false_node;
3678
3679       /* Otherwise, they may or may not be different.  */
3680       else
3681         return NULL_TREE;
3682     }
3683   else if (comp == LT_EXPR || comp == LE_EXPR)
3684     {
3685       int tst;
3686
3687       /* If VR0 is to the left of VR1, return true.  */
3688       tst = compare_values_warnv (vr0->max, vr1->min, strict_overflow_p);
3689       if ((comp == LT_EXPR && tst == -1)
3690           || (comp == LE_EXPR && (tst == -1 || tst == 0)))
3691         {
3692           if (overflow_infinity_range_p (vr0)
3693               || overflow_infinity_range_p (vr1))
3694             *strict_overflow_p = true;
3695           return boolean_true_node;
3696         }
3697
3698       /* If VR0 is to the right of VR1, return false.  */
3699       tst = compare_values_warnv (vr0->min, vr1->max, strict_overflow_p);
3700       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
3701           || (comp == LE_EXPR && tst == 1))
3702         {
3703           if (overflow_infinity_range_p (vr0)
3704               || overflow_infinity_range_p (vr1))
3705             *strict_overflow_p = true;
3706           return boolean_false_node;
3707         }
3708
3709       /* Otherwise, we don't know.  */
3710       return NULL_TREE;
3711     }
3712
3713   gcc_unreachable ();
3714 }
3715
3716
3717 /* Given a value range VR, a value VAL and a comparison code COMP, return
3718    BOOLEAN_TRUE_NODE if VR COMP VAL always returns true for all the
3719    values in VR.  Return BOOLEAN_FALSE_NODE if the comparison
3720    always returns false.  Return NULL_TREE if it is not always
3721    possible to determine the value of the comparison.  Also set
3722    *STRICT_OVERFLOW_P to indicate whether a range with an overflow
3723    infinity was used in the test.  */
3724
3725 static tree
3726 compare_range_with_value (enum tree_code comp, value_range_t *vr, tree val,
3727                           bool *strict_overflow_p)
3728 {
3729   if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
3730     return NULL_TREE;
3731
3732   /* Anti-ranges need to be handled separately.  */
3733   if (vr->type == VR_ANTI_RANGE)
3734     {
3735       /* For anti-ranges, the only predicates that we can compute at
3736          compile time are equality and inequality.  */
3737       if (comp == GT_EXPR
3738           || comp == GE_EXPR
3739           || comp == LT_EXPR
3740           || comp == LE_EXPR)
3741         return NULL_TREE;
3742
3743       /* ~[VAL_1, VAL_2] OP VAL is known if VAL_1 <= VAL <= VAL_2.  */
3744       if (value_inside_range (val, vr) == 1)
3745         return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
3746
3747       return NULL_TREE;
3748     }
3749
3750   if (!usable_range_p (vr, strict_overflow_p))
3751     return NULL_TREE;
3752
3753   if (comp == EQ_EXPR)
3754     {
3755       /* EQ_EXPR may only be computed if VR represents exactly
3756          one value.  */
3757       if (compare_values_warnv (vr->min, vr->max, strict_overflow_p) == 0)
3758         {
3759           int cmp = compare_values_warnv (vr->min, val, strict_overflow_p);
3760           if (cmp == 0)
3761             return boolean_true_node;
3762           else if (cmp == -1 || cmp == 1 || cmp == 2)
3763             return boolean_false_node;
3764         }
3765       else if (compare_values_warnv (val, vr->min, strict_overflow_p) == -1
3766                || compare_values_warnv (vr->max, val, strict_overflow_p) == -1)
3767         return boolean_false_node;
3768
3769       return NULL_TREE;
3770     }
3771   else if (comp == NE_EXPR)
3772     {
3773       /* If VAL is not inside VR, then they are always different.  */
3774       if (compare_values_warnv (vr->max, val, strict_overflow_p) == -1
3775           || compare_values_warnv (vr->min, val, strict_overflow_p) == 1)
3776         return boolean_true_node;
3777
3778       /* If VR represents exactly one value equal to VAL, then return
3779          false.  */
3780       if (compare_values_warnv (vr->min, vr->max, strict_overflow_p) == 0
3781           && compare_values_warnv (vr->min, val, strict_overflow_p) == 0)
3782         return boolean_false_node;
3783
3784       /* Otherwise, they may or may not be different.  */
3785       return NULL_TREE;
3786     }
3787   else if (comp == LT_EXPR || comp == LE_EXPR)
3788     {
3789       int tst;
3790
3791       /* If VR is to the left of VAL, return true.  */
3792       tst = compare_values_warnv (vr->max, val, strict_overflow_p);
3793       if ((comp == LT_EXPR && tst == -1)
3794           || (comp == LE_EXPR && (tst == -1 || tst == 0)))
3795         {
3796           if (overflow_infinity_range_p (vr))
3797             *strict_overflow_p = true;
3798           return boolean_true_node;
3799         }
3800
3801       /* If VR is to the right of VAL, return false.  */
3802       tst = compare_values_warnv (vr->min, val, strict_overflow_p);
3803       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
3804           || (comp == LE_EXPR && tst == 1))
3805         {
3806           if (overflow_infinity_range_p (vr))
3807             *strict_overflow_p = true;
3808           return boolean_false_node;
3809         }
3810
3811       /* Otherwise, we don't know.  */
3812       return NULL_TREE;
3813     }
3814   else if (comp == GT_EXPR || comp == GE_EXPR)
3815     {
3816       int tst;
3817
3818       /* If VR is to the right of VAL, return true.  */
3819       tst = compare_values_warnv (vr->min, val, strict_overflow_p);
3820       if ((comp == GT_EXPR && tst == 1)
3821           || (comp == GE_EXPR && (tst == 0 || tst == 1)))
3822         {
3823           if (overflow_infinity_range_p (vr))
3824             *strict_overflow_p = true;
3825           return boolean_true_node;
3826         }
3827
3828       /* If VR is to the left of VAL, return false.  */
3829       tst = compare_values_warnv (vr->max, val, strict_overflow_p);
3830       if ((comp == GT_EXPR && (tst == -1 || tst == 0))
3831           || (comp == GE_EXPR && tst == -1))
3832         {
3833           if (overflow_infinity_range_p (vr))
3834             *strict_overflow_p = true;
3835           return boolean_false_node;
3836         }
3837
3838       /* Otherwise, we don't know.  */
3839       return NULL_TREE;
3840     }
3841
3842   gcc_unreachable ();
3843 }
3844
3845
3846 /* Debugging dumps.  */
3847
3848 void dump_value_range (FILE *, value_range_t *);
3849 void debug_value_range (value_range_t *);
3850 void dump_all_value_ranges (FILE *);
3851 void debug_all_value_ranges (void);
3852 void dump_vr_equiv (FILE *, bitmap);
3853 void debug_vr_equiv (bitmap);
3854
3855
3856 /* Dump value range VR to FILE.  */
3857
3858 void
3859 dump_value_range (FILE *file, value_range_t *vr)
3860 {
3861   if (vr == NULL)
3862     fprintf (file, "[]");
3863   else if (vr->type == VR_UNDEFINED)
3864     fprintf (file, "UNDEFINED");
3865   else if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
3866     {
3867       tree type = TREE_TYPE (vr->min);
3868
3869       fprintf (file, "%s[", (vr->type == VR_ANTI_RANGE) ? "~" : "");
3870
3871       if (is_negative_overflow_infinity (vr->min))
3872         fprintf (file, "-INF(OVF)");
3873       else if (INTEGRAL_TYPE_P (type)
3874                && !TYPE_UNSIGNED (type)
3875                && vrp_val_is_min (vr->min))
3876         fprintf (file, "-INF");
3877       else
3878         print_generic_expr (file, vr->min, 0);
3879
3880       fprintf (file, ", ");
3881
3882       if (is_positive_overflow_infinity (vr->max))
3883         fprintf (file, "+INF(OVF)");
3884       else if (INTEGRAL_TYPE_P (type)
3885                && vrp_val_is_max (vr->max))
3886         fprintf (file, "+INF");
3887       else
3888         print_generic_expr (file, vr->max, 0);
3889
3890       fprintf (file, "]");
3891
3892       if (vr->equiv)
3893         {
3894           bitmap_iterator bi;
3895           unsigned i, c = 0;
3896
3897           fprintf (file, "  EQUIVALENCES: { ");
3898
3899           EXECUTE_IF_SET_IN_BITMAP (vr->equiv, 0, i, bi)
3900             {
3901               print_generic_expr (file, ssa_name (i), 0);
3902               fprintf (file, " ");
3903               c++;
3904             }
3905
3906           fprintf (file, "} (%u elements)", c);
3907         }
3908     }
3909   else if (vr->type == VR_VARYING)
3910     fprintf (file, "VARYING");
3911   else
3912     fprintf (file, "INVALID RANGE");
3913 }
3914
3915
3916 /* Dump value range VR to stderr.  */
3917
3918 DEBUG_FUNCTION void
3919 debug_value_range (value_range_t *vr)
3920 {
3921   dump_value_range (stderr, vr);
3922   fprintf (stderr, "\n");
3923 }
3924
3925
3926 /* Dump value ranges of all SSA_NAMEs to FILE.  */
3927
3928 void
3929 dump_all_value_ranges (FILE *file)
3930 {
3931   size_t i;
3932
3933   for (i = 0; i < num_ssa_names; i++)
3934     {
3935       if (vr_value[i])
3936         {
3937           print_generic_expr (file, ssa_name (i), 0);
3938           fprintf (file, ": ");
3939           dump_value_range (file, vr_value[i]);
3940           fprintf (file, "\n");
3941         }
3942     }
3943
3944   fprintf (file, "\n");
3945 }
3946
3947
3948 /* Dump all value ranges to stderr.  */
3949
3950 DEBUG_FUNCTION void
3951 debug_all_value_ranges (void)
3952 {
3953   dump_all_value_ranges (stderr);
3954 }
3955
3956
3957 /* Given a COND_EXPR COND of the form 'V OP W', and an SSA name V,
3958    create a new SSA name N and return the assertion assignment
3959    'V = ASSERT_EXPR <V, V OP W>'.  */
3960
3961 static gimple
3962 build_assert_expr_for (tree cond, tree v)
3963 {
3964   tree n;
3965   gimple assertion;
3966
3967   gcc_assert (TREE_CODE (v) == SSA_NAME);
3968   n = duplicate_ssa_name (v, NULL);
3969
3970   if (COMPARISON_CLASS_P (cond))
3971     {
3972       tree a = build2 (ASSERT_EXPR, TREE_TYPE (v), v, cond);
3973       assertion = gimple_build_assign (n, a);
3974     }
3975   else if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
3976     {
3977       /* Given !V, build the assignment N = false.  */
3978       tree op0 = TREE_OPERAND (cond, 0);
3979       gcc_assert (op0 == v);
3980       assertion = gimple_build_assign (n, boolean_false_node);
3981     }
3982   else if (TREE_CODE (cond) == SSA_NAME)
3983     {
3984       /* Given V, build the assignment N = true.  */
3985       gcc_assert (v == cond);
3986       assertion = gimple_build_assign (n, boolean_true_node);
3987     }
3988   else
3989     gcc_unreachable ();
3990
3991   SSA_NAME_DEF_STMT (n) = assertion;
3992
3993   /* The new ASSERT_EXPR, creates a new SSA name that replaces the
3994      operand of the ASSERT_EXPR. Register the new name and the old one
3995      in the replacement table so that we can fix the SSA web after
3996      adding all the ASSERT_EXPRs.  */
3997   register_new_name_mapping (n, v);
3998
3999   return assertion;
4000 }
4001
4002
4003 /* Return false if EXPR is a predicate expression involving floating
4004    point values.  */
4005
4006 static inline bool
4007 fp_predicate (gimple stmt)
4008 {
4009   GIMPLE_CHECK (stmt, GIMPLE_COND);
4010
4011   return FLOAT_TYPE_P (TREE_TYPE (gimple_cond_lhs (stmt)));
4012 }
4013
4014
4015 /* If the range of values taken by OP can be inferred after STMT executes,
4016    return the comparison code (COMP_CODE_P) and value (VAL_P) that
4017    describes the inferred range.  Return true if a range could be
4018    inferred.  */
4019
4020 static bool
4021 infer_value_range (gimple stmt, tree op, enum tree_code *comp_code_p, tree *val_p)
4022 {
4023   *val_p = NULL_TREE;
4024   *comp_code_p = ERROR_MARK;
4025
4026   /* Do not attempt to infer anything in names that flow through
4027      abnormal edges.  */
4028   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
4029     return false;
4030
4031   /* Similarly, don't infer anything from statements that may throw
4032      exceptions.  */
4033   if (stmt_could_throw_p (stmt))
4034     return false;
4035
4036   /* If STMT is the last statement of a basic block with no
4037      successors, there is no point inferring anything about any of its
4038      operands.  We would not be able to find a proper insertion point
4039      for the assertion, anyway.  */
4040   if (stmt_ends_bb_p (stmt) && EDGE_COUNT (gimple_bb (stmt)->succs) == 0)
4041     return false;
4042
4043   /* We can only assume that a pointer dereference will yield
4044      non-NULL if -fdelete-null-pointer-checks is enabled.  */
4045   if (flag_delete_null_pointer_checks
4046       && POINTER_TYPE_P (TREE_TYPE (op))
4047       && gimple_code (stmt) != GIMPLE_ASM)
4048     {
4049       unsigned num_uses, num_loads, num_stores;
4050
4051       count_uses_and_derefs (op, stmt, &num_uses, &num_loads, &num_stores);
4052       if (num_loads + num_stores > 0)
4053         {
4054           *val_p = build_int_cst (TREE_TYPE (op), 0);
4055           *comp_code_p = NE_EXPR;
4056           return true;
4057         }
4058     }
4059
4060   return false;
4061 }
4062
4063
4064 void dump_asserts_for (FILE *, tree);
4065 void debug_asserts_for (tree);
4066 void dump_all_asserts (FILE *);
4067 void debug_all_asserts (void);
4068
4069 /* Dump all the registered assertions for NAME to FILE.  */
4070
4071 void
4072 dump_asserts_for (FILE *file, tree name)
4073 {
4074   assert_locus_t loc;
4075
4076   fprintf (file, "Assertions to be inserted for ");
4077   print_generic_expr (file, name, 0);
4078   fprintf (file, "\n");
4079
4080   loc = asserts_for[SSA_NAME_VERSION (name)];
4081   while (loc)
4082     {
4083       fprintf (file, "\t");
4084       print_gimple_stmt (file, gsi_stmt (loc->si), 0, 0);
4085       fprintf (file, "\n\tBB #%d", loc->bb->index);
4086       if (loc->e)
4087         {
4088           fprintf (file, "\n\tEDGE %d->%d", loc->e->src->index,
4089                    loc->e->dest->index);
4090           dump_edge_info (file, loc->e, 0);
4091         }
4092       fprintf (file, "\n\tPREDICATE: ");
4093       print_generic_expr (file, name, 0);
4094       fprintf (file, " %s ", tree_code_name[(int)loc->comp_code]);
4095       print_generic_expr (file, loc->val, 0);
4096       fprintf (file, "\n\n");
4097       loc = loc->next;
4098     }
4099
4100   fprintf (file, "\n");
4101 }
4102
4103
4104 /* Dump all the registered assertions for NAME to stderr.  */
4105
4106 DEBUG_FUNCTION void
4107 debug_asserts_for (tree name)
4108 {
4109   dump_asserts_for (stderr, name);
4110 }
4111
4112
4113 /* Dump all the registered assertions for all the names to FILE.  */
4114
4115 void
4116 dump_all_asserts (FILE *file)
4117 {
4118   unsigned i;
4119   bitmap_iterator bi;
4120
4121   fprintf (file, "\nASSERT_EXPRs to be inserted\n\n");
4122   EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
4123     dump_asserts_for (file, ssa_name (i));
4124   fprintf (file, "\n");
4125 }
4126
4127
4128 /* Dump all the registered assertions for all the names to stderr.  */
4129
4130 DEBUG_FUNCTION void
4131 debug_all_asserts (void)
4132 {
4133   dump_all_asserts (stderr);
4134 }
4135
4136
4137 /* If NAME doesn't have an ASSERT_EXPR registered for asserting
4138    'EXPR COMP_CODE VAL' at a location that dominates block BB or
4139    E->DEST, then register this location as a possible insertion point
4140    for ASSERT_EXPR <NAME, EXPR COMP_CODE VAL>.
4141
4142    BB, E and SI provide the exact insertion point for the new
4143    ASSERT_EXPR.  If BB is NULL, then the ASSERT_EXPR is to be inserted
4144    on edge E.  Otherwise, if E is NULL, the ASSERT_EXPR is inserted on
4145    BB.  If SI points to a COND_EXPR or a SWITCH_EXPR statement, then E
4146    must not be NULL.  */
4147
4148 static void
4149 register_new_assert_for (tree name, tree expr,
4150                          enum tree_code comp_code,
4151                          tree val,
4152                          basic_block bb,
4153                          edge e,
4154                          gimple_stmt_iterator si)
4155 {
4156   assert_locus_t n, loc, last_loc;
4157   basic_block dest_bb;
4158
4159   gcc_checking_assert (bb == NULL || e == NULL);
4160
4161   if (e == NULL)
4162     gcc_checking_assert (gimple_code (gsi_stmt (si)) != GIMPLE_COND
4163                          && gimple_code (gsi_stmt (si)) != GIMPLE_SWITCH);
4164
4165   /* Never build an assert comparing against an integer constant with
4166      TREE_OVERFLOW set.  This confuses our undefined overflow warning
4167      machinery.  */
4168   if (TREE_CODE (val) == INTEGER_CST
4169       && TREE_OVERFLOW (val))
4170     val = build_int_cst_wide (TREE_TYPE (val),
4171                               TREE_INT_CST_LOW (val), TREE_INT_CST_HIGH (val));
4172
4173   /* The new assertion A will be inserted at BB or E.  We need to
4174      determine if the new location is dominated by a previously
4175      registered location for A.  If we are doing an edge insertion,
4176      assume that A will be inserted at E->DEST.  Note that this is not
4177      necessarily true.
4178
4179      If E is a critical edge, it will be split.  But even if E is
4180      split, the new block will dominate the same set of blocks that
4181      E->DEST dominates.
4182
4183      The reverse, however, is not true, blocks dominated by E->DEST
4184      will not be dominated by the new block created to split E.  So,
4185      if the insertion location is on a critical edge, we will not use
4186      the new location to move another assertion previously registered
4187      at a block dominated by E->DEST.  */
4188   dest_bb = (bb) ? bb : e->dest;
4189
4190   /* If NAME already has an ASSERT_EXPR registered for COMP_CODE and
4191      VAL at a block dominating DEST_BB, then we don't need to insert a new
4192      one.  Similarly, if the same assertion already exists at a block
4193      dominated by DEST_BB and the new location is not on a critical
4194      edge, then update the existing location for the assertion (i.e.,
4195      move the assertion up in the dominance tree).
4196
4197      Note, this is implemented as a simple linked list because there
4198      should not be more than a handful of assertions registered per
4199      name.  If this becomes a performance problem, a table hashed by
4200      COMP_CODE and VAL could be implemented.  */
4201   loc = asserts_for[SSA_NAME_VERSION (name)];
4202   last_loc = loc;
4203   while (loc)
4204     {
4205       if (loc->comp_code == comp_code
4206           && (loc->val == val
4207               || operand_equal_p (loc->val, val, 0))
4208           && (loc->expr == expr
4209               || operand_equal_p (loc->expr, expr, 0)))
4210         {
4211           /* If the assertion NAME COMP_CODE VAL has already been
4212              registered at a basic block that dominates DEST_BB, then
4213              we don't need to insert the same assertion again.  Note
4214              that we don't check strict dominance here to avoid
4215              replicating the same assertion inside the same basic
4216              block more than once (e.g., when a pointer is
4217              dereferenced several times inside a block).
4218
4219              An exception to this rule are edge insertions.  If the
4220              new assertion is to be inserted on edge E, then it will
4221              dominate all the other insertions that we may want to
4222              insert in DEST_BB.  So, if we are doing an edge
4223              insertion, don't do this dominance check.  */
4224           if (e == NULL
4225               && dominated_by_p (CDI_DOMINATORS, dest_bb, loc->bb))
4226             return;
4227
4228           /* Otherwise, if E is not a critical edge and DEST_BB
4229              dominates the existing location for the assertion, move
4230              the assertion up in the dominance tree by updating its
4231              location information.  */
4232           if ((e == NULL || !EDGE_CRITICAL_P (e))
4233               && dominated_by_p (CDI_DOMINATORS, loc->bb, dest_bb))
4234             {
4235               loc->bb = dest_bb;
4236               loc->e = e;
4237               loc->si = si;
4238               return;
4239             }
4240         }
4241
4242       /* Update the last node of the list and move to the next one.  */
4243       last_loc = loc;
4244       loc = loc->next;
4245     }
4246
4247   /* If we didn't find an assertion already registered for
4248      NAME COMP_CODE VAL, add a new one at the end of the list of
4249      assertions associated with NAME.  */
4250   n = XNEW (struct assert_locus_d);
4251   n->bb = dest_bb;
4252   n->e = e;
4253   n->si = si;
4254   n->comp_code = comp_code;
4255   n->val = val;
4256   n->expr = expr;
4257   n->next = NULL;
4258
4259   if (last_loc)
4260     last_loc->next = n;
4261   else
4262     asserts_for[SSA_NAME_VERSION (name)] = n;
4263
4264   bitmap_set_bit (need_assert_for, SSA_NAME_VERSION (name));
4265 }
4266
4267 /* (COND_OP0 COND_CODE COND_OP1) is a predicate which uses NAME.
4268    Extract a suitable test code and value and store them into *CODE_P and
4269    *VAL_P so the predicate is normalized to NAME *CODE_P *VAL_P.
4270
4271    If no extraction was possible, return FALSE, otherwise return TRUE.
4272
4273    If INVERT is true, then we invert the result stored into *CODE_P.  */
4274
4275 static bool
4276 extract_code_and_val_from_cond_with_ops (tree name, enum tree_code cond_code,
4277                                          tree cond_op0, tree cond_op1,
4278                                          bool invert, enum tree_code *code_p,
4279                                          tree *val_p)
4280 {
4281   enum tree_code comp_code;
4282   tree val;
4283
4284   /* Otherwise, we have a comparison of the form NAME COMP VAL
4285      or VAL COMP NAME.  */
4286   if (name == cond_op1)
4287     {
4288       /* If the predicate is of the form VAL COMP NAME, flip
4289          COMP around because we need to register NAME as the
4290          first operand in the predicate.  */
4291       comp_code = swap_tree_comparison (cond_code);
4292       val = cond_op0;
4293     }
4294   else
4295     {
4296       /* The comparison is of the form NAME COMP VAL, so the
4297          comparison code remains unchanged.  */
4298       comp_code = cond_code;
4299       val = cond_op1;
4300     }
4301
4302   /* Invert the comparison code as necessary.  */
4303   if (invert)
4304     comp_code = invert_tree_comparison (comp_code, 0);
4305
4306   /* VRP does not handle float types.  */
4307   if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (val)))
4308     return false;
4309
4310   /* Do not register always-false predicates.
4311      FIXME:  this works around a limitation in fold() when dealing with
4312      enumerations.  Given 'enum { N1, N2 } x;', fold will not
4313      fold 'if (x > N2)' to 'if (0)'.  */
4314   if ((comp_code == GT_EXPR || comp_code == LT_EXPR)
4315       && INTEGRAL_TYPE_P (TREE_TYPE (val)))
4316     {
4317       tree min = TYPE_MIN_VALUE (TREE_TYPE (val));
4318       tree max = TYPE_MAX_VALUE (TREE_TYPE (val));
4319
4320       if (comp_code == GT_EXPR
4321           && (!max
4322               || compare_values (val, max) == 0))
4323         return false;
4324
4325       if (comp_code == LT_EXPR
4326           && (!min
4327               || compare_values (val, min) == 0))
4328         return false;
4329     }
4330   *code_p = comp_code;
4331   *val_p = val;
4332   return true;
4333 }
4334
4335 /* Try to register an edge assertion for SSA name NAME on edge E for
4336    the condition COND contributing to the conditional jump pointed to by BSI.
4337    Invert the condition COND if INVERT is true.
4338    Return true if an assertion for NAME could be registered.  */
4339
4340 static bool
4341 register_edge_assert_for_2 (tree name, edge e, gimple_stmt_iterator bsi,
4342                             enum tree_code cond_code,
4343                             tree cond_op0, tree cond_op1, bool invert)
4344 {
4345   tree val;
4346   enum tree_code comp_code;
4347   bool retval = false;
4348
4349   if (!extract_code_and_val_from_cond_with_ops (name, cond_code,
4350                                                 cond_op0,
4351                                                 cond_op1,
4352                                                 invert, &comp_code, &val))
4353     return false;
4354
4355   /* Only register an ASSERT_EXPR if NAME was found in the sub-graph
4356      reachable from E.  */
4357   if (live_on_edge (e, name)
4358       && !has_single_use (name))
4359     {
4360       register_new_assert_for (name, name, comp_code, val, NULL, e, bsi);
4361       retval = true;
4362     }
4363
4364   /* In the case of NAME <= CST and NAME being defined as
4365      NAME = (unsigned) NAME2 + CST2 we can assert NAME2 >= -CST2
4366      and NAME2 <= CST - CST2.  We can do the same for NAME > CST.
4367      This catches range and anti-range tests.  */
4368   if ((comp_code == LE_EXPR
4369        || comp_code == GT_EXPR)
4370       && TREE_CODE (val) == INTEGER_CST
4371       && TYPE_UNSIGNED (TREE_TYPE (val)))
4372     {
4373       gimple def_stmt = SSA_NAME_DEF_STMT (name);
4374       tree cst2 = NULL_TREE, name2 = NULL_TREE, name3 = NULL_TREE;
4375
4376       /* Extract CST2 from the (optional) addition.  */
4377       if (is_gimple_assign (def_stmt)
4378           && gimple_assign_rhs_code (def_stmt) == PLUS_EXPR)
4379         {
4380           name2 = gimple_assign_rhs1 (def_stmt);
4381           cst2 = gimple_assign_rhs2 (def_stmt);
4382           if (TREE_CODE (name2) == SSA_NAME
4383               && TREE_CODE (cst2) == INTEGER_CST)
4384             def_stmt = SSA_NAME_DEF_STMT (name2);
4385         }
4386
4387       /* Extract NAME2 from the (optional) sign-changing cast.  */
4388       if (gimple_assign_cast_p (def_stmt))
4389         {
4390           if (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def_stmt))
4391               && ! TYPE_UNSIGNED (TREE_TYPE (gimple_assign_rhs1 (def_stmt)))
4392               && (TYPE_PRECISION (gimple_expr_type (def_stmt))
4393                   == TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (def_stmt)))))
4394             name3 = gimple_assign_rhs1 (def_stmt);
4395         }
4396
4397       /* If name3 is used later, create an ASSERT_EXPR for it.  */
4398       if (name3 != NULL_TREE
4399           && TREE_CODE (name3) == SSA_NAME
4400           && (cst2 == NULL_TREE
4401               || TREE_CODE (cst2) == INTEGER_CST)
4402           && INTEGRAL_TYPE_P (TREE_TYPE (name3))
4403           && live_on_edge (e, name3)
4404           && !has_single_use (name3))
4405         {
4406           tree tmp;
4407
4408           /* Build an expression for the range test.  */
4409           tmp = build1 (NOP_EXPR, TREE_TYPE (name), name3);
4410           if (cst2 != NULL_TREE)
4411             tmp = build2 (PLUS_EXPR, TREE_TYPE (name), tmp, cst2);
4412
4413           if (dump_file)
4414             {
4415               fprintf (dump_file, "Adding assert for ");
4416               print_generic_expr (dump_file, name3, 0);
4417               fprintf (dump_file, " from ");
4418               print_generic_expr (dump_file, tmp, 0);
4419               fprintf (dump_file, "\n");
4420             }
4421
4422           register_new_assert_for (name3, tmp, comp_code, val, NULL, e, bsi);
4423
4424           retval = true;
4425         }
4426
4427       /* If name2 is used later, create an ASSERT_EXPR for it.  */
4428       if (name2 != NULL_TREE
4429           && TREE_CODE (name2) == SSA_NAME
4430           && TREE_CODE (cst2) == INTEGER_CST
4431           && INTEGRAL_TYPE_P (TREE_TYPE (name2))
4432           && live_on_edge (e, name2)
4433           && !has_single_use (name2))
4434         {
4435           tree tmp;
4436
4437           /* Build an expression for the range test.  */
4438           tmp = name2;
4439           if (TREE_TYPE (name) != TREE_TYPE (name2))
4440             tmp = build1 (NOP_EXPR, TREE_TYPE (name), tmp);
4441           if (cst2 != NULL_TREE)
4442             tmp = build2 (PLUS_EXPR, TREE_TYPE (name), tmp, cst2);
4443
4444           if (dump_file)
4445             {
4446               fprintf (dump_file, "Adding assert for ");
4447               print_generic_expr (dump_file, name2, 0);
4448               fprintf (dump_file, " from ");
4449               print_generic_expr (dump_file, tmp, 0);
4450               fprintf (dump_file, "\n");
4451             }
4452
4453           register_new_assert_for (name2, tmp, comp_code, val, NULL, e, bsi);
4454
4455           retval = true;
4456         }
4457     }
4458
4459   return retval;
4460 }
4461
4462 /* OP is an operand of a truth value expression which is known to have
4463    a particular value.  Register any asserts for OP and for any
4464    operands in OP's defining statement.
4465
4466    If CODE is EQ_EXPR, then we want to register OP is zero (false),
4467    if CODE is NE_EXPR, then we want to register OP is nonzero (true).   */
4468
4469 static bool
4470 register_edge_assert_for_1 (tree op, enum tree_code code,
4471                             edge e, gimple_stmt_iterator bsi)
4472 {
4473   bool retval = false;
4474   gimple op_def;
4475   tree val;
4476   enum tree_code rhs_code;
4477
4478   /* We only care about SSA_NAMEs.  */
4479   if (TREE_CODE (op) != SSA_NAME)
4480     return false;
4481
4482   /* We know that OP will have a zero or nonzero value.  If OP is used
4483      more than once go ahead and register an assert for OP.
4484
4485      The FOUND_IN_SUBGRAPH support is not helpful in this situation as
4486      it will always be set for OP (because OP is used in a COND_EXPR in
4487      the subgraph).  */
4488   if (!has_single_use (op))
4489     {
4490       val = build_int_cst (TREE_TYPE (op), 0);
4491       register_new_assert_for (op, op, code, val, NULL, e, bsi);
4492       retval = true;
4493     }
4494
4495   /* Now look at how OP is set.  If it's set from a comparison,
4496      a truth operation or some bit operations, then we may be able
4497      to register information about the operands of that assignment.  */
4498   op_def = SSA_NAME_DEF_STMT (op);
4499   if (gimple_code (op_def) != GIMPLE_ASSIGN)
4500     return retval;
4501
4502   rhs_code = gimple_assign_rhs_code (op_def);
4503
4504   if (TREE_CODE_CLASS (rhs_code) == tcc_comparison)
4505     {
4506       bool invert = (code == EQ_EXPR ? true : false);
4507       tree op0 = gimple_assign_rhs1 (op_def);
4508       tree op1 = gimple_assign_rhs2 (op_def);
4509
4510       if (TREE_CODE (op0) == SSA_NAME)
4511         retval |= register_edge_assert_for_2 (op0, e, bsi, rhs_code, op0, op1,
4512                                               invert);
4513       if (TREE_CODE (op1) == SSA_NAME)
4514         retval |= register_edge_assert_for_2 (op1, e, bsi, rhs_code, op0, op1,
4515                                               invert);
4516     }
4517   else if ((code == NE_EXPR
4518             && (gimple_assign_rhs_code (op_def) == TRUTH_AND_EXPR
4519                 || gimple_assign_rhs_code (op_def) == BIT_AND_EXPR))
4520            || (code == EQ_EXPR
4521                && (gimple_assign_rhs_code (op_def) == TRUTH_OR_EXPR
4522                    || gimple_assign_rhs_code (op_def) == BIT_IOR_EXPR)))
4523     {
4524       /* Recurse on each operand.  */
4525       retval |= register_edge_assert_for_1 (gimple_assign_rhs1 (op_def),
4526                                             code, e, bsi);
4527       retval |= register_edge_assert_for_1 (gimple_assign_rhs2 (op_def),
4528                                             code, e, bsi);
4529     }
4530   else if (gimple_assign_rhs_code (op_def) == TRUTH_NOT_EXPR)
4531     {
4532       /* Recurse, flipping CODE.  */
4533       code = invert_tree_comparison (code, false);
4534       retval |= register_edge_assert_for_1 (gimple_assign_rhs1 (op_def),
4535                                             code, e, bsi);
4536     }
4537   else if (gimple_assign_rhs_code (op_def) == SSA_NAME)
4538     {
4539       /* Recurse through the copy.  */
4540       retval |= register_edge_assert_for_1 (gimple_assign_rhs1 (op_def),
4541                                             code, e, bsi);
4542     }
4543   else if (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (op_def)))
4544     {
4545       /* Recurse through the type conversion.  */
4546       retval |= register_edge_assert_for_1 (gimple_assign_rhs1 (op_def),
4547                                             code, e, bsi);
4548     }
4549
4550   return retval;
4551 }
4552
4553 /* Try to register an edge assertion for SSA name NAME on edge E for
4554    the condition COND contributing to the conditional jump pointed to by SI.
4555    Return true if an assertion for NAME could be registered.  */
4556
4557 static bool
4558 register_edge_assert_for (tree name, edge e, gimple_stmt_iterator si,
4559                           enum tree_code cond_code, tree cond_op0,
4560                           tree cond_op1)
4561 {
4562   tree val;
4563   enum tree_code comp_code;
4564   bool retval = false;
4565   bool is_else_edge = (e->flags & EDGE_FALSE_VALUE) != 0;
4566
4567   /* Do not attempt to infer anything in names that flow through
4568      abnormal edges.  */
4569   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
4570     return false;
4571
4572   if (!extract_code_and_val_from_cond_with_ops (name, cond_code,
4573                                                 cond_op0, cond_op1,
4574                                                 is_else_edge,
4575                                                 &comp_code, &val))
4576     return false;
4577
4578   /* Register ASSERT_EXPRs for name.  */
4579   retval |= register_edge_assert_for_2 (name, e, si, cond_code, cond_op0,
4580                                         cond_op1, is_else_edge);
4581
4582
4583   /* If COND is effectively an equality test of an SSA_NAME against
4584      the value zero or one, then we may be able to assert values
4585      for SSA_NAMEs which flow into COND.  */
4586
4587   /* In the case of NAME == 1 or NAME != 0, for TRUTH_AND_EXPR defining
4588      statement of NAME we can assert both operands of the TRUTH_AND_EXPR
4589      have nonzero value.  */
4590   if (((comp_code == EQ_EXPR && integer_onep (val))
4591        || (comp_code == NE_EXPR && integer_zerop (val))))
4592     {
4593       gimple def_stmt = SSA_NAME_DEF_STMT (name);
4594
4595       if (is_gimple_assign (def_stmt)
4596           && (gimple_assign_rhs_code (def_stmt) == TRUTH_AND_EXPR
4597               || gimple_assign_rhs_code (def_stmt) == BIT_AND_EXPR))
4598         {
4599           tree op0 = gimple_assign_rhs1 (def_stmt);
4600           tree op1 = gimple_assign_rhs2 (def_stmt);
4601           retval |= register_edge_assert_for_1 (op0, NE_EXPR, e, si);
4602           retval |= register_edge_assert_for_1 (op1, NE_EXPR, e, si);
4603         }
4604     }
4605
4606   /* In the case of NAME == 0 or NAME != 1, for TRUTH_OR_EXPR defining
4607      statement of NAME we can assert both operands of the TRUTH_OR_EXPR
4608      have zero value.  */
4609   if (((comp_code == EQ_EXPR && integer_zerop (val))
4610        || (comp_code == NE_EXPR && integer_onep (val))))
4611     {
4612       gimple def_stmt = SSA_NAME_DEF_STMT (name);
4613
4614       if (is_gimple_assign (def_stmt)
4615           && (gimple_assign_rhs_code (def_stmt) == TRUTH_OR_EXPR
4616               /* For BIT_IOR_EXPR only if NAME == 0 both operands have
4617                  necessarily zero value.  */
4618               || (comp_code == EQ_EXPR
4619                   && (gimple_assign_rhs_code (def_stmt) == BIT_IOR_EXPR))))
4620         {
4621           tree op0 = gimple_assign_rhs1 (def_stmt);
4622           tree op1 = gimple_assign_rhs2 (def_stmt);
4623           retval |= register_edge_assert_for_1 (op0, EQ_EXPR, e, si);
4624           retval |= register_edge_assert_for_1 (op1, EQ_EXPR, e, si);
4625         }
4626     }
4627
4628   return retval;
4629 }
4630
4631
4632 /* Determine whether the outgoing edges of BB should receive an
4633    ASSERT_EXPR for each of the operands of BB's LAST statement.
4634    The last statement of BB must be a COND_EXPR.
4635
4636    If any of the sub-graphs rooted at BB have an interesting use of
4637    the predicate operands, an assert location node is added to the
4638    list of assertions for the corresponding operands.  */
4639
4640 static bool
4641 find_conditional_asserts (basic_block bb, gimple last)
4642 {
4643   bool need_assert;
4644   gimple_stmt_iterator bsi;
4645   tree op;
4646   edge_iterator ei;
4647   edge e;
4648   ssa_op_iter iter;
4649
4650   need_assert = false;
4651   bsi = gsi_for_stmt (last);
4652
4653   /* Look for uses of the operands in each of the sub-graphs
4654      rooted at BB.  We need to check each of the outgoing edges
4655      separately, so that we know what kind of ASSERT_EXPR to
4656      insert.  */
4657   FOR_EACH_EDGE (e, ei, bb->succs)
4658     {
4659       if (e->dest == bb)
4660         continue;
4661
4662       /* Register the necessary assertions for each operand in the
4663          conditional predicate.  */
4664       FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
4665         {
4666           need_assert |= register_edge_assert_for (op, e, bsi,
4667                                                    gimple_cond_code (last),
4668                                                    gimple_cond_lhs (last),
4669                                                    gimple_cond_rhs (last));
4670         }
4671     }
4672
4673   return need_assert;
4674 }
4675
4676 struct case_info
4677 {
4678   tree expr;
4679   basic_block bb;
4680 };
4681
4682 /* Compare two case labels sorting first by the destination bb index
4683    and then by the case value.  */
4684
4685 static int
4686 compare_case_labels (const void *p1, const void *p2)
4687 {
4688   const struct case_info *ci1 = (const struct case_info *) p1;
4689   const struct case_info *ci2 = (const struct case_info *) p2;
4690   int idx1 = ci1->bb->index;
4691   int idx2 = ci2->bb->index;
4692
4693   if (idx1 < idx2)
4694     return -1;
4695   else if (idx1 == idx2)
4696     {
4697       /* Make sure the default label is first in a group.  */
4698       if (!CASE_LOW (ci1->expr))
4699         return -1;
4700       else if (!CASE_LOW (ci2->expr))
4701         return 1;
4702       else
4703         return tree_int_cst_compare (CASE_LOW (ci1->expr),
4704                                      CASE_LOW (ci2->expr));
4705     }
4706   else
4707     return 1;
4708 }
4709
4710 /* Determine whether the outgoing edges of BB should receive an
4711    ASSERT_EXPR for each of the operands of BB's LAST statement.
4712    The last statement of BB must be a SWITCH_EXPR.
4713
4714    If any of the sub-graphs rooted at BB have an interesting use of
4715    the predicate operands, an assert location node is added to the
4716    list of assertions for the corresponding operands.  */
4717
4718 static bool
4719 find_switch_asserts (basic_block bb, gimple last)
4720 {
4721   bool need_assert;
4722   gimple_stmt_iterator bsi;
4723   tree op;
4724   edge e;
4725   struct case_info *ci;
4726   size_t n = gimple_switch_num_labels (last);
4727 #if GCC_VERSION >= 4000
4728   unsigned int idx;
4729 #else
4730   /* Work around GCC 3.4 bug (PR 37086).  */
4731   volatile unsigned int idx;
4732 #endif
4733
4734   need_assert = false;
4735   bsi = gsi_for_stmt (last);
4736   op = gimple_switch_index (last);
4737   if (TREE_CODE (op) != SSA_NAME)
4738     return false;
4739
4740   /* Build a vector of case labels sorted by destination label.  */
4741   ci = XNEWVEC (struct case_info, n);
4742   for (idx = 0; idx < n; ++idx)
4743     {
4744       ci[idx].expr = gimple_switch_label (last, idx);
4745       ci[idx].bb = label_to_block (CASE_LABEL (ci[idx].expr));
4746     }
4747   qsort (ci, n, sizeof (struct case_info), compare_case_labels);
4748
4749   for (idx = 0; idx < n; ++idx)
4750     {
4751       tree min, max;
4752       tree cl = ci[idx].expr;
4753       basic_block cbb = ci[idx].bb;
4754
4755       min = CASE_LOW (cl);
4756       max = CASE_HIGH (cl);
4757
4758       /* If there are multiple case labels with the same destination
4759          we need to combine them to a single value range for the edge.  */
4760       if (idx + 1 < n && cbb == ci[idx + 1].bb)
4761         {
4762           /* Skip labels until the last of the group.  */
4763           do {
4764             ++idx;
4765           } while (idx < n && cbb == ci[idx].bb);
4766           --idx;
4767
4768           /* Pick up the maximum of the case label range.  */
4769           if (CASE_HIGH (ci[idx].expr))
4770             max = CASE_HIGH (ci[idx].expr);
4771           else
4772             max = CASE_LOW (ci[idx].expr);
4773         }
4774
4775       /* Nothing to do if the range includes the default label until we
4776          can register anti-ranges.  */
4777       if (min == NULL_TREE)
4778         continue;
4779
4780       /* Find the edge to register the assert expr on.  */
4781       e = find_edge (bb, cbb);
4782
4783       /* Register the necessary assertions for the operand in the
4784          SWITCH_EXPR.  */
4785       need_assert |= register_edge_assert_for (op, e, bsi,
4786                                                max ? GE_EXPR : EQ_EXPR,
4787                                                op,
4788                                                fold_convert (TREE_TYPE (op),
4789                                                              min));
4790       if (max)
4791         {
4792           need_assert |= register_edge_assert_for (op, e, bsi, LE_EXPR,
4793                                                    op,
4794                                                    fold_convert (TREE_TYPE (op),
4795                                                                  max));
4796         }
4797     }
4798
4799   XDELETEVEC (ci);
4800   return need_assert;
4801 }
4802
4803
4804 /* Traverse all the statements in block BB looking for statements that
4805    may generate useful assertions for the SSA names in their operand.
4806    If a statement produces a useful assertion A for name N_i, then the
4807    list of assertions already generated for N_i is scanned to
4808    determine if A is actually needed.
4809
4810    If N_i already had the assertion A at a location dominating the
4811    current location, then nothing needs to be done.  Otherwise, the
4812    new location for A is recorded instead.
4813
4814    1- For every statement S in BB, all the variables used by S are
4815       added to bitmap FOUND_IN_SUBGRAPH.
4816
4817    2- If statement S uses an operand N in a way that exposes a known
4818       value range for N, then if N was not already generated by an
4819       ASSERT_EXPR, create a new assert location for N.  For instance,
4820       if N is a pointer and the statement dereferences it, we can
4821       assume that N is not NULL.
4822
4823    3- COND_EXPRs are a special case of #2.  We can derive range
4824       information from the predicate but need to insert different
4825       ASSERT_EXPRs for each of the sub-graphs rooted at the
4826       conditional block.  If the last statement of BB is a conditional
4827       expression of the form 'X op Y', then
4828
4829       a) Remove X and Y from the set FOUND_IN_SUBGRAPH.
4830
4831       b) If the conditional is the only entry point to the sub-graph
4832          corresponding to the THEN_CLAUSE, recurse into it.  On
4833          return, if X and/or Y are marked in FOUND_IN_SUBGRAPH, then
4834          an ASSERT_EXPR is added for the corresponding variable.
4835
4836       c) Repeat step (b) on the ELSE_CLAUSE.
4837
4838       d) Mark X and Y in FOUND_IN_SUBGRAPH.
4839
4840       For instance,
4841
4842             if (a == 9)
4843               b = a;
4844             else
4845               b = c + 1;
4846
4847       In this case, an assertion on the THEN clause is useful to
4848       determine that 'a' is always 9 on that edge.  However, an assertion
4849       on the ELSE clause would be unnecessary.
4850
4851    4- If BB does not end in a conditional expression, then we recurse
4852       into BB's dominator children.
4853
4854    At the end of the recursive traversal, every SSA name will have a
4855    list of locations where ASSERT_EXPRs should be added.  When a new
4856    location for name N is found, it is registered by calling
4857    register_new_assert_for.  That function keeps track of all the
4858    registered assertions to prevent adding unnecessary assertions.
4859    For instance, if a pointer P_4 is dereferenced more than once in a
4860    dominator tree, only the location dominating all the dereference of
4861    P_4 will receive an ASSERT_EXPR.
4862
4863    If this function returns true, then it means that there are names
4864    for which we need to generate ASSERT_EXPRs.  Those assertions are
4865    inserted by process_assert_insertions.  */
4866
4867 static bool
4868 find_assert_locations_1 (basic_block bb, sbitmap live)
4869 {
4870   gimple_stmt_iterator si;
4871   gimple last;
4872   gimple phi;
4873   bool need_assert;
4874
4875   need_assert = false;
4876   last = last_stmt (bb);
4877
4878   /* If BB's last statement is a conditional statement involving integer
4879      operands, determine if we need to add ASSERT_EXPRs.  */
4880   if (last
4881       && gimple_code (last) == GIMPLE_COND
4882       && !fp_predicate (last)
4883       && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
4884     need_assert |= find_conditional_asserts (bb, last);
4885
4886   /* If BB's last statement is a switch statement involving integer
4887      operands, determine if we need to add ASSERT_EXPRs.  */
4888   if (last
4889       && gimple_code (last) == GIMPLE_SWITCH
4890       && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
4891     need_assert |= find_switch_asserts (bb, last);
4892
4893   /* Traverse all the statements in BB marking used names and looking
4894      for statements that may infer assertions for their used operands.  */
4895   for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
4896     {
4897       gimple stmt;
4898       tree op;
4899       ssa_op_iter i;
4900
4901       stmt = gsi_stmt (si);
4902
4903       if (is_gimple_debug (stmt))
4904         continue;
4905
4906       /* See if we can derive an assertion for any of STMT's operands.  */
4907       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
4908         {
4909           tree value;
4910           enum tree_code comp_code;
4911
4912           /* Mark OP in our live bitmap.  */
4913           SET_BIT (live, SSA_NAME_VERSION (op));
4914
4915           /* If OP is used in such a way that we can infer a value
4916              range for it, and we don't find a previous assertion for
4917              it, create a new assertion location node for OP.  */
4918           if (infer_value_range (stmt, op, &comp_code, &value))
4919             {
4920               /* If we are able to infer a nonzero value range for OP,
4921                  then walk backwards through the use-def chain to see if OP
4922                  was set via a typecast.
4923
4924                  If so, then we can also infer a nonzero value range
4925                  for the operand of the NOP_EXPR.  */
4926               if (comp_code == NE_EXPR && integer_zerop (value))
4927                 {
4928                   tree t = op;
4929                   gimple def_stmt = SSA_NAME_DEF_STMT (t);
4930
4931                   while (is_gimple_assign (def_stmt)
4932                          && gimple_assign_rhs_code (def_stmt)  == NOP_EXPR
4933                          && TREE_CODE
4934                              (gimple_assign_rhs1 (def_stmt)) == SSA_NAME
4935                          && POINTER_TYPE_P
4936                              (TREE_TYPE (gimple_assign_rhs1 (def_stmt))))
4937                     {
4938                       t = gimple_assign_rhs1 (def_stmt);
4939                       def_stmt = SSA_NAME_DEF_STMT (t);
4940
4941                       /* Note we want to register the assert for the
4942                          operand of the NOP_EXPR after SI, not after the
4943                          conversion.  */
4944                       if (! has_single_use (t))
4945                         {
4946                           register_new_assert_for (t, t, comp_code, value,
4947                                                    bb, NULL, si);
4948                           need_assert = true;
4949                         }
4950                     }
4951                 }
4952
4953               /* If OP is used only once, namely in this STMT, don't
4954                  bother creating an ASSERT_EXPR for it.  Such an
4955                  ASSERT_EXPR would do nothing but increase compile time.  */
4956               if (!has_single_use (op))
4957                 {
4958                   register_new_assert_for (op, op, comp_code, value,
4959                                            bb, NULL, si);
4960                   need_assert = true;
4961                 }
4962             }
4963         }
4964     }
4965
4966   /* Traverse all PHI nodes in BB marking used operands.  */
4967   for (si = gsi_start_phis (bb); !gsi_end_p(si); gsi_next (&si))
4968     {
4969       use_operand_p arg_p;
4970       ssa_op_iter i;
4971       phi = gsi_stmt (si);
4972
4973       FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_USE)
4974         {
4975           tree arg = USE_FROM_PTR (arg_p);
4976           if (TREE_CODE (arg) == SSA_NAME)
4977             SET_BIT (live, SSA_NAME_VERSION (arg));
4978         }
4979     }
4980
4981   return need_assert;
4982 }
4983
4984 /* Do an RPO walk over the function computing SSA name liveness
4985    on-the-fly and deciding on assert expressions to insert.
4986    Returns true if there are assert expressions to be inserted.  */
4987
4988 static bool
4989 find_assert_locations (void)
4990 {
4991   int *rpo = XCNEWVEC (int, last_basic_block + NUM_FIXED_BLOCKS);
4992   int *bb_rpo = XCNEWVEC (int, last_basic_block + NUM_FIXED_BLOCKS);
4993   int *last_rpo = XCNEWVEC (int, last_basic_block + NUM_FIXED_BLOCKS);
4994   int rpo_cnt, i;
4995   bool need_asserts;
4996
4997   live = XCNEWVEC (sbitmap, last_basic_block + NUM_FIXED_BLOCKS);
4998   rpo_cnt = pre_and_rev_post_order_compute (NULL, rpo, false);
4999   for (i = 0; i < rpo_cnt; ++i)
5000     bb_rpo[rpo[i]] = i;
5001
5002   need_asserts = false;
5003   for (i = rpo_cnt-1; i >= 0; --i)
5004     {
5005       basic_block bb = BASIC_BLOCK (rpo[i]);
5006       edge e;
5007       edge_iterator ei;
5008
5009       if (!live[rpo[i]])
5010         {
5011           live[rpo[i]] = sbitmap_alloc (num_ssa_names);
5012           sbitmap_zero (live[rpo[i]]);
5013         }
5014
5015       /* Process BB and update the live information with uses in
5016          this block.  */
5017       need_asserts |= find_assert_locations_1 (bb, live[rpo[i]]);
5018
5019       /* Merge liveness into the predecessor blocks and free it.  */
5020       if (!sbitmap_empty_p (live[rpo[i]]))
5021         {
5022           int pred_rpo = i;
5023           FOR_EACH_EDGE (e, ei, bb->preds)
5024             {
5025               int pred = e->src->index;
5026               if (e->flags & EDGE_DFS_BACK)
5027                 continue;
5028
5029               if (!live[pred])
5030                 {
5031                   live[pred] = sbitmap_alloc (num_ssa_names);
5032                   sbitmap_zero (live[pred]);
5033                 }
5034               sbitmap_a_or_b (live[pred], live[pred], live[rpo[i]]);
5035
5036               if (bb_rpo[pred] < pred_rpo)
5037                 pred_rpo = bb_rpo[pred];
5038             }
5039
5040           /* Record the RPO number of the last visited block that needs
5041              live information from this block.  */
5042           last_rpo[rpo[i]] = pred_rpo;
5043         }
5044       else
5045         {
5046           sbitmap_free (live[rpo[i]]);
5047           live[rpo[i]] = NULL;
5048         }
5049
5050       /* We can free all successors live bitmaps if all their
5051          predecessors have been visited already.  */
5052       FOR_EACH_EDGE (e, ei, bb->succs)
5053         if (last_rpo[e->dest->index] == i
5054             && live[e->dest->index])
5055           {
5056             sbitmap_free (live[e->dest->index]);
5057             live[e->dest->index] = NULL;
5058           }
5059     }
5060
5061   XDELETEVEC (rpo);
5062   XDELETEVEC (bb_rpo);
5063   XDELETEVEC (last_rpo);
5064   for (i = 0; i < last_basic_block + NUM_FIXED_BLOCKS; ++i)
5065     if (live[i])
5066       sbitmap_free (live[i]);
5067   XDELETEVEC (live);
5068
5069   return need_asserts;
5070 }
5071
5072 /* Create an ASSERT_EXPR for NAME and insert it in the location
5073    indicated by LOC.  Return true if we made any edge insertions.  */
5074
5075 static bool
5076 process_assert_insertions_for (tree name, assert_locus_t loc)
5077 {
5078   /* Build the comparison expression NAME_i COMP_CODE VAL.  */
5079   gimple stmt;
5080   tree cond;
5081   gimple assert_stmt;
5082   edge_iterator ei;
5083   edge e;
5084
5085   /* If we have X <=> X do not insert an assert expr for that.  */
5086   if (loc->expr == loc->val)
5087     return false;
5088
5089   cond = build2 (loc->comp_code, boolean_type_node, loc->expr, loc->val);
5090   assert_stmt = build_assert_expr_for (cond, name);
5091   if (loc->e)
5092     {
5093       /* We have been asked to insert the assertion on an edge.  This
5094          is used only by COND_EXPR and SWITCH_EXPR assertions.  */
5095       gcc_checking_assert (gimple_code (gsi_stmt (loc->si)) == GIMPLE_COND
5096                            || (gimple_code (gsi_stmt (loc->si))
5097                                == GIMPLE_SWITCH));
5098
5099       gsi_insert_on_edge (loc->e, assert_stmt);
5100       return true;
5101     }
5102
5103   /* Otherwise, we can insert right after LOC->SI iff the
5104      statement must not be the last statement in the block.  */
5105   stmt = gsi_stmt (loc->si);
5106   if (!stmt_ends_bb_p (stmt))
5107     {
5108       gsi_insert_after (&loc->si, assert_stmt, GSI_SAME_STMT);
5109       return false;
5110     }
5111
5112   /* If STMT must be the last statement in BB, we can only insert new
5113      assertions on the non-abnormal edge out of BB.  Note that since
5114      STMT is not control flow, there may only be one non-abnormal edge
5115      out of BB.  */
5116   FOR_EACH_EDGE (e, ei, loc->bb->succs)
5117     if (!(e->flags & EDGE_ABNORMAL))
5118       {
5119         gsi_insert_on_edge (e, assert_stmt);
5120         return true;
5121       }
5122
5123   gcc_unreachable ();
5124 }
5125
5126
5127 /* Process all the insertions registered for every name N_i registered
5128    in NEED_ASSERT_FOR.  The list of assertions to be inserted are
5129    found in ASSERTS_FOR[i].  */
5130
5131 static void
5132 process_assert_insertions (void)
5133 {
5134   unsigned i;
5135   bitmap_iterator bi;
5136   bool update_edges_p = false;
5137   int num_asserts = 0;
5138
5139   if (dump_file && (dump_flags & TDF_DETAILS))
5140     dump_all_asserts (dump_file);
5141
5142   EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
5143     {
5144       assert_locus_t loc = asserts_for[i];
5145       gcc_assert (loc);
5146
5147       while (loc)
5148         {
5149           assert_locus_t next = loc->next;
5150           update_edges_p |= process_assert_insertions_for (ssa_name (i), loc);
5151           free (loc);
5152           loc = next;
5153           num_asserts++;
5154         }
5155     }
5156
5157   if (update_edges_p)
5158     gsi_commit_edge_inserts ();
5159
5160   statistics_counter_event (cfun, "Number of ASSERT_EXPR expressions inserted",
5161                             num_asserts);
5162 }
5163
5164
5165 /* Traverse the flowgraph looking for conditional jumps to insert range
5166    expressions.  These range expressions are meant to provide information
5167    to optimizations that need to reason in terms of value ranges.  They
5168    will not be expanded into RTL.  For instance, given:
5169
5170    x = ...
5171    y = ...
5172    if (x < y)
5173      y = x - 2;
5174    else
5175      x = y + 3;
5176
5177    this pass will transform the code into:
5178
5179    x = ...
5180    y = ...
5181    if (x < y)
5182     {
5183       x = ASSERT_EXPR <x, x < y>
5184       y = x - 2
5185     }
5186    else
5187     {
5188       y = ASSERT_EXPR <y, x <= y>
5189       x = y + 3
5190     }
5191
5192    The idea is that once copy and constant propagation have run, other
5193    optimizations will be able to determine what ranges of values can 'x'
5194    take in different paths of the code, simply by checking the reaching
5195    definition of 'x'.  */
5196
5197 static void
5198 insert_range_assertions (void)
5199 {
5200   need_assert_for = BITMAP_ALLOC (NULL);
5201   asserts_for = XCNEWVEC (assert_locus_t, num_ssa_names);
5202
5203   calculate_dominance_info (CDI_DOMINATORS);
5204
5205   if (find_assert_locations ())
5206     {
5207       process_assert_insertions ();
5208       update_ssa (TODO_update_ssa_no_phi);
5209     }
5210
5211   if (dump_file && (dump_flags & TDF_DETAILS))
5212     {
5213       fprintf (dump_file, "\nSSA form after inserting ASSERT_EXPRs\n");
5214       dump_function_to_file (current_function_decl, dump_file, dump_flags);
5215     }
5216
5217   free (asserts_for);
5218   BITMAP_FREE (need_assert_for);
5219 }
5220
5221 /* Checks one ARRAY_REF in REF, located at LOCUS. Ignores flexible arrays
5222    and "struct" hacks. If VRP can determine that the
5223    array subscript is a constant, check if it is outside valid
5224    range. If the array subscript is a RANGE, warn if it is
5225    non-overlapping with valid range.
5226    IGNORE_OFF_BY_ONE is true if the ARRAY_REF is inside a ADDR_EXPR.  */
5227
5228 static void
5229 check_array_ref (location_t location, tree ref, bool ignore_off_by_one)
5230 {
5231   value_range_t* vr = NULL;
5232   tree low_sub, up_sub;
5233   tree low_bound, up_bound, up_bound_p1;
5234   tree base;
5235
5236   if (TREE_NO_WARNING (ref))
5237     return;
5238
5239   low_sub = up_sub = TREE_OPERAND (ref, 1);
5240   up_bound = array_ref_up_bound (ref);
5241
5242   /* Can not check flexible arrays.  */
5243   if (!up_bound
5244       || TREE_CODE (up_bound) != INTEGER_CST)
5245     return;
5246
5247   /* Accesses to trailing arrays via pointers may access storage
5248      beyond the types array bounds.  */
5249   base = get_base_address (ref);
5250   if (base && TREE_CODE (base) == MEM_REF)
5251     {
5252       tree cref, next = NULL_TREE;
5253
5254       if (TREE_CODE (TREE_OPERAND (ref, 0)) != COMPONENT_REF)
5255         return;
5256
5257       cref = TREE_OPERAND (ref, 0);
5258       if (TREE_CODE (TREE_TYPE (TREE_OPERAND (cref, 0))) == RECORD_TYPE)
5259         for (next = DECL_CHAIN (TREE_OPERAND (cref, 1));
5260              next && TREE_CODE (next) != FIELD_DECL;
5261              next = DECL_CHAIN (next))
5262           ;
5263
5264       /* If this is the last field in a struct type or a field in a
5265          union type do not warn.  */
5266       if (!next)
5267         return;
5268     }
5269
5270   low_bound = array_ref_low_bound (ref);
5271   up_bound_p1 = int_const_binop (PLUS_EXPR, up_bound, integer_one_node);
5272
5273   if (TREE_CODE (low_sub) == SSA_NAME)
5274     {
5275       vr = get_value_range (low_sub);
5276       if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
5277         {
5278           low_sub = vr->type == VR_RANGE ? vr->max : vr->min;
5279           up_sub = vr->type == VR_RANGE ? vr->min : vr->max;
5280         }
5281     }
5282
5283   if (vr && vr->type == VR_ANTI_RANGE)
5284     {
5285       if (TREE_CODE (up_sub) == INTEGER_CST
5286           && tree_int_cst_lt (up_bound, up_sub)
5287           && TREE_CODE (low_sub) == INTEGER_CST
5288           && tree_int_cst_lt (low_sub, low_bound))
5289         {
5290           warning_at (location, OPT_Warray_bounds,
5291                       "array subscript is outside array bounds");
5292           TREE_NO_WARNING (ref) = 1;
5293         }
5294     }
5295   else if (TREE_CODE (up_sub) == INTEGER_CST
5296            && (ignore_off_by_one
5297                ? (tree_int_cst_lt (up_bound, up_sub)
5298                   && !tree_int_cst_equal (up_bound_p1, up_sub))
5299                : (tree_int_cst_lt (up_bound, up_sub)
5300                   || tree_int_cst_equal (up_bound_p1, up_sub))))
5301     {
5302       warning_at (location, OPT_Warray_bounds,
5303                   "array subscript is above array bounds");
5304       TREE_NO_WARNING (ref) = 1;
5305     }
5306   else if (TREE_CODE (low_sub) == INTEGER_CST
5307            && tree_int_cst_lt (low_sub, low_bound))
5308     {
5309       warning_at (location, OPT_Warray_bounds,
5310                   "array subscript is below array bounds");
5311       TREE_NO_WARNING (ref) = 1;
5312     }
5313 }
5314
5315 /* Searches if the expr T, located at LOCATION computes
5316    address of an ARRAY_REF, and call check_array_ref on it.  */
5317
5318 static void
5319 search_for_addr_array (tree t, location_t location)
5320 {
5321   while (TREE_CODE (t) == SSA_NAME)
5322     {
5323       gimple g = SSA_NAME_DEF_STMT (t);
5324
5325       if (gimple_code (g) != GIMPLE_ASSIGN)
5326         return;
5327
5328       if (get_gimple_rhs_class (gimple_assign_rhs_code (g))
5329           != GIMPLE_SINGLE_RHS)
5330         return;
5331
5332       t = gimple_assign_rhs1 (g);
5333     }
5334
5335
5336   /* We are only interested in addresses of ARRAY_REF's.  */
5337   if (TREE_CODE (t) != ADDR_EXPR)
5338     return;
5339
5340   /* Check each ARRAY_REFs in the reference chain. */
5341   do
5342     {
5343       if (TREE_CODE (t) == ARRAY_REF)
5344         check_array_ref (location, t, true /*ignore_off_by_one*/);
5345
5346       t = TREE_OPERAND (t, 0);
5347     }
5348   while (handled_component_p (t));
5349
5350   if (TREE_CODE (t) == MEM_REF
5351       && TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR
5352       && !TREE_NO_WARNING (t))
5353     {
5354       tree tem = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
5355       tree low_bound, up_bound, el_sz;
5356       double_int idx;
5357       if (TREE_CODE (TREE_TYPE (tem)) != ARRAY_TYPE
5358           || TREE_CODE (TREE_TYPE (TREE_TYPE (tem))) == ARRAY_TYPE
5359           || !TYPE_DOMAIN (TREE_TYPE (tem)))
5360         return;
5361
5362       low_bound = TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (tem)));
5363       up_bound = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (tem)));
5364       el_sz = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (tem)));
5365       if (!low_bound
5366           || TREE_CODE (low_bound) != INTEGER_CST
5367           || !up_bound
5368           || TREE_CODE (up_bound) != INTEGER_CST
5369           || !el_sz
5370           || TREE_CODE (el_sz) != INTEGER_CST)
5371         return;
5372
5373       idx = mem_ref_offset (t);
5374       idx = double_int_sdiv (idx, tree_to_double_int (el_sz), TRUNC_DIV_EXPR);
5375       if (double_int_scmp (idx, double_int_zero) < 0)
5376         {
5377           warning_at (location, OPT_Warray_bounds,
5378                       "array subscript is below array bounds");
5379           TREE_NO_WARNING (t) = 1;
5380         }
5381       else if (double_int_scmp (idx,
5382                                 double_int_add
5383                                   (double_int_add
5384                                     (tree_to_double_int (up_bound),
5385                                      double_int_neg
5386                                        (tree_to_double_int (low_bound))),
5387                                     double_int_one)) > 0)
5388         {
5389           warning_at (location, OPT_Warray_bounds,
5390                       "array subscript is above array bounds");
5391           TREE_NO_WARNING (t) = 1;
5392         }
5393     }
5394 }
5395
5396 /* walk_tree() callback that checks if *TP is
5397    an ARRAY_REF inside an ADDR_EXPR (in which an array
5398    subscript one outside the valid range is allowed). Call
5399    check_array_ref for each ARRAY_REF found. The location is
5400    passed in DATA.  */
5401
5402 static tree
5403 check_array_bounds (tree *tp, int *walk_subtree, void *data)
5404 {
5405   tree t = *tp;
5406   struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
5407   location_t location;
5408
5409   if (EXPR_HAS_LOCATION (t))
5410     location = EXPR_LOCATION (t);
5411   else
5412     {
5413       location_t *locp = (location_t *) wi->info;
5414       location = *locp;
5415     }
5416
5417   *walk_subtree = TRUE;
5418
5419   if (TREE_CODE (t) == ARRAY_REF)
5420     check_array_ref (location, t, false /*ignore_off_by_one*/);
5421
5422   if (TREE_CODE (t) == MEM_REF
5423       || (TREE_CODE (t) == RETURN_EXPR && TREE_OPERAND (t, 0)))
5424     search_for_addr_array (TREE_OPERAND (t, 0), location);
5425
5426   if (TREE_CODE (t) == ADDR_EXPR)
5427     *walk_subtree = FALSE;
5428
5429   return NULL_TREE;
5430 }
5431
5432 /* Walk over all statements of all reachable BBs and call check_array_bounds
5433    on them.  */
5434
5435 static void
5436 check_all_array_refs (void)
5437 {
5438   basic_block bb;
5439   gimple_stmt_iterator si;
5440
5441   FOR_EACH_BB (bb)
5442     {
5443       edge_iterator ei;
5444       edge e;
5445       bool executable = false;
5446
5447       /* Skip blocks that were found to be unreachable.  */
5448       FOR_EACH_EDGE (e, ei, bb->preds)
5449         executable |= !!(e->flags & EDGE_EXECUTABLE);
5450       if (!executable)
5451         continue;
5452
5453       for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
5454         {
5455           gimple stmt = gsi_stmt (si);
5456           struct walk_stmt_info wi;
5457           if (!gimple_has_location (stmt))
5458             continue;
5459
5460           if (is_gimple_call (stmt))
5461             {
5462               size_t i;
5463               size_t n = gimple_call_num_args (stmt);
5464               for (i = 0; i < n; i++)
5465                 {
5466                   tree arg = gimple_call_arg (stmt, i);
5467                   search_for_addr_array (arg, gimple_location (stmt));
5468                 }
5469             }
5470           else
5471             {
5472               memset (&wi, 0, sizeof (wi));
5473               wi.info = CONST_CAST (void *, (const void *)
5474                                     gimple_location_ptr (stmt));
5475
5476               walk_gimple_op (gsi_stmt (si),
5477                               check_array_bounds,
5478                               &wi);
5479             }
5480         }
5481     }
5482 }
5483
5484 /* Convert range assertion expressions into the implied copies and
5485    copy propagate away the copies.  Doing the trivial copy propagation
5486    here avoids the need to run the full copy propagation pass after
5487    VRP.
5488
5489    FIXME, this will eventually lead to copy propagation removing the
5490    names that had useful range information attached to them.  For
5491    instance, if we had the assertion N_i = ASSERT_EXPR <N_j, N_j > 3>,
5492    then N_i will have the range [3, +INF].
5493
5494    However, by converting the assertion into the implied copy
5495    operation N_i = N_j, we will then copy-propagate N_j into the uses
5496    of N_i and lose the range information.  We may want to hold on to
5497    ASSERT_EXPRs a little while longer as the ranges could be used in
5498    things like jump threading.
5499
5500    The problem with keeping ASSERT_EXPRs around is that passes after
5501    VRP need to handle them appropriately.
5502
5503    Another approach would be to make the range information a first
5504    class property of the SSA_NAME so that it can be queried from
5505    any pass.  This is made somewhat more complex by the need for
5506    multiple ranges to be associated with one SSA_NAME.  */
5507
5508 static void
5509 remove_range_assertions (void)
5510 {
5511   basic_block bb;
5512   gimple_stmt_iterator si;
5513
5514   /* Note that the BSI iterator bump happens at the bottom of the
5515      loop and no bump is necessary if we're removing the statement
5516      referenced by the current BSI.  */
5517   FOR_EACH_BB (bb)
5518     for (si = gsi_start_bb (bb); !gsi_end_p (si);)
5519       {
5520         gimple stmt = gsi_stmt (si);
5521         gimple use_stmt;
5522
5523         if (is_gimple_assign (stmt)
5524             && gimple_assign_rhs_code (stmt) == ASSERT_EXPR)
5525           {
5526             tree rhs = gimple_assign_rhs1 (stmt);
5527             tree var;
5528             tree cond = fold (ASSERT_EXPR_COND (rhs));
5529             use_operand_p use_p;
5530             imm_use_iterator iter;
5531
5532             gcc_assert (cond != boolean_false_node);
5533
5534             /* Propagate the RHS into every use of the LHS.  */
5535             var = ASSERT_EXPR_VAR (rhs);
5536             FOR_EACH_IMM_USE_STMT (use_stmt, iter,
5537                                    gimple_assign_lhs (stmt))
5538               FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
5539                 {
5540                   SET_USE (use_p, var);
5541                   gcc_assert (TREE_CODE (var) == SSA_NAME);
5542                 }
5543
5544             /* And finally, remove the copy, it is not needed.  */
5545             gsi_remove (&si, true);
5546             release_defs (stmt);
5547           }
5548         else
5549           gsi_next (&si);
5550       }
5551 }
5552
5553
5554 /* Return true if STMT is interesting for VRP.  */
5555
5556 static bool
5557 stmt_interesting_for_vrp (gimple stmt)
5558 {
5559   if (gimple_code (stmt) == GIMPLE_PHI
5560       && is_gimple_reg (gimple_phi_result (stmt))
5561       && (INTEGRAL_TYPE_P (TREE_TYPE (gimple_phi_result (stmt)))
5562           || POINTER_TYPE_P (TREE_TYPE (gimple_phi_result (stmt)))))
5563     return true;
5564   else if (is_gimple_assign (stmt) || is_gimple_call (stmt))
5565     {
5566       tree lhs = gimple_get_lhs (stmt);
5567
5568       /* In general, assignments with virtual operands are not useful
5569          for deriving ranges, with the obvious exception of calls to
5570          builtin functions.  */
5571       if (lhs && TREE_CODE (lhs) == SSA_NAME
5572           && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
5573               || POINTER_TYPE_P (TREE_TYPE (lhs)))
5574           && ((is_gimple_call (stmt)
5575                && gimple_call_fndecl (stmt) != NULL_TREE
5576                && DECL_IS_BUILTIN (gimple_call_fndecl (stmt)))
5577               || !gimple_vuse (stmt)))
5578         return true;
5579     }
5580   else if (gimple_code (stmt) == GIMPLE_COND
5581            || gimple_code (stmt) == GIMPLE_SWITCH)
5582     return true;
5583
5584   return false;
5585 }
5586
5587
5588 /* Initialize local data structures for VRP.  */
5589
5590 static void
5591 vrp_initialize (void)
5592 {
5593   basic_block bb;
5594
5595   vr_value = XCNEWVEC (value_range_t *, num_ssa_names);
5596   vr_phi_edge_counts = XCNEWVEC (int, num_ssa_names);
5597
5598   FOR_EACH_BB (bb)
5599     {
5600       gimple_stmt_iterator si;
5601
5602       for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
5603         {
5604           gimple phi = gsi_stmt (si);
5605           if (!stmt_interesting_for_vrp (phi))
5606             {
5607               tree lhs = PHI_RESULT (phi);
5608               set_value_range_to_varying (get_value_range (lhs));
5609               prop_set_simulate_again (phi, false);
5610             }
5611           else
5612             prop_set_simulate_again (phi, true);
5613         }
5614
5615       for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
5616         {
5617           gimple stmt = gsi_stmt (si);
5618
5619           /* If the statement is a control insn, then we do not
5620              want to avoid simulating the statement once.  Failure
5621              to do so means that those edges will never get added.  */
5622           if (stmt_ends_bb_p (stmt))
5623             prop_set_simulate_again (stmt, true);
5624           else if (!stmt_interesting_for_vrp (stmt))
5625             {
5626               ssa_op_iter i;
5627               tree def;
5628               FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
5629                 set_value_range_to_varying (get_value_range (def));
5630               prop_set_simulate_again (stmt, false);
5631             }
5632           else
5633             prop_set_simulate_again (stmt, true);
5634         }
5635     }
5636 }
5637
5638 /* Return the singleton value-range for NAME or NAME.  */
5639
5640 static inline tree
5641 vrp_valueize (tree name)
5642 {
5643   if (TREE_CODE (name) == SSA_NAME)
5644     {
5645       value_range_t *vr = get_value_range (name);
5646       if (vr->type == VR_RANGE
5647           && (vr->min == vr->max
5648               || operand_equal_p (vr->min, vr->max, 0)))
5649         return vr->min;
5650     }
5651   return name;
5652 }
5653
5654 /* Visit assignment STMT.  If it produces an interesting range, record
5655    the SSA name in *OUTPUT_P.  */
5656
5657 static enum ssa_prop_result
5658 vrp_visit_assignment_or_call (gimple stmt, tree *output_p)
5659 {
5660   tree def, lhs;
5661   ssa_op_iter iter;
5662   enum gimple_code code = gimple_code (stmt);
5663   lhs = gimple_get_lhs (stmt);
5664
5665   /* We only keep track of ranges in integral and pointer types.  */
5666   if (TREE_CODE (lhs) == SSA_NAME
5667       && ((INTEGRAL_TYPE_P (TREE_TYPE (lhs))
5668            /* It is valid to have NULL MIN/MAX values on a type.  See
5669               build_range_type.  */
5670            && TYPE_MIN_VALUE (TREE_TYPE (lhs))
5671            && TYPE_MAX_VALUE (TREE_TYPE (lhs)))
5672           || POINTER_TYPE_P (TREE_TYPE (lhs))))
5673     {
5674       value_range_t new_vr = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
5675
5676       /* Try folding the statement to a constant first.  */
5677       tree tem = gimple_fold_stmt_to_constant (stmt, vrp_valueize);
5678       if (tem && !is_overflow_infinity (tem))
5679         set_value_range (&new_vr, VR_RANGE, tem, tem, NULL);
5680       /* Then dispatch to value-range extracting functions.  */
5681       else if (code == GIMPLE_CALL)
5682         extract_range_basic (&new_vr, stmt);
5683       else
5684         extract_range_from_assignment (&new_vr, stmt);
5685
5686       if (update_value_range (lhs, &new_vr))
5687         {
5688           *output_p = lhs;
5689
5690           if (dump_file && (dump_flags & TDF_DETAILS))
5691             {
5692               fprintf (dump_file, "Found new range for ");
5693               print_generic_expr (dump_file, lhs, 0);
5694               fprintf (dump_file, ": ");
5695               dump_value_range (dump_file, &new_vr);
5696               fprintf (dump_file, "\n\n");
5697             }
5698
5699           if (new_vr.type == VR_VARYING)
5700             return SSA_PROP_VARYING;
5701
5702           return SSA_PROP_INTERESTING;
5703         }
5704
5705       return SSA_PROP_NOT_INTERESTING;
5706     }
5707
5708   /* Every other statement produces no useful ranges.  */
5709   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
5710     set_value_range_to_varying (get_value_range (def));
5711
5712   return SSA_PROP_VARYING;
5713 }
5714
5715 /* Helper that gets the value range of the SSA_NAME with version I
5716    or a symbolic range containing the SSA_NAME only if the value range
5717    is varying or undefined.  */
5718
5719 static inline value_range_t
5720 get_vr_for_comparison (int i)
5721 {
5722   value_range_t vr = *(vr_value[i]);
5723
5724   /* If name N_i does not have a valid range, use N_i as its own
5725      range.  This allows us to compare against names that may
5726      have N_i in their ranges.  */
5727   if (vr.type == VR_VARYING || vr.type == VR_UNDEFINED)
5728     {
5729       vr.type = VR_RANGE;
5730       vr.min = ssa_name (i);
5731       vr.max = ssa_name (i);
5732     }
5733
5734   return vr;
5735 }
5736
5737 /* Compare all the value ranges for names equivalent to VAR with VAL
5738    using comparison code COMP.  Return the same value returned by
5739    compare_range_with_value, including the setting of
5740    *STRICT_OVERFLOW_P.  */
5741
5742 static tree
5743 compare_name_with_value (enum tree_code comp, tree var, tree val,
5744                          bool *strict_overflow_p)
5745 {
5746   bitmap_iterator bi;
5747   unsigned i;
5748   bitmap e;
5749   tree retval, t;
5750   int used_strict_overflow;
5751   bool sop;
5752   value_range_t equiv_vr;
5753
5754   /* Get the set of equivalences for VAR.  */
5755   e = get_value_range (var)->equiv;
5756
5757   /* Start at -1.  Set it to 0 if we do a comparison without relying
5758      on overflow, or 1 if all comparisons rely on overflow.  */
5759   used_strict_overflow = -1;
5760
5761   /* Compare vars' value range with val.  */
5762   equiv_vr = get_vr_for_comparison (SSA_NAME_VERSION (var));
5763   sop = false;
5764   retval = compare_range_with_value (comp, &equiv_vr, val, &sop);
5765   if (retval)
5766     used_strict_overflow = sop ? 1 : 0;
5767
5768   /* If the equiv set is empty we have done all work we need to do.  */
5769   if (e == NULL)
5770     {
5771       if (retval
5772           && used_strict_overflow > 0)
5773         *strict_overflow_p = true;
5774       return retval;
5775     }
5776
5777   EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
5778     {
5779       equiv_vr = get_vr_for_comparison (i);
5780       sop = false;
5781       t = compare_range_with_value (comp, &equiv_vr, val, &sop);
5782       if (t)
5783         {
5784           /* If we get different answers from different members
5785              of the equivalence set this check must be in a dead
5786              code region.  Folding it to a trap representation
5787              would be correct here.  For now just return don't-know.  */
5788           if (retval != NULL
5789               && t != retval)
5790             {
5791               retval = NULL_TREE;
5792               break;
5793             }
5794           retval = t;
5795
5796           if (!sop)
5797             used_strict_overflow = 0;
5798           else if (used_strict_overflow < 0)
5799             used_strict_overflow = 1;
5800         }
5801     }
5802
5803   if (retval
5804       && used_strict_overflow > 0)
5805     *strict_overflow_p = true;
5806
5807   return retval;
5808 }
5809
5810
5811 /* Given a comparison code COMP and names N1 and N2, compare all the
5812    ranges equivalent to N1 against all the ranges equivalent to N2
5813    to determine the value of N1 COMP N2.  Return the same value
5814    returned by compare_ranges.  Set *STRICT_OVERFLOW_P to indicate
5815    whether we relied on an overflow infinity in the comparison.  */
5816
5817
5818 static tree
5819 compare_names (enum tree_code comp, tree n1, tree n2,
5820                bool *strict_overflow_p)
5821 {
5822   tree t, retval;
5823   bitmap e1, e2;
5824   bitmap_iterator bi1, bi2;
5825   unsigned i1, i2;
5826   int used_strict_overflow;
5827   static bitmap_obstack *s_obstack = NULL;
5828   static bitmap s_e1 = NULL, s_e2 = NULL;
5829
5830   /* Compare the ranges of every name equivalent to N1 against the
5831      ranges of every name equivalent to N2.  */
5832   e1 = get_value_range (n1)->equiv;
5833   e2 = get_value_range (n2)->equiv;
5834
5835   /* Use the fake bitmaps if e1 or e2 are not available.  */
5836   if (s_obstack == NULL)
5837     {
5838       s_obstack = XNEW (bitmap_obstack);
5839       bitmap_obstack_initialize (s_obstack);
5840       s_e1 = BITMAP_ALLOC (s_obstack);
5841       s_e2 = BITMAP_ALLOC (s_obstack);
5842     }
5843   if (e1 == NULL)
5844     e1 = s_e1;
5845   if (e2 == NULL)
5846     e2 = s_e2;
5847
5848   /* Add N1 and N2 to their own set of equivalences to avoid
5849      duplicating the body of the loop just to check N1 and N2
5850      ranges.  */
5851   bitmap_set_bit (e1, SSA_NAME_VERSION (n1));
5852   bitmap_set_bit (e2, SSA_NAME_VERSION (n2));
5853
5854   /* If the equivalence sets have a common intersection, then the two
5855      names can be compared without checking their ranges.  */
5856   if (bitmap_intersect_p (e1, e2))
5857     {
5858       bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
5859       bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
5860
5861       return (comp == EQ_EXPR || comp == GE_EXPR || comp == LE_EXPR)
5862              ? boolean_true_node
5863              : boolean_false_node;
5864     }
5865
5866   /* Start at -1.  Set it to 0 if we do a comparison without relying
5867      on overflow, or 1 if all comparisons rely on overflow.  */
5868   used_strict_overflow = -1;
5869
5870   /* Otherwise, compare all the equivalent ranges.  First, add N1 and
5871      N2 to their own set of equivalences to avoid duplicating the body
5872      of the loop just to check N1 and N2 ranges.  */
5873   EXECUTE_IF_SET_IN_BITMAP (e1, 0, i1, bi1)
5874     {
5875       value_range_t vr1 = get_vr_for_comparison (i1);
5876
5877       t = retval = NULL_TREE;
5878       EXECUTE_IF_SET_IN_BITMAP (e2, 0, i2, bi2)
5879         {
5880           bool sop = false;
5881
5882           value_range_t vr2 = get_vr_for_comparison (i2);
5883
5884           t = compare_ranges (comp, &vr1, &vr2, &sop);
5885           if (t)
5886             {
5887               /* If we get different answers from different members
5888                  of the equivalence set this check must be in a dead
5889                  code region.  Folding it to a trap representation
5890                  would be correct here.  For now just return don't-know.  */
5891               if (retval != NULL
5892                   && t != retval)
5893                 {
5894                   bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
5895                   bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
5896                   return NULL_TREE;
5897                 }
5898               retval = t;
5899
5900               if (!sop)
5901                 used_strict_overflow = 0;
5902               else if (used_strict_overflow < 0)
5903                 used_strict_overflow = 1;
5904             }
5905         }
5906
5907       if (retval)
5908         {
5909           bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
5910           bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
5911           if (used_strict_overflow > 0)
5912             *strict_overflow_p = true;
5913           return retval;
5914         }
5915     }
5916
5917   /* None of the equivalent ranges are useful in computing this
5918      comparison.  */
5919   bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
5920   bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
5921   return NULL_TREE;
5922 }
5923
5924 /* Helper function for vrp_evaluate_conditional_warnv.  */
5925
5926 static tree
5927 vrp_evaluate_conditional_warnv_with_ops_using_ranges (enum tree_code code,
5928                                                       tree op0, tree op1,
5929                                                       bool * strict_overflow_p)
5930 {
5931   value_range_t *vr0, *vr1;
5932
5933   vr0 = (TREE_CODE (op0) == SSA_NAME) ? get_value_range (op0) : NULL;
5934   vr1 = (TREE_CODE (op1) == SSA_NAME) ? get_value_range (op1) : NULL;
5935
5936   if (vr0 && vr1)
5937     return compare_ranges (code, vr0, vr1, strict_overflow_p);
5938   else if (vr0 && vr1 == NULL)
5939     return compare_range_with_value (code, vr0, op1, strict_overflow_p);
5940   else if (vr0 == NULL && vr1)
5941     return (compare_range_with_value
5942             (swap_tree_comparison (code), vr1, op0, strict_overflow_p));
5943   return NULL;
5944 }
5945
5946 /* Helper function for vrp_evaluate_conditional_warnv. */
5947
5948 static tree
5949 vrp_evaluate_conditional_warnv_with_ops (enum tree_code code, tree op0,
5950                                          tree op1, bool use_equiv_p,
5951                                          bool *strict_overflow_p, bool *only_ranges)
5952 {
5953   tree ret;
5954   if (only_ranges)
5955     *only_ranges = true;
5956
5957   /* We only deal with integral and pointer types.  */
5958   if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
5959       && !POINTER_TYPE_P (TREE_TYPE (op0)))
5960     return NULL_TREE;
5961
5962   if (use_equiv_p)
5963     {
5964       if (only_ranges
5965           && (ret = vrp_evaluate_conditional_warnv_with_ops_using_ranges
5966                       (code, op0, op1, strict_overflow_p)))
5967         return ret;
5968       *only_ranges = false;
5969       if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME)
5970         return compare_names (code, op0, op1, strict_overflow_p);
5971       else if (TREE_CODE (op0) == SSA_NAME)
5972         return compare_name_with_value (code, op0, op1, strict_overflow_p);
5973       else if (TREE_CODE (op1) == SSA_NAME)
5974         return (compare_name_with_value
5975                 (swap_tree_comparison (code), op1, op0, strict_overflow_p));
5976     }
5977   else
5978     return vrp_evaluate_conditional_warnv_with_ops_using_ranges (code, op0, op1,
5979                                                                  strict_overflow_p);
5980   return NULL_TREE;
5981 }
5982
5983 /* Given (CODE OP0 OP1) within STMT, try to simplify it based on value range
5984    information.  Return NULL if the conditional can not be evaluated.
5985    The ranges of all the names equivalent with the operands in COND
5986    will be used when trying to compute the value.  If the result is
5987    based on undefined signed overflow, issue a warning if
5988    appropriate.  */
5989
5990 static tree
5991 vrp_evaluate_conditional (enum tree_code code, tree op0, tree op1, gimple stmt)
5992 {
5993   bool sop;
5994   tree ret;
5995   bool only_ranges;
5996
5997   /* Some passes and foldings leak constants with overflow flag set
5998      into the IL.  Avoid doing wrong things with these and bail out.  */
5999   if ((TREE_CODE (op0) == INTEGER_CST
6000        && TREE_OVERFLOW (op0))
6001       || (TREE_CODE (op1) == INTEGER_CST
6002           && TREE_OVERFLOW (op1)))
6003     return NULL_TREE;
6004
6005   sop = false;
6006   ret = vrp_evaluate_conditional_warnv_with_ops (code, op0, op1, true, &sop,
6007                                                  &only_ranges);
6008
6009   if (ret && sop)
6010     {
6011       enum warn_strict_overflow_code wc;
6012       const char* warnmsg;
6013
6014       if (is_gimple_min_invariant (ret))
6015         {
6016           wc = WARN_STRICT_OVERFLOW_CONDITIONAL;
6017           warnmsg = G_("assuming signed overflow does not occur when "
6018                        "simplifying conditional to constant");
6019         }
6020       else
6021         {
6022           wc = WARN_STRICT_OVERFLOW_COMPARISON;
6023           warnmsg = G_("assuming signed overflow does not occur when "
6024                        "simplifying conditional");
6025         }
6026
6027       if (issue_strict_overflow_warning (wc))
6028         {
6029           location_t location;
6030
6031           if (!gimple_has_location (stmt))
6032             location = input_location;
6033           else
6034             location = gimple_location (stmt);
6035           warning_at (location, OPT_Wstrict_overflow, "%s", warnmsg);
6036         }
6037     }
6038
6039   if (warn_type_limits
6040       && ret && only_ranges
6041       && TREE_CODE_CLASS (code) == tcc_comparison
6042       && TREE_CODE (op0) == SSA_NAME)
6043     {
6044       /* If the comparison is being folded and the operand on the LHS
6045          is being compared against a constant value that is outside of
6046          the natural range of OP0's type, then the predicate will
6047          always fold regardless of the value of OP0.  If -Wtype-limits
6048          was specified, emit a warning.  */
6049       tree type = TREE_TYPE (op0);
6050       value_range_t *vr0 = get_value_range (op0);
6051
6052       if (vr0->type != VR_VARYING
6053           && INTEGRAL_TYPE_P (type)
6054           && vrp_val_is_min (vr0->min)
6055           && vrp_val_is_max (vr0->max)
6056           && is_gimple_min_invariant (op1))
6057         {
6058           location_t location;
6059
6060           if (!gimple_has_location (stmt))
6061             location = input_location;
6062           else
6063             location = gimple_location (stmt);
6064
6065           warning_at (location, OPT_Wtype_limits,
6066                       integer_zerop (ret)
6067                       ? G_("comparison always false "
6068                            "due to limited range of data type")
6069                       : G_("comparison always true "
6070                            "due to limited range of data type"));
6071         }
6072     }
6073
6074   return ret;
6075 }
6076
6077
6078 /* Visit conditional statement STMT.  If we can determine which edge
6079    will be taken out of STMT's basic block, record it in
6080    *TAKEN_EDGE_P and return SSA_PROP_INTERESTING.  Otherwise, return
6081    SSA_PROP_VARYING.  */
6082
6083 static enum ssa_prop_result
6084 vrp_visit_cond_stmt (gimple stmt, edge *taken_edge_p)
6085 {
6086   tree val;
6087   bool sop;
6088
6089   *taken_edge_p = NULL;
6090
6091   if (dump_file && (dump_flags & TDF_DETAILS))
6092     {
6093       tree use;
6094       ssa_op_iter i;
6095
6096       fprintf (dump_file, "\nVisiting conditional with predicate: ");
6097       print_gimple_stmt (dump_file, stmt, 0, 0);
6098       fprintf (dump_file, "\nWith known ranges\n");
6099
6100       FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
6101         {
6102           fprintf (dump_file, "\t");
6103           print_generic_expr (dump_file, use, 0);
6104           fprintf (dump_file, ": ");
6105           dump_value_range (dump_file, vr_value[SSA_NAME_VERSION (use)]);
6106         }
6107
6108       fprintf (dump_file, "\n");
6109     }
6110
6111   /* Compute the value of the predicate COND by checking the known
6112      ranges of each of its operands.
6113
6114      Note that we cannot evaluate all the equivalent ranges here
6115      because those ranges may not yet be final and with the current
6116      propagation strategy, we cannot determine when the value ranges
6117      of the names in the equivalence set have changed.
6118
6119      For instance, given the following code fragment
6120
6121         i_5 = PHI <8, i_13>
6122         ...
6123         i_14 = ASSERT_EXPR <i_5, i_5 != 0>
6124         if (i_14 == 1)
6125           ...
6126
6127      Assume that on the first visit to i_14, i_5 has the temporary
6128      range [8, 8] because the second argument to the PHI function is
6129      not yet executable.  We derive the range ~[0, 0] for i_14 and the
6130      equivalence set { i_5 }.  So, when we visit 'if (i_14 == 1)' for
6131      the first time, since i_14 is equivalent to the range [8, 8], we
6132      determine that the predicate is always false.
6133
6134      On the next round of propagation, i_13 is determined to be
6135      VARYING, which causes i_5 to drop down to VARYING.  So, another
6136      visit to i_14 is scheduled.  In this second visit, we compute the
6137      exact same range and equivalence set for i_14, namely ~[0, 0] and
6138      { i_5 }.  But we did not have the previous range for i_5
6139      registered, so vrp_visit_assignment thinks that the range for
6140      i_14 has not changed.  Therefore, the predicate 'if (i_14 == 1)'
6141      is not visited again, which stops propagation from visiting
6142      statements in the THEN clause of that if().
6143
6144      To properly fix this we would need to keep the previous range
6145      value for the names in the equivalence set.  This way we would've
6146      discovered that from one visit to the other i_5 changed from
6147      range [8, 8] to VR_VARYING.
6148
6149      However, fixing this apparent limitation may not be worth the
6150      additional checking.  Testing on several code bases (GCC, DLV,
6151      MICO, TRAMP3D and SPEC2000) showed that doing this results in
6152      4 more predicates folded in SPEC.  */
6153   sop = false;
6154
6155   val = vrp_evaluate_conditional_warnv_with_ops (gimple_cond_code (stmt),
6156                                                  gimple_cond_lhs (stmt),
6157                                                  gimple_cond_rhs (stmt),
6158                                                  false, &sop, NULL);
6159   if (val)
6160     {
6161       if (!sop)
6162         *taken_edge_p = find_taken_edge (gimple_bb (stmt), val);
6163       else
6164         {
6165           if (dump_file && (dump_flags & TDF_DETAILS))
6166             fprintf (dump_file,
6167                      "\nIgnoring predicate evaluation because "
6168                      "it assumes that signed overflow is undefined");
6169           val = NULL_TREE;
6170         }
6171     }
6172
6173   if (dump_file && (dump_flags & TDF_DETAILS))
6174     {
6175       fprintf (dump_file, "\nPredicate evaluates to: ");
6176       if (val == NULL_TREE)
6177         fprintf (dump_file, "DON'T KNOW\n");
6178       else
6179         print_generic_stmt (dump_file, val, 0);
6180     }
6181
6182   return (*taken_edge_p) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
6183 }
6184
6185 /* Searches the case label vector VEC for the index *IDX of the CASE_LABEL
6186    that includes the value VAL.  The search is restricted to the range
6187    [START_IDX, n - 1] where n is the size of VEC.
6188
6189    If there is a CASE_LABEL for VAL, its index is placed in IDX and true is
6190    returned.
6191
6192    If there is no CASE_LABEL for VAL and there is one that is larger than VAL,
6193    it is placed in IDX and false is returned.
6194
6195    If VAL is larger than any CASE_LABEL, n is placed on IDX and false is
6196    returned. */
6197
6198 static bool
6199 find_case_label_index (gimple stmt, size_t start_idx, tree val, size_t *idx)
6200 {
6201   size_t n = gimple_switch_num_labels (stmt);
6202   size_t low, high;
6203
6204   /* Find case label for minimum of the value range or the next one.
6205      At each iteration we are searching in [low, high - 1]. */
6206
6207   for (low = start_idx, high = n; high != low; )
6208     {
6209       tree t;
6210       int cmp;
6211       /* Note that i != high, so we never ask for n. */
6212       size_t i = (high + low) / 2;
6213       t = gimple_switch_label (stmt, i);
6214
6215       /* Cache the result of comparing CASE_LOW and val.  */
6216       cmp = tree_int_cst_compare (CASE_LOW (t), val);
6217
6218       if (cmp == 0)
6219         {
6220           /* Ranges cannot be empty. */
6221           *idx = i;
6222           return true;
6223         }
6224       else if (cmp > 0)
6225         high = i;
6226       else
6227         {
6228           low = i + 1;
6229           if (CASE_HIGH (t) != NULL
6230               && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
6231             {
6232               *idx = i;
6233               return true;
6234             }
6235         }
6236     }
6237
6238   *idx = high;
6239   return false;
6240 }
6241
6242 /* Searches the case label vector VEC for the range of CASE_LABELs that is used
6243    for values between MIN and MAX. The first index is placed in MIN_IDX. The
6244    last index is placed in MAX_IDX. If the range of CASE_LABELs is empty
6245    then MAX_IDX < MIN_IDX.
6246    Returns true if the default label is not needed. */
6247
6248 static bool
6249 find_case_label_range (gimple stmt, tree min, tree max, size_t *min_idx,
6250                        size_t *max_idx)
6251 {
6252   size_t i, j;
6253   bool min_take_default = !find_case_label_index (stmt, 1, min, &i);
6254   bool max_take_default = !find_case_label_index (stmt, i, max, &j);
6255
6256   if (i == j
6257       && min_take_default
6258       && max_take_default)
6259     {
6260       /* Only the default case label reached.
6261          Return an empty range. */
6262       *min_idx = 1;
6263       *max_idx = 0;
6264       return false;
6265     }
6266   else
6267     {
6268       bool take_default = min_take_default || max_take_default;
6269       tree low, high;
6270       size_t k;
6271
6272       if (max_take_default)
6273         j--;
6274
6275       /* If the case label range is continuous, we do not need
6276          the default case label.  Verify that.  */
6277       high = CASE_LOW (gimple_switch_label (stmt, i));
6278       if (CASE_HIGH (gimple_switch_label (stmt, i)))
6279         high = CASE_HIGH (gimple_switch_label (stmt, i));
6280       for (k = i + 1; k <= j; ++k)
6281         {
6282           low = CASE_LOW (gimple_switch_label (stmt, k));
6283           if (!integer_onep (int_const_binop (MINUS_EXPR, low, high)))
6284             {
6285               take_default = true;
6286               break;
6287             }
6288           high = low;
6289           if (CASE_HIGH (gimple_switch_label (stmt, k)))
6290             high = CASE_HIGH (gimple_switch_label (stmt, k));
6291         }
6292
6293       *min_idx = i;
6294       *max_idx = j;
6295       return !take_default;
6296     }
6297 }
6298
6299 /* Visit switch statement STMT.  If we can determine which edge
6300    will be taken out of STMT's basic block, record it in
6301    *TAKEN_EDGE_P and return SSA_PROP_INTERESTING.  Otherwise, return
6302    SSA_PROP_VARYING.  */
6303
6304 static enum ssa_prop_result
6305 vrp_visit_switch_stmt (gimple stmt, edge *taken_edge_p)
6306 {
6307   tree op, val;
6308   value_range_t *vr;
6309   size_t i = 0, j = 0;
6310   bool take_default;
6311
6312   *taken_edge_p = NULL;
6313   op = gimple_switch_index (stmt);
6314   if (TREE_CODE (op) != SSA_NAME)
6315     return SSA_PROP_VARYING;
6316
6317   vr = get_value_range (op);
6318   if (dump_file && (dump_flags & TDF_DETAILS))
6319     {
6320       fprintf (dump_file, "\nVisiting switch expression with operand ");
6321       print_generic_expr (dump_file, op, 0);
6322       fprintf (dump_file, " with known range ");
6323       dump_value_range (dump_file, vr);
6324       fprintf (dump_file, "\n");
6325     }
6326
6327   if (vr->type != VR_RANGE
6328       || symbolic_range_p (vr))
6329     return SSA_PROP_VARYING;
6330
6331   /* Find the single edge that is taken from the switch expression.  */
6332   take_default = !find_case_label_range (stmt, vr->min, vr->max, &i, &j);
6333
6334   /* Check if the range spans no CASE_LABEL. If so, we only reach the default
6335      label */
6336   if (j < i)
6337     {
6338       gcc_assert (take_default);
6339       val = gimple_switch_default_label (stmt);
6340     }
6341   else
6342     {
6343       /* Check if labels with index i to j and maybe the default label
6344          are all reaching the same label.  */
6345
6346       val = gimple_switch_label (stmt, i);
6347       if (take_default
6348           && CASE_LABEL (gimple_switch_default_label (stmt))
6349           != CASE_LABEL (val))
6350         {
6351           if (dump_file && (dump_flags & TDF_DETAILS))
6352             fprintf (dump_file, "  not a single destination for this "
6353                      "range\n");
6354           return SSA_PROP_VARYING;
6355         }
6356       for (++i; i <= j; ++i)
6357         {
6358           if (CASE_LABEL (gimple_switch_label (stmt, i)) != CASE_LABEL (val))
6359             {
6360               if (dump_file && (dump_flags & TDF_DETAILS))
6361                 fprintf (dump_file, "  not a single destination for this "
6362                          "range\n");
6363               return SSA_PROP_VARYING;
6364             }
6365         }
6366     }
6367
6368   *taken_edge_p = find_edge (gimple_bb (stmt),
6369                              label_to_block (CASE_LABEL (val)));
6370
6371   if (dump_file && (dump_flags & TDF_DETAILS))
6372     {
6373       fprintf (dump_file, "  will take edge to ");
6374       print_generic_stmt (dump_file, CASE_LABEL (val), 0);
6375     }
6376
6377   return SSA_PROP_INTERESTING;
6378 }
6379
6380
6381 /* Evaluate statement STMT.  If the statement produces a useful range,
6382    return SSA_PROP_INTERESTING and record the SSA name with the
6383    interesting range into *OUTPUT_P.
6384
6385    If STMT is a conditional branch and we can determine its truth
6386    value, the taken edge is recorded in *TAKEN_EDGE_P.
6387
6388    If STMT produces a varying value, return SSA_PROP_VARYING.  */
6389
6390 static enum ssa_prop_result
6391 vrp_visit_stmt (gimple stmt, edge *taken_edge_p, tree *output_p)
6392 {
6393   tree def;
6394   ssa_op_iter iter;
6395
6396   if (dump_file && (dump_flags & TDF_DETAILS))
6397     {
6398       fprintf (dump_file, "\nVisiting statement:\n");
6399       print_gimple_stmt (dump_file, stmt, 0, dump_flags);
6400       fprintf (dump_file, "\n");
6401     }
6402
6403   if (!stmt_interesting_for_vrp (stmt))
6404     gcc_assert (stmt_ends_bb_p (stmt));
6405   else if (is_gimple_assign (stmt) || is_gimple_call (stmt))
6406     {
6407       /* In general, assignments with virtual operands are not useful
6408          for deriving ranges, with the obvious exception of calls to
6409          builtin functions.  */
6410       if ((is_gimple_call (stmt)
6411            && gimple_call_fndecl (stmt) != NULL_TREE
6412            && DECL_IS_BUILTIN (gimple_call_fndecl (stmt)))
6413           || !gimple_vuse (stmt))
6414         return vrp_visit_assignment_or_call (stmt, output_p);
6415     }
6416   else if (gimple_code (stmt) == GIMPLE_COND)
6417     return vrp_visit_cond_stmt (stmt, taken_edge_p);
6418   else if (gimple_code (stmt) == GIMPLE_SWITCH)
6419     return vrp_visit_switch_stmt (stmt, taken_edge_p);
6420
6421   /* All other statements produce nothing of interest for VRP, so mark
6422      their outputs varying and prevent further simulation.  */
6423   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
6424     set_value_range_to_varying (get_value_range (def));
6425
6426   return SSA_PROP_VARYING;
6427 }
6428
6429
6430 /* Meet operation for value ranges.  Given two value ranges VR0 and
6431    VR1, store in VR0 a range that contains both VR0 and VR1.  This
6432    may not be the smallest possible such range.  */
6433
6434 static void
6435 vrp_meet (value_range_t *vr0, value_range_t *vr1)
6436 {
6437   if (vr0->type == VR_UNDEFINED)
6438     {
6439       copy_value_range (vr0, vr1);
6440       return;
6441     }
6442
6443   if (vr1->type == VR_UNDEFINED)
6444     {
6445       /* Nothing to do.  VR0 already has the resulting range.  */
6446       return;
6447     }
6448
6449   if (vr0->type == VR_VARYING)
6450     {
6451       /* Nothing to do.  VR0 already has the resulting range.  */
6452       return;
6453     }
6454
6455   if (vr1->type == VR_VARYING)
6456     {
6457       set_value_range_to_varying (vr0);
6458       return;
6459     }
6460
6461   if (vr0->type == VR_RANGE && vr1->type == VR_RANGE)
6462     {
6463       int cmp;
6464       tree min, max;
6465
6466       /* Compute the convex hull of the ranges.  The lower limit of
6467          the new range is the minimum of the two ranges.  If they
6468          cannot be compared, then give up.  */
6469       cmp = compare_values (vr0->min, vr1->min);
6470       if (cmp == 0 || cmp == 1)
6471         min = vr1->min;
6472       else if (cmp == -1)
6473         min = vr0->min;
6474       else
6475         goto give_up;
6476
6477       /* Similarly, the upper limit of the new range is the maximum
6478          of the two ranges.  If they cannot be compared, then
6479          give up.  */
6480       cmp = compare_values (vr0->max, vr1->max);
6481       if (cmp == 0 || cmp == -1)
6482         max = vr1->max;
6483       else if (cmp == 1)
6484         max = vr0->max;
6485       else
6486         goto give_up;
6487
6488       /* Check for useless ranges.  */
6489       if (INTEGRAL_TYPE_P (TREE_TYPE (min))
6490           && ((vrp_val_is_min (min) || is_overflow_infinity (min))
6491               && (vrp_val_is_max (max) || is_overflow_infinity (max))))
6492         goto give_up;
6493
6494       /* The resulting set of equivalences is the intersection of
6495          the two sets.  */
6496       if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
6497         bitmap_and_into (vr0->equiv, vr1->equiv);
6498       else if (vr0->equiv && !vr1->equiv)
6499         bitmap_clear (vr0->equiv);
6500
6501       set_value_range (vr0, vr0->type, min, max, vr0->equiv);
6502     }
6503   else if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
6504     {
6505       /* Two anti-ranges meet only if their complements intersect.
6506          Only handle the case of identical ranges.  */
6507       if (compare_values (vr0->min, vr1->min) == 0
6508           && compare_values (vr0->max, vr1->max) == 0
6509           && compare_values (vr0->min, vr0->max) == 0)
6510         {
6511           /* The resulting set of equivalences is the intersection of
6512              the two sets.  */
6513           if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
6514             bitmap_and_into (vr0->equiv, vr1->equiv);
6515           else if (vr0->equiv && !vr1->equiv)
6516             bitmap_clear (vr0->equiv);
6517         }
6518       else
6519         goto give_up;
6520     }
6521   else if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
6522     {
6523       /* For a numeric range [VAL1, VAL2] and an anti-range ~[VAL3, VAL4],
6524          only handle the case where the ranges have an empty intersection.
6525          The result of the meet operation is the anti-range.  */
6526       if (!symbolic_range_p (vr0)
6527           && !symbolic_range_p (vr1)
6528           && !value_ranges_intersect_p (vr0, vr1))
6529         {
6530           /* Copy most of VR1 into VR0.  Don't copy VR1's equivalence
6531              set.  We need to compute the intersection of the two
6532              equivalence sets.  */
6533           if (vr1->type == VR_ANTI_RANGE)
6534             set_value_range (vr0, vr1->type, vr1->min, vr1->max, vr0->equiv);
6535
6536           /* The resulting set of equivalences is the intersection of
6537              the two sets.  */
6538           if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
6539             bitmap_and_into (vr0->equiv, vr1->equiv);
6540           else if (vr0->equiv && !vr1->equiv)
6541             bitmap_clear (vr0->equiv);
6542         }
6543       else
6544         goto give_up;
6545     }
6546   else
6547     gcc_unreachable ();
6548
6549   return;
6550
6551 give_up:
6552   /* Failed to find an efficient meet.  Before giving up and setting
6553      the result to VARYING, see if we can at least derive a useful
6554      anti-range.  FIXME, all this nonsense about distinguishing
6555      anti-ranges from ranges is necessary because of the odd
6556      semantics of range_includes_zero_p and friends.  */
6557   if (!symbolic_range_p (vr0)
6558       && ((vr0->type == VR_RANGE && !range_includes_zero_p (vr0))
6559           || (vr0->type == VR_ANTI_RANGE && range_includes_zero_p (vr0)))
6560       && !symbolic_range_p (vr1)
6561       && ((vr1->type == VR_RANGE && !range_includes_zero_p (vr1))
6562           || (vr1->type == VR_ANTI_RANGE && range_includes_zero_p (vr1))))
6563     {
6564       set_value_range_to_nonnull (vr0, TREE_TYPE (vr0->min));
6565
6566       /* Since this meet operation did not result from the meeting of
6567          two equivalent names, VR0 cannot have any equivalences.  */
6568       if (vr0->equiv)
6569         bitmap_clear (vr0->equiv);
6570     }
6571   else
6572     set_value_range_to_varying (vr0);
6573 }
6574
6575
6576 /* Visit all arguments for PHI node PHI that flow through executable
6577    edges.  If a valid value range can be derived from all the incoming
6578    value ranges, set a new range for the LHS of PHI.  */
6579
6580 static enum ssa_prop_result
6581 vrp_visit_phi_node (gimple phi)
6582 {
6583   size_t i;
6584   tree lhs = PHI_RESULT (phi);
6585   value_range_t *lhs_vr = get_value_range (lhs);
6586   value_range_t vr_result = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
6587   int edges, old_edges;
6588   struct loop *l;
6589
6590   if (dump_file && (dump_flags & TDF_DETAILS))
6591     {
6592       fprintf (dump_file, "\nVisiting PHI node: ");
6593       print_gimple_stmt (dump_file, phi, 0, dump_flags);
6594     }
6595
6596   edges = 0;
6597   for (i = 0; i < gimple_phi_num_args (phi); i++)
6598     {
6599       edge e = gimple_phi_arg_edge (phi, i);
6600
6601       if (dump_file && (dump_flags & TDF_DETAILS))
6602         {
6603           fprintf (dump_file,
6604               "\n    Argument #%d (%d -> %d %sexecutable)\n",
6605               (int) i, e->src->index, e->dest->index,
6606               (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
6607         }
6608
6609       if (e->flags & EDGE_EXECUTABLE)
6610         {
6611           tree arg = PHI_ARG_DEF (phi, i);
6612           value_range_t vr_arg;
6613
6614           ++edges;
6615
6616           if (TREE_CODE (arg) == SSA_NAME)
6617             {
6618               vr_arg = *(get_value_range (arg));
6619             }
6620           else
6621             {
6622               if (is_overflow_infinity (arg))
6623                 {
6624                   arg = copy_node (arg);
6625                   TREE_OVERFLOW (arg) = 0;
6626                 }
6627
6628               vr_arg.type = VR_RANGE;
6629               vr_arg.min = arg;
6630               vr_arg.max = arg;
6631               vr_arg.equiv = NULL;
6632             }
6633
6634           if (dump_file && (dump_flags & TDF_DETAILS))
6635             {
6636               fprintf (dump_file, "\t");
6637               print_generic_expr (dump_file, arg, dump_flags);
6638               fprintf (dump_file, "\n\tValue: ");
6639               dump_value_range (dump_file, &vr_arg);
6640               fprintf (dump_file, "\n");
6641             }
6642
6643           vrp_meet (&vr_result, &vr_arg);
6644
6645           if (vr_result.type == VR_VARYING)
6646             break;
6647         }
6648     }
6649
6650   if (vr_result.type == VR_VARYING)
6651     goto varying;
6652
6653   old_edges = vr_phi_edge_counts[SSA_NAME_VERSION (lhs)];
6654   vr_phi_edge_counts[SSA_NAME_VERSION (lhs)] = edges;
6655
6656   /* To prevent infinite iterations in the algorithm, derive ranges
6657      when the new value is slightly bigger or smaller than the
6658      previous one.  We don't do this if we have seen a new executable
6659      edge; this helps us avoid an overflow infinity for conditionals
6660      which are not in a loop.  */
6661   if (edges > 0
6662       && gimple_phi_num_args (phi) > 1
6663       && edges == old_edges)
6664     {
6665       int cmp_min = compare_values (lhs_vr->min, vr_result.min);
6666       int cmp_max = compare_values (lhs_vr->max, vr_result.max);
6667
6668       /* For non VR_RANGE or for pointers fall back to varying if
6669          the range changed.  */
6670       if ((lhs_vr->type != VR_RANGE || vr_result.type != VR_RANGE
6671            || POINTER_TYPE_P (TREE_TYPE (lhs)))
6672           && (cmp_min != 0 || cmp_max != 0))
6673         goto varying;
6674
6675       /* If the new minimum is smaller or larger than the previous
6676          one, go all the way to -INF.  In the first case, to avoid
6677          iterating millions of times to reach -INF, and in the
6678          other case to avoid infinite bouncing between different
6679          minimums.  */
6680       if (cmp_min > 0 || cmp_min < 0)
6681         {
6682           if (!needs_overflow_infinity (TREE_TYPE (vr_result.min))
6683               || !vrp_var_may_overflow (lhs, phi))
6684             vr_result.min = TYPE_MIN_VALUE (TREE_TYPE (vr_result.min));
6685           else if (supports_overflow_infinity (TREE_TYPE (vr_result.min)))
6686             vr_result.min =
6687                 negative_overflow_infinity (TREE_TYPE (vr_result.min));
6688         }
6689
6690       /* Similarly, if the new maximum is smaller or larger than
6691          the previous one, go all the way to +INF.  */
6692       if (cmp_max < 0 || cmp_max > 0)
6693         {
6694           if (!needs_overflow_infinity (TREE_TYPE (vr_result.max))
6695               || !vrp_var_may_overflow (lhs, phi))
6696             vr_result.max = TYPE_MAX_VALUE (TREE_TYPE (vr_result.max));
6697           else if (supports_overflow_infinity (TREE_TYPE (vr_result.max)))
6698             vr_result.max =
6699                 positive_overflow_infinity (TREE_TYPE (vr_result.max));
6700         }
6701
6702       /* If we dropped either bound to +-INF then if this is a loop
6703          PHI node SCEV may known more about its value-range.  */
6704       if ((cmp_min > 0 || cmp_min < 0
6705            || cmp_max < 0 || cmp_max > 0)
6706           && current_loops
6707           && (l = loop_containing_stmt (phi))
6708           && l->header == gimple_bb (phi))
6709         adjust_range_with_scev (&vr_result, l, phi, lhs);
6710
6711       /* If we will end up with a (-INF, +INF) range, set it to
6712          VARYING.  Same if the previous max value was invalid for
6713          the type and we end up with vr_result.min > vr_result.max.  */
6714       if ((vrp_val_is_max (vr_result.max)
6715            && vrp_val_is_min (vr_result.min))
6716           || compare_values (vr_result.min,
6717                              vr_result.max) > 0)
6718         goto varying;
6719     }
6720
6721   /* If the new range is different than the previous value, keep
6722      iterating.  */
6723   if (update_value_range (lhs, &vr_result))
6724     {
6725       if (dump_file && (dump_flags & TDF_DETAILS))
6726         {
6727           fprintf (dump_file, "Found new range for ");
6728           print_generic_expr (dump_file, lhs, 0);
6729           fprintf (dump_file, ": ");
6730           dump_value_range (dump_file, &vr_result);
6731           fprintf (dump_file, "\n\n");
6732         }
6733
6734       return SSA_PROP_INTERESTING;
6735     }
6736
6737   /* Nothing changed, don't add outgoing edges.  */
6738   return SSA_PROP_NOT_INTERESTING;
6739
6740   /* No match found.  Set the LHS to VARYING.  */
6741 varying:
6742   set_value_range_to_varying (lhs_vr);
6743   return SSA_PROP_VARYING;
6744 }
6745
6746 /* Simplify boolean operations if the source is known
6747    to be already a boolean.  */
6748 static bool
6749 simplify_truth_ops_using_ranges (gimple_stmt_iterator *gsi, gimple stmt)
6750 {
6751   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
6752   tree val = NULL;
6753   tree op0, op1;
6754   value_range_t *vr;
6755   bool sop = false;
6756   bool need_conversion;
6757
6758   op0 = gimple_assign_rhs1 (stmt);
6759   if (TYPE_PRECISION (TREE_TYPE (op0)) != 1)
6760     {
6761       if (TREE_CODE (op0) != SSA_NAME)
6762         return false;
6763       vr = get_value_range (op0);
6764
6765       val = compare_range_with_value (GE_EXPR, vr, integer_zero_node, &sop);
6766       if (!val || !integer_onep (val))
6767         return false;
6768
6769       val = compare_range_with_value (LE_EXPR, vr, integer_one_node, &sop);
6770       if (!val || !integer_onep (val))
6771         return false;
6772     }
6773
6774   if (rhs_code == TRUTH_NOT_EXPR)
6775     {
6776       rhs_code = NE_EXPR;
6777       op1 = build_int_cst (TREE_TYPE (op0), 1);
6778     }
6779   else
6780     {
6781       op1 = gimple_assign_rhs2 (stmt);
6782
6783       /* Reduce number of cases to handle.  */
6784       if (is_gimple_min_invariant (op1))
6785         {
6786           /* Exclude anything that should have been already folded.  */
6787           if (rhs_code != EQ_EXPR
6788               && rhs_code != NE_EXPR
6789               && rhs_code != TRUTH_XOR_EXPR)
6790             return false;
6791
6792           if (!integer_zerop (op1)
6793               && !integer_onep (op1)
6794               && !integer_all_onesp (op1))
6795             return false;
6796
6797           /* Limit the number of cases we have to consider.  */
6798           if (rhs_code == EQ_EXPR)
6799             {
6800               rhs_code = NE_EXPR;
6801               op1 = fold_unary (TRUTH_NOT_EXPR, TREE_TYPE (op1), op1);
6802             }
6803         }
6804       else
6805         {
6806           /* Punt on A == B as there is no BIT_XNOR_EXPR.  */
6807           if (rhs_code == EQ_EXPR)
6808             return false;
6809
6810           if (TYPE_PRECISION (TREE_TYPE (op1)) != 1)
6811             {
6812               vr = get_value_range (op1);
6813               val = compare_range_with_value (GE_EXPR, vr, integer_zero_node, &sop);
6814               if (!val || !integer_onep (val))
6815                 return false;
6816
6817               val = compare_range_with_value (LE_EXPR, vr, integer_one_node, &sop);
6818               if (!val || !integer_onep (val))
6819                 return false;
6820             }
6821         }
6822     }
6823
6824   if (sop && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
6825     {
6826       location_t location;
6827
6828       if (!gimple_has_location (stmt))
6829         location = input_location;
6830       else
6831         location = gimple_location (stmt);
6832
6833       if (rhs_code == TRUTH_AND_EXPR || rhs_code == TRUTH_OR_EXPR)
6834         warning_at (location, OPT_Wstrict_overflow,
6835                     _("assuming signed overflow does not occur when "
6836                       "simplifying && or || to & or |"));
6837       else
6838         warning_at (location, OPT_Wstrict_overflow,
6839                     _("assuming signed overflow does not occur when "
6840                       "simplifying ==, != or ! to identity or ^"));
6841     }
6842
6843   need_conversion =
6844     !useless_type_conversion_p (TREE_TYPE (gimple_assign_lhs (stmt)),
6845                                 TREE_TYPE (op0));
6846
6847   /* Make sure to not sign-extend -1 as a boolean value.  */
6848   if (need_conversion
6849       && !TYPE_UNSIGNED (TREE_TYPE (op0))
6850       && TYPE_PRECISION (TREE_TYPE (op0)) == 1)
6851     return false;
6852
6853   switch (rhs_code)
6854     {
6855     case TRUTH_AND_EXPR:
6856       rhs_code = BIT_AND_EXPR;
6857       break;
6858     case TRUTH_OR_EXPR:
6859       rhs_code = BIT_IOR_EXPR;
6860       break;
6861     case TRUTH_XOR_EXPR:
6862     case NE_EXPR:
6863       if (integer_zerop (op1))
6864         {
6865           gimple_assign_set_rhs_with_ops (gsi,
6866                                           need_conversion ? NOP_EXPR : SSA_NAME,
6867                                           op0, NULL);
6868           update_stmt (gsi_stmt (*gsi));
6869           return true;
6870         }
6871
6872       rhs_code = BIT_XOR_EXPR;
6873       break;
6874     default:
6875       gcc_unreachable ();
6876     }
6877
6878   if (need_conversion)
6879     return false;
6880
6881   gimple_assign_set_rhs_with_ops (gsi, rhs_code, op0, op1);
6882   update_stmt (gsi_stmt (*gsi));
6883   return true;
6884 }
6885
6886 /* Simplify a division or modulo operator to a right shift or
6887    bitwise and if the first operand is unsigned or is greater
6888    than zero and the second operand is an exact power of two.  */
6889
6890 static bool
6891 simplify_div_or_mod_using_ranges (gimple stmt)
6892 {
6893   enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
6894   tree val = NULL;
6895   tree op0 = gimple_assign_rhs1 (stmt);
6896   tree op1 = gimple_assign_rhs2 (stmt);
6897   value_range_t *vr = get_value_range (gimple_assign_rhs1 (stmt));
6898
6899   if (TYPE_UNSIGNED (TREE_TYPE (op0)))
6900     {
6901       val = integer_one_node;
6902     }
6903   else
6904     {
6905       bool sop = false;
6906
6907       val = compare_range_with_value (GE_EXPR, vr, integer_zero_node, &sop);
6908
6909       if (val
6910           && sop
6911           && integer_onep (val)
6912           && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
6913         {
6914           location_t location;
6915
6916           if (!gimple_has_location (stmt))
6917             location = input_location;
6918           else
6919             location = gimple_location (stmt);
6920           warning_at (location, OPT_Wstrict_overflow,
6921                       "assuming signed overflow does not occur when "
6922                       "simplifying %</%> or %<%%%> to %<>>%> or %<&%>");
6923         }
6924     }
6925
6926   if (val && integer_onep (val))
6927     {
6928       tree t;
6929
6930       if (rhs_code == TRUNC_DIV_EXPR)
6931         {
6932           t = build_int_cst (integer_type_node, tree_log2 (op1));
6933           gimple_assign_set_rhs_code (stmt, RSHIFT_EXPR);
6934           gimple_assign_set_rhs1 (stmt, op0);
6935           gimple_assign_set_rhs2 (stmt, t);
6936         }
6937       else
6938         {
6939           t = build_int_cst (TREE_TYPE (op1), 1);
6940           t = int_const_binop (MINUS_EXPR, op1, t);
6941           t = fold_convert (TREE_TYPE (op0), t);
6942
6943           gimple_assign_set_rhs_code (stmt, BIT_AND_EXPR);
6944           gimple_assign_set_rhs1 (stmt, op0);
6945           gimple_assign_set_rhs2 (stmt, t);
6946         }
6947
6948       update_stmt (stmt);
6949       return true;
6950     }
6951
6952   return false;
6953 }
6954
6955 /* If the operand to an ABS_EXPR is >= 0, then eliminate the
6956    ABS_EXPR.  If the operand is <= 0, then simplify the
6957    ABS_EXPR into a NEGATE_EXPR.  */
6958
6959 static bool
6960 simplify_abs_using_ranges (gimple stmt)
6961 {
6962   tree val = NULL;
6963   tree op = gimple_assign_rhs1 (stmt);
6964   tree type = TREE_TYPE (op);
6965   value_range_t *vr = get_value_range (op);
6966
6967   if (TYPE_UNSIGNED (type))
6968     {
6969       val = integer_zero_node;
6970     }
6971   else if (vr)
6972     {
6973       bool sop = false;
6974
6975       val = compare_range_with_value (LE_EXPR, vr, integer_zero_node, &sop);
6976       if (!val)
6977         {
6978           sop = false;
6979           val = compare_range_with_value (GE_EXPR, vr, integer_zero_node,
6980                                           &sop);
6981
6982           if (val)
6983             {
6984               if (integer_zerop (val))
6985                 val = integer_one_node;
6986               else if (integer_onep (val))
6987                 val = integer_zero_node;
6988             }
6989         }
6990
6991       if (val
6992           && (integer_onep (val) || integer_zerop (val)))
6993         {
6994           if (sop && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC))
6995             {
6996               location_t location;
6997
6998               if (!gimple_has_location (stmt))
6999                 location = input_location;
7000               else
7001                 location = gimple_location (stmt);
7002               warning_at (location, OPT_Wstrict_overflow,
7003                           "assuming signed overflow does not occur when "
7004                           "simplifying %<abs (X)%> to %<X%> or %<-X%>");
7005             }
7006
7007           gimple_assign_set_rhs1 (stmt, op);
7008           if (integer_onep (val))
7009             gimple_assign_set_rhs_code (stmt, NEGATE_EXPR);
7010           else
7011             gimple_assign_set_rhs_code (stmt, SSA_NAME);
7012           update_stmt (stmt);
7013           return true;
7014         }
7015     }
7016
7017   return false;
7018 }
7019
7020 /* Optimize away redundant BIT_AND_EXPR and BIT_IOR_EXPR.
7021    If all the bits that are being cleared by & are already
7022    known to be zero from VR, or all the bits that are being
7023    set by | are already known to be one from VR, the bit
7024    operation is redundant.  */
7025
7026 static bool
7027 simplify_bit_ops_using_ranges (gimple_stmt_iterator *gsi, gimple stmt)
7028 {
7029   tree op0 = gimple_assign_rhs1 (stmt);
7030   tree op1 = gimple_assign_rhs2 (stmt);
7031   tree op = NULL_TREE;
7032   value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
7033   value_range_t vr1 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
7034   double_int may_be_nonzero0, may_be_nonzero1;
7035   double_int must_be_nonzero0, must_be_nonzero1;
7036   double_int mask;
7037
7038   if (TREE_CODE (op0) == SSA_NAME)
7039     vr0 = *(get_value_range (op0));
7040   else if (is_gimple_min_invariant (op0))
7041     set_value_range_to_value (&vr0, op0, NULL);
7042   else
7043     return false;
7044
7045   if (TREE_CODE (op1) == SSA_NAME)
7046     vr1 = *(get_value_range (op1));
7047   else if (is_gimple_min_invariant (op1))
7048     set_value_range_to_value (&vr1, op1, NULL);
7049   else
7050     return false;
7051
7052   if (!zero_nonzero_bits_from_vr (&vr0, &may_be_nonzero0, &must_be_nonzero0))
7053     return false;
7054   if (!zero_nonzero_bits_from_vr (&vr1, &may_be_nonzero1, &must_be_nonzero1))
7055     return false;
7056
7057   switch (gimple_assign_rhs_code (stmt))
7058     {
7059     case BIT_AND_EXPR:
7060       mask = double_int_and_not (may_be_nonzero0, must_be_nonzero1);
7061       if (double_int_zero_p (mask))
7062         {
7063           op = op0;
7064           break;
7065         }
7066       mask = double_int_and_not (may_be_nonzero1, must_be_nonzero0);
7067       if (double_int_zero_p (mask))
7068         {
7069           op = op1;
7070           break;
7071         }
7072       break;
7073     case BIT_IOR_EXPR:
7074       mask = double_int_and_not (may_be_nonzero0, must_be_nonzero1);
7075       if (double_int_zero_p (mask))
7076         {
7077           op = op1;
7078           break;
7079         }
7080       mask = double_int_and_not (may_be_nonzero1, must_be_nonzero0);
7081       if (double_int_zero_p (mask))
7082         {
7083           op = op0;
7084           break;
7085         }
7086       break;
7087     default:
7088       gcc_unreachable ();
7089     }
7090
7091   if (op == NULL_TREE)
7092     return false;
7093
7094   gimple_assign_set_rhs_with_ops (gsi, TREE_CODE (op), op, NULL);
7095   update_stmt (gsi_stmt (*gsi));
7096   return true;
7097 }
7098
7099 /* We are comparing trees OP0 and OP1 using COND_CODE.  OP0 has
7100    a known value range VR.
7101
7102    If there is one and only one value which will satisfy the
7103    conditional, then return that value.  Else return NULL.  */
7104
7105 static tree
7106 test_for_singularity (enum tree_code cond_code, tree op0,
7107                       tree op1, value_range_t *vr)
7108 {
7109   tree min = NULL;
7110   tree max = NULL;
7111
7112   /* Extract minimum/maximum values which satisfy the
7113      the conditional as it was written.  */
7114   if (cond_code == LE_EXPR || cond_code == LT_EXPR)
7115     {
7116       /* This should not be negative infinity; there is no overflow
7117          here.  */
7118       min = TYPE_MIN_VALUE (TREE_TYPE (op0));
7119
7120       max = op1;
7121       if (cond_code == LT_EXPR && !is_overflow_infinity (max))
7122         {
7123           tree one = build_int_cst (TREE_TYPE (op0), 1);
7124           max = fold_build2 (MINUS_EXPR, TREE_TYPE (op0), max, one);
7125           if (EXPR_P (max))
7126             TREE_NO_WARNING (max) = 1;
7127         }
7128     }
7129   else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
7130     {
7131       /* This should not be positive infinity; there is no overflow
7132          here.  */
7133       max = TYPE_MAX_VALUE (TREE_TYPE (op0));
7134
7135       min = op1;
7136       if (cond_code == GT_EXPR && !is_overflow_infinity (min))
7137         {
7138           tree one = build_int_cst (TREE_TYPE (op0), 1);
7139           min = fold_build2 (PLUS_EXPR, TREE_TYPE (op0), min, one);
7140           if (EXPR_P (min))
7141             TREE_NO_WARNING (min) = 1;
7142         }
7143     }
7144
7145   /* Now refine the minimum and maximum values using any
7146      value range information we have for op0.  */
7147   if (min && max)
7148     {
7149       if (compare_values (vr->min, min) == 1)
7150         min = vr->min;
7151       if (compare_values (vr->max, max) == -1)
7152         max = vr->max;
7153
7154       /* If the new min/max values have converged to a single value,
7155          then there is only one value which can satisfy the condition,
7156          return that value.  */
7157       if (operand_equal_p (min, max, 0) && is_gimple_min_invariant (min))
7158         return min;
7159     }
7160   return NULL;
7161 }
7162
7163 /* Simplify a conditional using a relational operator to an equality
7164    test if the range information indicates only one value can satisfy
7165    the original conditional.  */
7166
7167 static bool
7168 simplify_cond_using_ranges (gimple stmt)
7169 {
7170   tree op0 = gimple_cond_lhs (stmt);
7171   tree op1 = gimple_cond_rhs (stmt);
7172   enum tree_code cond_code = gimple_cond_code (stmt);
7173
7174   if (cond_code != NE_EXPR
7175       && cond_code != EQ_EXPR
7176       && TREE_CODE (op0) == SSA_NAME
7177       && INTEGRAL_TYPE_P (TREE_TYPE (op0))
7178       && is_gimple_min_invariant (op1))
7179     {
7180       value_range_t *vr = get_value_range (op0);
7181
7182       /* If we have range information for OP0, then we might be
7183          able to simplify this conditional. */
7184       if (vr->type == VR_RANGE)
7185         {
7186           tree new_tree = test_for_singularity (cond_code, op0, op1, vr);
7187
7188           if (new_tree)
7189             {
7190               if (dump_file)
7191                 {
7192                   fprintf (dump_file, "Simplified relational ");
7193                   print_gimple_stmt (dump_file, stmt, 0, 0);
7194                   fprintf (dump_file, " into ");
7195                 }
7196
7197               gimple_cond_set_code (stmt, EQ_EXPR);
7198               gimple_cond_set_lhs (stmt, op0);
7199               gimple_cond_set_rhs (stmt, new_tree);
7200
7201               update_stmt (stmt);
7202
7203               if (dump_file)
7204                 {
7205                   print_gimple_stmt (dump_file, stmt, 0, 0);
7206                   fprintf (dump_file, "\n");
7207                 }
7208
7209               return true;
7210             }
7211
7212           /* Try again after inverting the condition.  We only deal
7213              with integral types here, so no need to worry about
7214              issues with inverting FP comparisons.  */
7215           cond_code = invert_tree_comparison (cond_code, false);
7216           new_tree = test_for_singularity (cond_code, op0, op1, vr);
7217
7218           if (new_tree)
7219             {
7220               if (dump_file)
7221                 {
7222                   fprintf (dump_file, "Simplified relational ");
7223                   print_gimple_stmt (dump_file, stmt, 0, 0);
7224                   fprintf (dump_file, " into ");
7225                 }
7226
7227               gimple_cond_set_code (stmt, NE_EXPR);
7228               gimple_cond_set_lhs (stmt, op0);
7229               gimple_cond_set_rhs (stmt, new_tree);
7230
7231               update_stmt (stmt);
7232
7233               if (dump_file)
7234                 {
7235                   print_gimple_stmt (dump_file, stmt, 0, 0);
7236                   fprintf (dump_file, "\n");
7237                 }
7238
7239               return true;
7240             }
7241         }
7242     }
7243
7244   return false;
7245 }
7246
7247 /* Simplify a switch statement using the value range of the switch
7248    argument.  */
7249
7250 static bool
7251 simplify_switch_using_ranges (gimple stmt)
7252 {
7253   tree op = gimple_switch_index (stmt);
7254   value_range_t *vr;
7255   bool take_default;
7256   edge e;
7257   edge_iterator ei;
7258   size_t i = 0, j = 0, n, n2;
7259   tree vec2;
7260   switch_update su;
7261
7262   if (TREE_CODE (op) == SSA_NAME)
7263     {
7264       vr = get_value_range (op);
7265
7266       /* We can only handle integer ranges.  */
7267       if (vr->type != VR_RANGE
7268           || symbolic_range_p (vr))
7269         return false;
7270
7271       /* Find case label for min/max of the value range.  */
7272       take_default = !find_case_label_range (stmt, vr->min, vr->max, &i, &j);
7273     }
7274   else if (TREE_CODE (op) == INTEGER_CST)
7275     {
7276       take_default = !find_case_label_index (stmt, 1, op, &i);
7277       if (take_default)
7278         {
7279           i = 1;
7280           j = 0;
7281         }
7282       else
7283         {
7284           j = i;
7285         }
7286     }
7287   else
7288     return false;
7289
7290   n = gimple_switch_num_labels (stmt);
7291
7292   /* Bail out if this is just all edges taken.  */
7293   if (i == 1
7294       && j == n - 1
7295       && take_default)
7296     return false;
7297
7298   /* Build a new vector of taken case labels.  */
7299   vec2 = make_tree_vec (j - i + 1 + (int)take_default);
7300   n2 = 0;
7301
7302   /* Add the default edge, if necessary.  */
7303   if (take_default)
7304     TREE_VEC_ELT (vec2, n2++) = gimple_switch_default_label (stmt);
7305
7306   for (; i <= j; ++i, ++n2)
7307     TREE_VEC_ELT (vec2, n2) = gimple_switch_label (stmt, i);
7308
7309   /* Mark needed edges.  */
7310   for (i = 0; i < n2; ++i)
7311     {
7312       e = find_edge (gimple_bb (stmt),
7313                      label_to_block (CASE_LABEL (TREE_VEC_ELT (vec2, i))));
7314       e->aux = (void *)-1;
7315     }
7316
7317   /* Queue not needed edges for later removal.  */
7318   FOR_EACH_EDGE (e, ei, gimple_bb (stmt)->succs)
7319     {
7320       if (e->aux == (void *)-1)
7321         {
7322           e->aux = NULL;
7323           continue;
7324         }
7325
7326       if (dump_file && (dump_flags & TDF_DETAILS))
7327         {
7328           fprintf (dump_file, "removing unreachable case label\n");
7329         }
7330       VEC_safe_push (edge, heap, to_remove_edges, e);
7331       e->flags &= ~EDGE_EXECUTABLE;
7332     }
7333
7334   /* And queue an update for the stmt.  */
7335   su.stmt = stmt;
7336   su.vec = vec2;
7337   VEC_safe_push (switch_update, heap, to_update_switch_stmts, &su);
7338   return false;
7339 }
7340
7341 /* Simplify STMT using ranges if possible.  */
7342
7343 static bool
7344 simplify_stmt_using_ranges (gimple_stmt_iterator *gsi)
7345 {
7346   gimple stmt = gsi_stmt (*gsi);
7347   if (is_gimple_assign (stmt))
7348     {
7349       enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
7350
7351       switch (rhs_code)
7352         {
7353         case EQ_EXPR:
7354         case NE_EXPR:
7355         case TRUTH_NOT_EXPR:
7356         case TRUTH_AND_EXPR:
7357         case TRUTH_OR_EXPR:
7358         case TRUTH_XOR_EXPR:
7359           /* Transform EQ_EXPR, NE_EXPR, TRUTH_NOT_EXPR into BIT_XOR_EXPR
7360              or identity if the RHS is zero or one, and the LHS are known
7361              to be boolean values.  Transform all TRUTH_*_EXPR into
7362              BIT_*_EXPR if both arguments are known to be boolean values.  */
7363           if (INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt))))
7364             return simplify_truth_ops_using_ranges (gsi, stmt);
7365           break;
7366
7367       /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
7368          and BIT_AND_EXPR respectively if the first operand is greater
7369          than zero and the second operand is an exact power of two.  */
7370         case TRUNC_DIV_EXPR:
7371         case TRUNC_MOD_EXPR:
7372           if (INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt)))
7373               && integer_pow2p (gimple_assign_rhs2 (stmt)))
7374             return simplify_div_or_mod_using_ranges (stmt);
7375           break;
7376
7377       /* Transform ABS (X) into X or -X as appropriate.  */
7378         case ABS_EXPR:
7379           if (TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME
7380               && INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt))))
7381             return simplify_abs_using_ranges (stmt);
7382           break;
7383
7384         case BIT_AND_EXPR:
7385         case BIT_IOR_EXPR:
7386           /* Optimize away BIT_AND_EXPR and BIT_IOR_EXPR
7387              if all the bits being cleared are already cleared or
7388              all the bits being set are already set.  */
7389           if (INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt))))
7390             return simplify_bit_ops_using_ranges (gsi, stmt);
7391           break;
7392
7393         default:
7394           break;
7395         }
7396     }
7397   else if (gimple_code (stmt) == GIMPLE_COND)
7398     return simplify_cond_using_ranges (stmt);
7399   else if (gimple_code (stmt) == GIMPLE_SWITCH)
7400     return simplify_switch_using_ranges (stmt);
7401
7402   return false;
7403 }
7404
7405 /* If the statement pointed by SI has a predicate whose value can be
7406    computed using the value range information computed by VRP, compute
7407    its value and return true.  Otherwise, return false.  */
7408
7409 static bool
7410 fold_predicate_in (gimple_stmt_iterator *si)
7411 {
7412   bool assignment_p = false;
7413   tree val;
7414   gimple stmt = gsi_stmt (*si);
7415
7416   if (is_gimple_assign (stmt)
7417       && TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)) == tcc_comparison)
7418     {
7419       assignment_p = true;
7420       val = vrp_evaluate_conditional (gimple_assign_rhs_code (stmt),
7421                                       gimple_assign_rhs1 (stmt),
7422                                       gimple_assign_rhs2 (stmt),
7423                                       stmt);
7424     }
7425   else if (gimple_code (stmt) == GIMPLE_COND)
7426     val = vrp_evaluate_conditional (gimple_cond_code (stmt),
7427                                     gimple_cond_lhs (stmt),
7428                                     gimple_cond_rhs (stmt),
7429                                     stmt);
7430   else
7431     return false;
7432
7433   if (val)
7434     {
7435       if (assignment_p)
7436         val = fold_convert (gimple_expr_type (stmt), val);
7437
7438       if (dump_file)
7439         {
7440           fprintf (dump_file, "Folding predicate ");
7441           print_gimple_expr (dump_file, stmt, 0, 0);
7442           fprintf (dump_file, " to ");
7443           print_generic_expr (dump_file, val, 0);
7444           fprintf (dump_file, "\n");
7445         }
7446
7447       if (is_gimple_assign (stmt))
7448         gimple_assign_set_rhs_from_tree (si, val);
7449       else
7450         {
7451           gcc_assert (gimple_code (stmt) == GIMPLE_COND);
7452           if (integer_zerop (val))
7453             gimple_cond_make_false (stmt);
7454           else if (integer_onep (val))
7455             gimple_cond_make_true (stmt);
7456           else
7457             gcc_unreachable ();
7458         }
7459
7460       return true;
7461     }
7462
7463   return false;
7464 }
7465
7466 /* Callback for substitute_and_fold folding the stmt at *SI.  */
7467
7468 static bool
7469 vrp_fold_stmt (gimple_stmt_iterator *si)
7470 {
7471   if (fold_predicate_in (si))
7472     return true;
7473
7474   return simplify_stmt_using_ranges (si);
7475 }
7476
7477 /* Stack of dest,src equivalency pairs that need to be restored after
7478    each attempt to thread a block's incoming edge to an outgoing edge.
7479
7480    A NULL entry is used to mark the end of pairs which need to be
7481    restored.  */
7482 static VEC(tree,heap) *stack;
7483
7484 /* A trivial wrapper so that we can present the generic jump threading
7485    code with a simple API for simplifying statements.  STMT is the
7486    statement we want to simplify, WITHIN_STMT provides the location
7487    for any overflow warnings.  */
7488
7489 static tree
7490 simplify_stmt_for_jump_threading (gimple stmt, gimple within_stmt)
7491 {
7492   /* We only use VRP information to simplify conditionals.  This is
7493      overly conservative, but it's unclear if doing more would be
7494      worth the compile time cost.  */
7495   if (gimple_code (stmt) != GIMPLE_COND)
7496     return NULL;
7497
7498   return vrp_evaluate_conditional (gimple_cond_code (stmt),
7499                                    gimple_cond_lhs (stmt),
7500                                    gimple_cond_rhs (stmt), within_stmt);
7501 }
7502
7503 /* Blocks which have more than one predecessor and more than
7504    one successor present jump threading opportunities, i.e.,
7505    when the block is reached from a specific predecessor, we
7506    may be able to determine which of the outgoing edges will
7507    be traversed.  When this optimization applies, we are able
7508    to avoid conditionals at runtime and we may expose secondary
7509    optimization opportunities.
7510
7511    This routine is effectively a driver for the generic jump
7512    threading code.  It basically just presents the generic code
7513    with edges that may be suitable for jump threading.
7514
7515    Unlike DOM, we do not iterate VRP if jump threading was successful.
7516    While iterating may expose new opportunities for VRP, it is expected
7517    those opportunities would be very limited and the compile time cost
7518    to expose those opportunities would be significant.
7519
7520    As jump threading opportunities are discovered, they are registered
7521    for later realization.  */
7522
7523 static void
7524 identify_jump_threads (void)
7525 {
7526   basic_block bb;
7527   gimple dummy;
7528   int i;
7529   edge e;
7530
7531   /* Ugh.  When substituting values earlier in this pass we can
7532      wipe the dominance information.  So rebuild the dominator
7533      information as we need it within the jump threading code.  */
7534   calculate_dominance_info (CDI_DOMINATORS);
7535
7536   /* We do not allow VRP information to be used for jump threading
7537      across a back edge in the CFG.  Otherwise it becomes too
7538      difficult to avoid eliminating loop exit tests.  Of course
7539      EDGE_DFS_BACK is not accurate at this time so we have to
7540      recompute it.  */
7541   mark_dfs_back_edges ();
7542
7543   /* Do not thread across edges we are about to remove.  Just marking
7544      them as EDGE_DFS_BACK will do.  */
7545   FOR_EACH_VEC_ELT (edge, to_remove_edges, i, e)
7546     e->flags |= EDGE_DFS_BACK;
7547
7548   /* Allocate our unwinder stack to unwind any temporary equivalences
7549      that might be recorded.  */
7550   stack = VEC_alloc (tree, heap, 20);
7551
7552   /* To avoid lots of silly node creation, we create a single
7553      conditional and just modify it in-place when attempting to
7554      thread jumps.  */
7555   dummy = gimple_build_cond (EQ_EXPR,
7556                              integer_zero_node, integer_zero_node,
7557                              NULL, NULL);
7558
7559   /* Walk through all the blocks finding those which present a
7560      potential jump threading opportunity.  We could set this up
7561      as a dominator walker and record data during the walk, but
7562      I doubt it's worth the effort for the classes of jump
7563      threading opportunities we are trying to identify at this
7564      point in compilation.  */
7565   FOR_EACH_BB (bb)
7566     {
7567       gimple last;
7568
7569       /* If the generic jump threading code does not find this block
7570          interesting, then there is nothing to do.  */
7571       if (! potentially_threadable_block (bb))
7572         continue;
7573
7574       /* We only care about blocks ending in a COND_EXPR.  While there
7575          may be some value in handling SWITCH_EXPR here, I doubt it's
7576          terribly important.  */
7577       last = gsi_stmt (gsi_last_bb (bb));
7578
7579       /* We're basically looking for a switch or any kind of conditional with
7580          integral or pointer type arguments.  Note the type of the second
7581          argument will be the same as the first argument, so no need to
7582          check it explicitly.  */
7583       if (gimple_code (last) == GIMPLE_SWITCH
7584           || (gimple_code (last) == GIMPLE_COND
7585               && TREE_CODE (gimple_cond_lhs (last)) == SSA_NAME
7586               && (INTEGRAL_TYPE_P (TREE_TYPE (gimple_cond_lhs (last)))
7587                   || POINTER_TYPE_P (TREE_TYPE (gimple_cond_lhs (last))))
7588               && (TREE_CODE (gimple_cond_rhs (last)) == SSA_NAME
7589                   || is_gimple_min_invariant (gimple_cond_rhs (last)))))
7590         {
7591           edge_iterator ei;
7592
7593           /* We've got a block with multiple predecessors and multiple
7594              successors which also ends in a suitable conditional or
7595              switch statement.  For each predecessor, see if we can thread
7596              it to a specific successor.  */
7597           FOR_EACH_EDGE (e, ei, bb->preds)
7598             {
7599               /* Do not thread across back edges or abnormal edges
7600                  in the CFG.  */
7601               if (e->flags & (EDGE_DFS_BACK | EDGE_COMPLEX))
7602                 continue;
7603
7604               thread_across_edge (dummy, e, true, &stack,
7605                                   simplify_stmt_for_jump_threading);
7606             }
7607         }
7608     }
7609
7610   /* We do not actually update the CFG or SSA graphs at this point as
7611      ASSERT_EXPRs are still in the IL and cfg cleanup code does not yet
7612      handle ASSERT_EXPRs gracefully.  */
7613 }
7614
7615 /* We identified all the jump threading opportunities earlier, but could
7616    not transform the CFG at that time.  This routine transforms the
7617    CFG and arranges for the dominator tree to be rebuilt if necessary.
7618
7619    Note the SSA graph update will occur during the normal TODO
7620    processing by the pass manager.  */
7621 static void
7622 finalize_jump_threads (void)
7623 {
7624   thread_through_all_blocks (false);
7625   VEC_free (tree, heap, stack);
7626 }
7627
7628
7629 /* Traverse all the blocks folding conditionals with known ranges.  */
7630
7631 static void
7632 vrp_finalize (void)
7633 {
7634   size_t i;
7635   unsigned num = num_ssa_names;
7636
7637   if (dump_file)
7638     {
7639       fprintf (dump_file, "\nValue ranges after VRP:\n\n");
7640       dump_all_value_ranges (dump_file);
7641       fprintf (dump_file, "\n");
7642     }
7643
7644   substitute_and_fold (op_with_constant_singleton_value_range,
7645                        vrp_fold_stmt, false);
7646
7647   if (warn_array_bounds)
7648     check_all_array_refs ();
7649
7650   /* We must identify jump threading opportunities before we release
7651      the datastructures built by VRP.  */
7652   identify_jump_threads ();
7653
7654   /* Free allocated memory.  */
7655   for (i = 0; i < num; i++)
7656     if (vr_value[i])
7657       {
7658         BITMAP_FREE (vr_value[i]->equiv);
7659         free (vr_value[i]);
7660       }
7661
7662   free (vr_value);
7663   free (vr_phi_edge_counts);
7664
7665   /* So that we can distinguish between VRP data being available
7666      and not available.  */
7667   vr_value = NULL;
7668   vr_phi_edge_counts = NULL;
7669 }
7670
7671
7672 /* Main entry point to VRP (Value Range Propagation).  This pass is
7673    loosely based on J. R. C. Patterson, ``Accurate Static Branch
7674    Prediction by Value Range Propagation,'' in SIGPLAN Conference on
7675    Programming Language Design and Implementation, pp. 67-78, 1995.
7676    Also available at http://citeseer.ist.psu.edu/patterson95accurate.html
7677
7678    This is essentially an SSA-CCP pass modified to deal with ranges
7679    instead of constants.
7680
7681    While propagating ranges, we may find that two or more SSA name
7682    have equivalent, though distinct ranges.  For instance,
7683
7684      1  x_9 = p_3->a;
7685      2  p_4 = ASSERT_EXPR <p_3, p_3 != 0>
7686      3  if (p_4 == q_2)
7687      4    p_5 = ASSERT_EXPR <p_4, p_4 == q_2>;
7688      5  endif
7689      6  if (q_2)
7690
7691    In the code above, pointer p_5 has range [q_2, q_2], but from the
7692    code we can also determine that p_5 cannot be NULL and, if q_2 had
7693    a non-varying range, p_5's range should also be compatible with it.
7694
7695    These equivalences are created by two expressions: ASSERT_EXPR and
7696    copy operations.  Since p_5 is an assertion on p_4, and p_4 was the
7697    result of another assertion, then we can use the fact that p_5 and
7698    p_4 are equivalent when evaluating p_5's range.
7699
7700    Together with value ranges, we also propagate these equivalences
7701    between names so that we can take advantage of information from
7702    multiple ranges when doing final replacement.  Note that this
7703    equivalency relation is transitive but not symmetric.
7704
7705    In the example above, p_5 is equivalent to p_4, q_2 and p_3, but we
7706    cannot assert that q_2 is equivalent to p_5 because q_2 may be used
7707    in contexts where that assertion does not hold (e.g., in line 6).
7708
7709    TODO, the main difference between this pass and Patterson's is that
7710    we do not propagate edge probabilities.  We only compute whether
7711    edges can be taken or not.  That is, instead of having a spectrum
7712    of jump probabilities between 0 and 1, we only deal with 0, 1 and
7713    DON'T KNOW.  In the future, it may be worthwhile to propagate
7714    probabilities to aid branch prediction.  */
7715
7716 static unsigned int
7717 execute_vrp (void)
7718 {
7719   int i;
7720   edge e;
7721   switch_update *su;
7722
7723   loop_optimizer_init (LOOPS_NORMAL | LOOPS_HAVE_RECORDED_EXITS);
7724   rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
7725   scev_initialize ();
7726
7727   /* Estimate number of iterations - but do not use undefined behavior
7728      for this.  We can't do this lazily as other functions may compute
7729      this using undefined behavior.  */
7730   free_numbers_of_iterations_estimates ();
7731   estimate_numbers_of_iterations (false);
7732
7733   insert_range_assertions ();
7734
7735   to_remove_edges = VEC_alloc (edge, heap, 10);
7736   to_update_switch_stmts = VEC_alloc (switch_update, heap, 5);
7737   threadedge_initialize_values ();
7738
7739   vrp_initialize ();
7740   ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
7741   vrp_finalize ();
7742
7743   /* ASSERT_EXPRs must be removed before finalizing jump threads
7744      as finalizing jump threads calls the CFG cleanup code which
7745      does not properly handle ASSERT_EXPRs.  */
7746   remove_range_assertions ();
7747
7748   /* If we exposed any new variables, go ahead and put them into
7749      SSA form now, before we handle jump threading.  This simplifies
7750      interactions between rewriting of _DECL nodes into SSA form
7751      and rewriting SSA_NAME nodes into SSA form after block
7752      duplication and CFG manipulation.  */
7753   update_ssa (TODO_update_ssa);
7754
7755   finalize_jump_threads ();
7756
7757   /* Remove dead edges from SWITCH_EXPR optimization.  This leaves the
7758      CFG in a broken state and requires a cfg_cleanup run.  */
7759   FOR_EACH_VEC_ELT (edge, to_remove_edges, i, e)
7760     remove_edge (e);
7761   /* Update SWITCH_EXPR case label vector.  */
7762   FOR_EACH_VEC_ELT (switch_update, to_update_switch_stmts, i, su)
7763     {
7764       size_t j;
7765       size_t n = TREE_VEC_LENGTH (su->vec);
7766       tree label;
7767       gimple_switch_set_num_labels (su->stmt, n);
7768       for (j = 0; j < n; j++)
7769         gimple_switch_set_label (su->stmt, j, TREE_VEC_ELT (su->vec, j));
7770       /* As we may have replaced the default label with a regular one
7771          make sure to make it a real default label again.  This ensures
7772          optimal expansion.  */
7773       label = gimple_switch_default_label (su->stmt);
7774       CASE_LOW (label) = NULL_TREE;
7775       CASE_HIGH (label) = NULL_TREE;
7776     }
7777
7778   if (VEC_length (edge, to_remove_edges) > 0)
7779     free_dominance_info (CDI_DOMINATORS);
7780
7781   VEC_free (edge, heap, to_remove_edges);
7782   VEC_free (switch_update, heap, to_update_switch_stmts);
7783   threadedge_finalize_values ();
7784
7785   scev_finalize ();
7786   loop_optimizer_finalize ();
7787   return 0;
7788 }
7789
7790 static bool
7791 gate_vrp (void)
7792 {
7793   return flag_tree_vrp != 0;
7794 }
7795
7796 struct gimple_opt_pass pass_vrp =
7797 {
7798  {
7799   GIMPLE_PASS,
7800   "vrp",                                /* name */
7801   gate_vrp,                             /* gate */
7802   execute_vrp,                          /* execute */
7803   NULL,                                 /* sub */
7804   NULL,                                 /* next */
7805   0,                                    /* static_pass_number */
7806   TV_TREE_VRP,                          /* tv_id */
7807   PROP_ssa,                             /* properties_required */
7808   0,                                    /* properties_provided */
7809   0,                                    /* properties_destroyed */
7810   0,                                    /* todo_flags_start */
7811   TODO_cleanup_cfg
7812     | TODO_update_ssa
7813     | TODO_verify_ssa
7814     | TODO_verify_flow
7815     | TODO_dump_func
7816     | TODO_ggc_collect                  /* todo_flags_finish */
7817  }
7818 };