OSDN Git Service

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