OSDN Git Service

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