OSDN Git Service

PR tree-optimization/20920
[pf3gnuchains/gcc-fork.git] / gcc / tree-vrp.c
1 /* Support routines for Value Range Propagation (VRP).
2    Copyright (C) 2005 Free Software Foundation, Inc.
3    Contributed by Diego Novillo <dnovillo@redhat.com>.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
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 "cfgloop.h"
36 #include "tree-scalar-evolution.h"
37 #include "tree-ssa-propagate.h"
38 #include "tree-chrec.h"
39
40 /* Set of SSA names found during the dominator traversal of a
41    sub-graph in maybe_add_assert_expr_on_edges.  */
42 static sbitmap found;
43
44 /* Loop structure of the program.  Used to analyze scalar evolutions
45    inside adjust_range_with_scev.  */
46 static struct loops *cfg_loops;
47
48 /* Local functions.  */
49 static int compare_values (tree val1, tree val2);
50
51 /* Given a conditional predicate COND that has WHICH as one of its
52    operands, return the other operand.  No error checking is done.
53    This helper assumes that COND is a comparison and WHICH is one of
54    its operands.  */
55
56 static inline tree
57 get_opposite_operand (tree cond, tree which)
58 {
59   if (TREE_OPERAND (cond, 0) == which)
60     return TREE_OPERAND (cond, 1);
61   else
62     return TREE_OPERAND (cond, 0);
63 }
64
65
66 /* Given a comparison code, return its opposite.  Note that this is *not*
67    the same as inverting its truth value (invert_tree_comparison).  Here we
68    just want to literally flip the comparison around.
69    
70    So, '<' gets '>', '<=' gets '>='.  Both '==' and '!=' are returned
71    unchanged.  */
72
73 static enum tree_code
74 opposite_comparison (enum tree_code code)
75 {
76   switch (code)
77     {
78     case EQ_EXPR:
79     case NE_EXPR:
80     case ORDERED_EXPR:
81     case UNORDERED_EXPR:
82     case LTGT_EXPR:
83     case UNEQ_EXPR:
84       return code;
85     case GT_EXPR:
86       return LT_EXPR;
87     case GE_EXPR:
88       return LE_EXPR;
89     case LT_EXPR:
90       return GT_EXPR;
91     case LE_EXPR:
92       return GE_EXPR;
93     case UNGT_EXPR:
94       return UNLT_EXPR;
95     case UNGE_EXPR:
96       return UNLE_EXPR;
97     case UNLT_EXPR:
98       return UNGT_EXPR;
99     case UNLE_EXPR:
100       return UNGE_EXPR;
101     default:
102       gcc_unreachable ();
103     }
104 }
105
106
107 /* Set value range VR to {T, MIN, MAX}.  */
108
109 static inline void
110 set_value_range (value_range *vr, enum value_range_type t, tree min, tree max)
111 {
112 #if defined ENABLE_CHECKING
113   if (t == VR_RANGE || t == VR_ANTI_RANGE)
114     {
115       int cmp;
116
117       gcc_assert (min && max);
118
119       if (INTEGRAL_TYPE_P (TREE_TYPE (min)) && t == VR_ANTI_RANGE)
120         gcc_assert (min != TYPE_MIN_VALUE (TREE_TYPE (min))
121                     || max != TYPE_MAX_VALUE (TREE_TYPE (max)));
122
123       cmp = compare_values (min, max);
124       gcc_assert (cmp == 0 || cmp == -1 || cmp == -2);
125     }
126 #endif
127
128   if (t == VR_RANGE
129       && INTEGRAL_TYPE_P (TREE_TYPE (min))
130       && min == TYPE_MIN_VALUE (TREE_TYPE (min))
131       && max == TYPE_MAX_VALUE (TREE_TYPE (max)))
132     {
133       /* Ranges that cover all the possible values for the type decay
134          to VARYING.  */
135       vr->type = VR_VARYING;
136       vr->min = NULL_TREE;
137       vr->max = NULL_TREE;
138       return;
139     }
140
141   vr->type = t;
142   vr->min = min;
143   vr->max = max;
144 }
145
146
147 /* Similar to set_value_range but return true if any field of VR
148    changed from its previous value.  */
149
150 static inline bool
151 update_value_range (value_range *vr, enum value_range_type t, tree min,
152                     tree max)
153 {
154   bool is_new = vr->type != t || vr->min != min || vr->max != max;
155   if (is_new)
156     set_value_range (vr, t, min, max);
157
158   return is_new;
159 }
160
161
162 /* Return value range information for VAR.  Create an empty range if
163    none existed.  */
164
165 value_range *
166 get_value_range (tree var)
167 {
168   value_range *vr;
169   tree sym;
170
171   vr = SSA_NAME_VALUE_RANGE (var);
172   if (vr)
173     return vr;
174
175   /* Create a default value range.  */
176   vr = ggc_alloc (sizeof (*vr));
177   memset ((void *) vr, 0, sizeof (*vr));
178   SSA_NAME_VALUE_RANGE (var) = vr;
179
180   /* If VAR is a default definition for a PARM_DECL, then we have to
181      assume a VARYING range for it.  */
182   sym = SSA_NAME_VAR (var);
183   if (TREE_CODE (sym) == PARM_DECL && var == var_ann (sym)->default_def)
184     set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
185
186   return vr;
187 }
188
189
190 /* Return true if value range VR involves at least one symbol.  */
191
192 static inline bool
193 symbolic_range_p (value_range *vr)
194 {
195   return (!is_gimple_min_invariant (vr->min)
196           || !is_gimple_min_invariant (vr->max));
197 }
198
199
200 /* Return true if EXPR computes a non-zero value.  */
201
202 bool
203 expr_computes_nonzero (tree expr)
204 {
205   /* Type casts won't change anything, so just strip it.  */
206   STRIP_NOPS (expr);
207
208   /* Calling alloca, guarantees that the value is non-NULL.  */
209   if (alloca_call_p (expr))
210     return true;
211
212   /* The address of a non-weak symbol is never NULL, unless the user
213      has requested not to remove NULL pointer checks.  */
214   if (flag_delete_null_pointer_checks
215       && TREE_CODE (expr) == ADDR_EXPR
216       && DECL_P (TREE_OPERAND (expr, 0))
217       && !DECL_WEAK (TREE_OPERAND (expr, 0)))
218     return true;
219
220   /* IOR of any value with a nonzero value will result in a nonzero
221      value.  */
222   if (TREE_CODE (expr) == BIT_IOR_EXPR
223       && integer_nonzerop (TREE_OPERAND (expr, 1)))
224     return true;
225
226   return false;
227 }
228
229
230 /* Return true if VR is ~[0, 0].  */
231
232 static inline bool
233 range_is_nonnull (value_range *vr)
234 {
235   return vr->type == VR_ANTI_RANGE
236          && integer_zerop (vr->min)
237          && integer_zerop (vr->max);
238 }
239
240
241 /* Return true if VR is [0, 0].  */
242
243 static inline bool
244 range_is_null (value_range *vr)
245 {
246   return vr->type == VR_RANGE
247          && integer_zerop (vr->min)
248          && integer_zerop (vr->max);
249 }
250
251
252 /* Set value range VR to a non-NULL range of type TYPE.  */
253
254 static void
255 set_value_range_to_nonnull (value_range *vr, tree type)
256 {
257   tree zero = build_int_cst (type, 0);
258   set_value_range (vr, VR_ANTI_RANGE, zero, zero);
259 }
260
261
262 /* Set value range VR to a NULL range of type TYPE.  */
263
264 static void
265 set_value_range_to_null (value_range *vr, tree type)
266 {
267   tree zero = build_int_cst (type, 0);
268   set_value_range (vr, VR_RANGE, zero, zero);
269 }
270
271
272 /* Compare two values VAL1 and VAL2.  Return
273    
274         -2 if VAL1 and VAL2 cannot be compared at compile-time,
275         -1 if VAL1 < VAL2,
276          0 if VAL1 == VAL2,
277         +1 if VAL1 > VAL2, and
278         +2 if VAL1 != VAL2
279
280    This is similar to tree_int_cst_compare but supports pointer values
281    and values that cannot be compared at compile time.  */
282
283 static int
284 compare_values (tree val1, tree val2)
285 {
286   if (val1 == val2)
287     return 0;
288
289   /* Do some limited symbolic comparisons.  */
290   if (!POINTER_TYPE_P (TREE_TYPE (val1)))
291     {
292       /* We can determine some comparisons against +INF and -INF even
293          if the other value is an expression.  */
294       if (val1 == TYPE_MAX_VALUE (TREE_TYPE (val1))
295           && TREE_CODE (val2) == MINUS_EXPR)
296         {
297           /* +INF > NAME - CST.  */
298           return 1;
299         }
300       else if (val1 == TYPE_MIN_VALUE (TREE_TYPE (val1))
301                && TREE_CODE (val2) == PLUS_EXPR)
302         {
303           /* -INF < NAME + CST.  */
304           return -1;
305         }
306       else if (TREE_CODE (val1) == MINUS_EXPR
307                && val2 == TYPE_MAX_VALUE (TREE_TYPE (val2)))
308         {
309           /* NAME - CST < +INF.  */
310           return -1;
311         }
312       else if (TREE_CODE (val1) == PLUS_EXPR
313                && val2 == TYPE_MIN_VALUE (TREE_TYPE (val2)))
314         {
315           /* NAME + CST > -INF.  */
316           return 1;
317         }
318     }
319
320   if ((TREE_CODE (val1) == SSA_NAME
321        || TREE_CODE (val1) == PLUS_EXPR
322        || TREE_CODE (val1) == MINUS_EXPR)
323       && (TREE_CODE (val2) == SSA_NAME
324           || TREE_CODE (val2) == PLUS_EXPR
325           || TREE_CODE (val2) == MINUS_EXPR))
326     {
327       tree n1, c1, n2, c2;
328   
329       /* If VAL1 and VAL2 are of the form 'NAME [+-] CST' or 'NAME',
330          return -1 or +1 accordingly.  If VAL1 and VAL2 don't use the
331          same name, return -2.  */
332       if (TREE_CODE (val1) == SSA_NAME)
333         {
334           n1 = val1;
335           c1 = NULL_TREE;
336         }
337       else
338         {
339           n1 = TREE_OPERAND (val1, 0);
340           c1 = TREE_OPERAND (val1, 1);
341         }
342
343       if (TREE_CODE (val2) == SSA_NAME)
344         {
345           n2 = val2;
346           c2 = NULL_TREE;
347         }
348       else
349         {
350           n2 = TREE_OPERAND (val2, 0);
351           c2 = TREE_OPERAND (val2, 1);
352         }
353
354       /* Both values must use the same name.  */
355       if (n1 != n2)
356         return -2;
357
358       if (TREE_CODE (val1) == SSA_NAME)
359         {
360           if (TREE_CODE (val2) == SSA_NAME)
361             /* NAME == NAME  */
362             return 0;
363           else if (TREE_CODE (val2) == PLUS_EXPR)
364             /* NAME < NAME + CST  */
365             return -1;
366           else if (TREE_CODE (val2) == MINUS_EXPR)
367             /* NAME > NAME - CST  */
368             return 1;
369         }
370       else if (TREE_CODE (val1) == PLUS_EXPR)
371         {
372           if (TREE_CODE (val2) == SSA_NAME)
373             /* NAME + CST > NAME  */
374             return 1;
375           else if (TREE_CODE (val2) == PLUS_EXPR)
376             /* NAME + CST1 > NAME + CST2, if CST1 > CST2  */
377             return compare_values (c1, c2);
378           else if (TREE_CODE (val2) == MINUS_EXPR)
379             /* NAME + CST1 > NAME - CST2  */
380             return 1;
381         }
382       else if (TREE_CODE (val1) == MINUS_EXPR)
383         {
384           if (TREE_CODE (val2) == SSA_NAME)
385             /* NAME - CST < NAME  */
386             return -1;
387           else if (TREE_CODE (val2) == PLUS_EXPR)
388             /* NAME - CST1 < NAME + CST2  */
389             return -1;
390           else if (TREE_CODE (val2) == MINUS_EXPR)
391             /* NAME - CST1 > NAME - CST2, if CST1 < CST2.  Notice that
392                C1 and C2 are swapped in the call to compare_values.  */
393             return compare_values (c2, c1);
394         }
395
396       gcc_unreachable ();
397     }
398
399   /* We cannot compare non-constants.  */
400   if (!is_gimple_min_invariant (val1) || !is_gimple_min_invariant (val2))
401     return -2;
402
403   if (!POINTER_TYPE_P (TREE_TYPE (val1)))
404     return tree_int_cst_compare (val1, val2);
405   else
406     {
407       tree t;
408
409       /* First see if VAL1 and VAL2 are not the same.  */
410       if (val1 == val2 || operand_equal_p (val1, val2, 0))
411         return 0;
412       
413       /* If VAL1 is a lower address than VAL2, return -1.  */
414       t = fold (build2 (LT_EXPR, TREE_TYPE (val1), val1, val2));
415       if (t == boolean_true_node)
416         return -1;
417
418       /* If VAL1 is a higher address than VAL2, return +1.  */
419       t = fold (build2 (GT_EXPR, TREE_TYPE (val1), val1, val2));
420       if (t == boolean_true_node)
421         return 1;
422
423       /* If VAL1 is different than VAL2, return +2.  */
424       t = fold (build2 (NE_EXPR, TREE_TYPE (val1), val1, val2));
425       if (t == boolean_true_node)
426         return 2;
427
428       return -2;
429     }
430 }
431
432
433 /* Return 1 if VAL is inside value range VR (VR->MIN <= VAL <= VR->MAX),
434           0 if VAL is not inside VR,
435          -2 if we cannot tell either way.  */
436
437 static inline int
438 value_inside_range (tree val, value_range *vr)
439 {
440   int cmp1, cmp2;
441
442   cmp1 = compare_values (val, vr->min);
443   if (cmp1 == -2 || cmp1 == 2)
444     return -2;
445
446   cmp2 = compare_values (val, vr->max);
447   if (cmp2 == -2 || cmp2 == 2)
448     return -2;
449
450   return (cmp1 == 0 || cmp1 == 1) && (cmp2 == -1 || cmp2 == 0);
451 }
452
453
454 /* Return true if value ranges VR0 and VR1 have a non-empty
455    intersection.  */
456
457 static inline bool
458 value_ranges_intersect_p (value_range *vr0, value_range *vr1)
459 {
460   return (value_inside_range (vr1->min, vr0) == 1
461           || value_inside_range (vr1->max, vr0) == 1
462           || value_inside_range (vr0->min, vr1) == 1
463           || value_inside_range (vr0->max, vr1) == 1);
464 }
465
466
467 /* Extract value range information from an ASSERT_EXPR EXPR and store
468    it in *VR_P.  */
469
470 static void
471 extract_range_from_assert (value_range *vr_p, tree expr)
472 {
473   tree var, cond, limit, type;
474   value_range *var_vr;
475
476   var = ASSERT_EXPR_VAR (expr);
477   cond = ASSERT_EXPR_COND (expr);
478
479   gcc_assert (TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison);
480
481   /* Find VAR in the ASSERT_EXPR conditional.  */
482   limit = get_opposite_operand (cond, var);
483   type = TREE_TYPE (limit);
484
485   gcc_assert (limit != var);
486
487   /* For pointer arithmetic, we only keep track of anti-ranges
488      (NE_EXPR).  Notice that we don't need to handle EQ_EXPR in these
489      cases because assertions with equalities are never generated.
490      The assert pass generates straight assignments in those cases.  */
491   if (POINTER_TYPE_P (type) && TREE_CODE (cond) != NE_EXPR)
492     {
493       set_value_range (vr_p, VR_VARYING, NULL_TREE, NULL_TREE);
494       return;
495     }
496
497   if (TREE_CODE (cond) == NE_EXPR)
498     set_value_range (vr_p, VR_ANTI_RANGE, limit, limit);
499   else if (TREE_CODE (cond) == LE_EXPR)
500     set_value_range (vr_p, VR_RANGE, TYPE_MIN_VALUE (type), limit);
501   else if (TREE_CODE (cond) == LT_EXPR)
502     {
503       tree one = build_int_cst (type, 1);
504       set_value_range (vr_p, VR_RANGE, TYPE_MIN_VALUE (type),
505                        fold (build (MINUS_EXPR, type, limit, one)));
506     }
507   else if (TREE_CODE (cond) == GE_EXPR)
508     set_value_range (vr_p, VR_RANGE, limit, TYPE_MAX_VALUE (type));
509   else if (TREE_CODE (cond) == GT_EXPR)
510     {
511       tree one = build_int_cst (type, 1);
512       set_value_range (vr_p, VR_RANGE,
513                        fold (build (PLUS_EXPR, type, limit, one)),
514                        TYPE_MAX_VALUE (type));
515     }
516   else
517     gcc_unreachable ();
518
519   /* If VAR already has a known range and the two ranges have a
520      non-empty intersection, we can refine the resulting range.
521      Since the assert expression creates an equivalency and at the
522      same time it asserts a predicate, we can take the intersection of
523      the two ranges to get better precision.  */
524   var_vr = get_value_range (var);
525   if (var_vr->type == VR_RANGE
526       && vr_p->type == VR_RANGE
527       && value_ranges_intersect_p (var_vr, vr_p))
528     {
529       tree min, max;
530
531       /* Use the larger of the two minimums.  */
532       if (compare_values (vr_p->min, var_vr->min) == -1)
533         min = var_vr->min;
534       else
535         min = vr_p->min;
536
537       /* Use the smaller of the two maximums.  */
538       if (compare_values (vr_p->max, var_vr->max) == 1)
539         max = var_vr->max;
540       else
541         max = vr_p->max;
542
543       set_value_range (vr_p, vr_p->type, min, max);
544     }
545 }
546
547
548 /* Extract range information from SSA name VAR and store it in VR.  If
549    VAR has an interesting range, use it.  Otherwise, create the
550    range [VAR, VAR] and return it.  This is useful in situations where
551    we may have conditionals testing values of VARYING names.  For
552    instance,
553
554         x_3 = y_5;
555         if (x_3 > y_5)
556           ...
557
558     Even if y_5 is deemed VARYING, we can determine that x_3 > y_5 is
559     always false.  */
560
561 static void
562 extract_range_from_ssa_name (value_range *vr, tree var)
563 {
564   value_range *var_vr = get_value_range (var);
565
566   if (var_vr->type != VR_UNDEFINED && var_vr->type != VR_VARYING)
567     *vr = *var_vr;
568   else
569     set_value_range (vr, VR_RANGE, var, var);
570 }
571
572
573 /* Extract range information from a binary expression EXPR based on
574    the ranges of each of its operands and the expression code.  */
575
576 static void
577 extract_range_from_binary_expr (value_range *vr, tree expr)
578 {
579   enum tree_code code = TREE_CODE (expr);
580   tree op0, op1, min, max;
581   value_range vr0, vr1;
582   int cmp;
583
584   /* Not all binary expressions can be applied to ranges in a
585      meaningful way.  Handle only arithmetic operations.  */
586   if (code != PLUS_EXPR
587       && code != MINUS_EXPR
588       && code != MULT_EXPR
589       && code != TRUNC_DIV_EXPR
590       && code != FLOOR_DIV_EXPR
591       && code != CEIL_DIV_EXPR
592       && code != EXACT_DIV_EXPR
593       && code != ROUND_DIV_EXPR
594       && code != MIN_EXPR
595       && code != MAX_EXPR)
596     {
597       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
598       return;
599     }
600
601   /* Get value ranges for each operand.  For constant operands, create
602      a new value range with the operand to simplify processing.  */
603   op0 = TREE_OPERAND (expr, 0);
604   if (TREE_CODE (op0) == SSA_NAME)
605     vr0 = *(get_value_range (op0));
606   else
607     {
608       if (is_gimple_min_invariant (op0))
609         set_value_range (&vr0, VR_RANGE, op0, op0);
610       else
611         set_value_range (&vr0, VR_VARYING, NULL_TREE, NULL_TREE);
612     }
613
614   op1 = TREE_OPERAND (expr, 1);
615   if (TREE_CODE (op1) == SSA_NAME)
616     vr1 = *(get_value_range (op1));
617   else
618     {
619       if (is_gimple_min_invariant (op1))
620         set_value_range (&vr1, VR_RANGE, op1, op1);
621       else
622         set_value_range (&vr1, VR_VARYING, 0, 0);
623     }
624
625   /* If either range is UNDEFINED, so is the result.  */
626   if (vr0.type == VR_UNDEFINED || vr1.type == VR_UNDEFINED)
627     {
628       set_value_range (vr, VR_UNDEFINED, NULL_TREE, NULL_TREE);
629       return;
630     }
631
632   /* If either range is VARYING, so is the result.  */
633   if (vr0.type == VR_VARYING || vr1.type == VR_VARYING)
634     {
635       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
636       return;
637     }
638
639   /* If the ranges are of different types, the result is VARYING.  */
640   if (vr0.type != vr1.type)
641     {
642       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
643       return;
644     }
645
646   /* TODO.  Refuse to do any symbolic range operations for now.  */
647   if (symbolic_range_p (&vr0) || symbolic_range_p (&vr1))
648     {
649       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
650       return;
651     }
652
653   /* Now evaluate the expression to determine the new range.  */
654   if (POINTER_TYPE_P (TREE_TYPE (expr))
655       || POINTER_TYPE_P (TREE_TYPE (op0))
656       || POINTER_TYPE_P (TREE_TYPE (op1)))
657     {
658       /* For pointer types, we are really only interested in asserting
659          whether the expression evaluates to non-NULL.  FIXME.  We
660          used to gcc_assert (code == PLUS_EXPR || code == MINUS_EXPR),
661          but ivopts is generating expressions with pointer
662          multiplication in them.  */
663       if (code == PLUS_EXPR)
664         {
665           /* Assume that pointers can never wrap around.  FIXME, Is
666              this always safe?  */
667           tree zero = build_int_cst (TREE_TYPE (expr), 0);
668           set_value_range (vr, VR_ANTI_RANGE, zero, zero);
669         }
670       else
671         {
672           /* Subtracting from a pointer, may yield 0, so just drop the
673              resulting range to varying.  */
674           set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
675         }
676
677       return;
678     }
679
680   /* For integer ranges, apply the operation to each end of the
681      range and see what we end up with.  */
682   if (code == PLUS_EXPR
683       || code == MULT_EXPR
684       || code == MIN_EXPR
685       || code == MAX_EXPR)
686     {
687       /* For operations that make the resulting range directly
688          proportional to the original ranges, apply the operation to
689          the same end of each range.  */
690       min = int_const_binop (code, vr0.min, vr1.min, 0);
691       max = int_const_binop (code, vr0.max, vr1.max, 0);
692     }
693   else
694     {
695       /* For operations that make the resulting range inversely
696          proportional to the original ranges (-, /), apply the
697          operation to the opposite ends of each range.  */
698       min = int_const_binop (code, vr0.min, vr1.max, 0);
699       max = int_const_binop (code, vr0.max, vr1.min, 0);
700     }
701
702   cmp = compare_values (min, max);
703   if (cmp == -2 || cmp == 1)
704     {
705       /* If the new range has its limits swapped around (MIN > MAX),
706          then the operation caused one of them to wrap around, mark
707          the new range VARYING.  */
708       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
709     }
710   else
711     set_value_range (vr, vr0.type, min, max);
712 }
713
714
715 /* Extract range information from a unary expression EXPR based on
716    the range of its operand and the expression code.  */
717
718 static void
719 extract_range_from_unary_expr (value_range *vr, tree expr)
720 {
721   enum tree_code code = TREE_CODE (expr);
722   tree min, max, op0;
723   value_range vr0;
724   int cmp;
725
726   /* Get value ranges for the operand.  For constant operands, create
727      a new value range with the operand to simplify processing.  */
728   op0 = TREE_OPERAND (expr, 0);
729   if (TREE_CODE (op0) == SSA_NAME)
730     vr0 = *(get_value_range (op0));
731   else
732     {
733       if (is_gimple_min_invariant (op0))
734         set_value_range (&vr0, VR_RANGE, op0, op0);
735       else
736         set_value_range (&vr0, VR_VARYING, NULL_TREE, NULL_TREE);
737     }
738
739   /* If VR0 is UNDEFINED, so is the result.  */
740   if (vr0.type == VR_UNDEFINED)
741     {
742       set_value_range (vr, VR_UNDEFINED, NULL_TREE, NULL_TREE);
743       return;
744     }
745
746   /* If VR0 is VARYING, so is the result.  */
747   if (vr0.type == VR_VARYING)
748     {
749       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
750       return;
751     }
752
753   /* TODO.  Refuse to do any symbolic range operations for now.  */
754   if (symbolic_range_p (&vr0))
755     {
756       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
757       return;
758     }
759
760   /* If the operand is neither a pointer nor an integral type, set the
761      range to VARYING.  TODO, we may set the range to non-zero.  */
762   if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
763       && !POINTER_TYPE_P (TREE_TYPE (op0)))
764     {
765       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
766       return;
767     }
768
769   /* If the expression involves pointers, we are only interested in
770      determining if it evaluates to NULL [0, 0] or non-NULL (~[0, 0]).  */
771   if (POINTER_TYPE_P (TREE_TYPE (expr)) || POINTER_TYPE_P (TREE_TYPE (op0)))
772     {
773       if (range_is_nonnull (&vr0) || expr_computes_nonzero (expr))
774         set_value_range_to_nonnull (vr, TREE_TYPE (expr));
775       else if (range_is_null (&vr0))
776         set_value_range_to_null (vr, TREE_TYPE (expr));
777       else
778         set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
779
780       return;
781     }
782
783   /* Handle unary expressions on integer ranges.  */
784   if ((code == NOP_EXPR || code == CONVERT_EXPR)
785       && (TYPE_SIZE (TREE_TYPE (vr0.min)) != TYPE_SIZE (TREE_TYPE (expr))))
786     {
787       /* When converting types of different sizes, set the result to
788          VARYING.  Things like sign extensions and precision loss may
789          change the range.  For instance, if x_3 is of type 'long long
790          int' and 'y_5 = (unsigned short) x_3', if x_3 is ~[0, 0], it
791          is impossible to know at compile time whether y_5 will be
792          ~[0, 0].  */
793       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
794       return;
795     }
796
797   /* Apply the operation to each end of the range and see what we end
798      up with.  */
799   min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
800   max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
801
802   cmp = compare_values (min, max);
803   if (cmp == -2 || cmp == 1)
804     {
805       /* If the new range has its limits swapped around (MIN > MAX),
806          then the operation caused one of them to wrap around, mark
807          the new range VARYING.  */
808       set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
809     }
810   else
811     set_value_range (vr, vr0.type, min, max);
812 }
813
814
815 /* Try to compute a useful range out of expression EXPR and store it
816    in *VR_P.  */
817
818 static void
819 extract_range_from_expr (value_range *vr, tree expr)
820 {
821   enum tree_code code = TREE_CODE (expr);
822
823   if (code == ASSERT_EXPR)
824     extract_range_from_assert (vr, expr);
825   else if (code == SSA_NAME)
826     extract_range_from_ssa_name (vr, expr);
827   else if (TREE_CODE_CLASS (code) == tcc_binary)
828     extract_range_from_binary_expr (vr, expr);
829   else if (TREE_CODE_CLASS (code) == tcc_unary)
830     extract_range_from_unary_expr (vr, expr);
831   else if (expr_computes_nonzero (expr))
832     set_value_range_to_nonnull (vr, TREE_TYPE (expr));
833   else
834     set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
835 }
836
837
838 /* Given a range VR, a loop L and a variable VAR, determine whether it
839    would be profitable to adjust VR using scalar evolution information
840    for VAR.  If so, update VR with the new limits.  */
841
842 static void
843 adjust_range_with_scev (value_range *vr, struct loop *l, tree var)
844 {
845   tree init, step, chrec;
846   bool init_is_max;
847
848   /* TODO.  Don't adjust anti-ranges.  An anti-range may provide
849      better opportunities than a regular range, but I'm not sure.  */
850   if (vr->type == VR_ANTI_RANGE)
851     return;
852
853   chrec = analyze_scalar_evolution (l, var);
854   if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
855     return;
856
857   init = CHREC_LEFT (chrec);
858   step = CHREC_RIGHT (chrec);
859
860   /* If STEP is symbolic, we can't know whether INIT will be the
861      minimum or maximum value in the range.  */
862   if (!is_gimple_min_invariant (step))
863     return;
864
865   /* FIXME.  When dealing with unsigned types,
866      analyze_scalar_evolution sets STEP to very large unsigned values
867      when the evolution goes backwards.  This confuses this analysis
868      because we think that INIT is the smallest value that the range
869      can take, instead of the largest.  Ignore these chrecs for now.  */
870   if (INTEGRAL_TYPE_P (TREE_TYPE (step)) && TYPE_UNSIGNED (TREE_TYPE (step)))
871     return;
872
873   /* If STEP is negative, then INIT is the maximum value the range
874      will take.  Otherwise, INIT is the minimum value.  */
875   init_is_max = (tree_int_cst_sgn (step) < 0);
876
877   if (!POINTER_TYPE_P (TREE_TYPE (init))
878       && (vr->type == VR_VARYING || vr->type == VR_UNDEFINED))
879     {
880       /* For VARYING or UNDEFINED ranges, just about anything we get
881          from scalar evolutions should be better.  */
882       if (init_is_max)
883         set_value_range (vr, VR_RANGE, TYPE_MIN_VALUE (TREE_TYPE (init)), init);
884       else
885         set_value_range (vr, VR_RANGE, init, TYPE_MAX_VALUE (TREE_TYPE (init)));
886     }
887   else if (vr->type == VR_RANGE)
888     {
889       if (init_is_max)
890         {
891           /* INIT is the maximum value.  If INIT is lower than
892              VR->MAX, set VR->MAX to INIT.  */
893           if (compare_values (init, vr->max) == -1)
894             set_value_range (vr, VR_RANGE, vr->min, init);
895         }
896       else
897         {
898           /* If INIT is bigger than VR->MIN, set VR->MIN to INIT.  */
899           if (compare_values (init, vr->min) == 1)
900             set_value_range (vr, VR_RANGE, init, vr->max);
901         }
902     }
903 }
904
905
906 /* Given two numeric value ranges VR0, VR1 and a comparison code COMP:
907    
908    - Return BOOLEAN_TRUE_NODE if VR0 COMP VR1 always returns true for all the
909      values in the ranges.
910
911    - Return BOOLEAN_FALSE_NODE if the comparison always returns false.
912
913    - Return NULL_TREE if it is not always possible to determine the value of
914      the comparison.  */
915
916 static tree
917 compare_ranges (enum tree_code comp, value_range *vr0, value_range *vr1)
918 {
919   /* VARYING or UNDEFINED ranges cannot be compared.  */
920   if (vr0->type == VR_VARYING
921       || vr0->type == VR_UNDEFINED
922       || vr1->type == VR_VARYING
923       || vr1->type == VR_UNDEFINED)
924     return NULL_TREE;
925
926   /* Anti-ranges need to be handled separately.  */
927   if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
928     {
929       /* If both are anti-ranges, then we cannot compute any
930          comparison.  */
931       if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
932         return NULL_TREE;
933
934       /* These comparisons are never statically computable.  */
935       if (comp == GT_EXPR
936           || comp == GE_EXPR
937           || comp == LT_EXPR
938           || comp == LE_EXPR)
939         return NULL_TREE;
940
941       /* Equality can be computed only between a range and an
942          anti-range.  ~[VAL1, VAL2] == [VAL1, VAL2] is always false.  */
943       if (vr0->type == VR_RANGE)
944         {
945           /* To simplify processing, make VR0 the anti-range.  */
946           value_range *tmp = vr0;
947           vr0 = vr1;
948           vr1 = tmp;
949         }
950
951       gcc_assert (comp == NE_EXPR || comp == EQ_EXPR);
952
953       if (compare_values (vr0->min, vr1->min) == 0
954           && compare_values (vr0->max, vr1->max) == 0)
955         return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
956
957       return NULL_TREE;
958     }
959
960   /* Simplify processing.  If COMP is GT_EXPR or GE_EXPR, switch the
961      operands around and change the comparison code.  */
962   if (comp == GT_EXPR || comp == GE_EXPR)
963     {
964       value_range *tmp;
965       comp = (comp == GT_EXPR) ? LT_EXPR : LE_EXPR;
966       tmp = vr0;
967       vr0 = vr1;
968       vr1 = tmp;
969     }
970
971   if (comp == EQ_EXPR)
972     {
973       /* Equality may only be computed if both ranges represent
974          exactly one value.  */
975       if (compare_values (vr0->min, vr0->max) == 0
976           && compare_values (vr1->min, vr1->max) == 0)
977         {
978           int cmp_min = compare_values (vr0->min, vr1->min);
979           int cmp_max = compare_values (vr0->max, vr1->max);
980           if (cmp_min == 0 && cmp_max == 0)
981             return boolean_true_node;
982           else if (cmp_min != -2 && cmp_max != -2)
983             return boolean_false_node;
984         }
985
986       return NULL_TREE;
987     }
988   else if (comp == NE_EXPR)
989     {
990       int cmp1, cmp2;
991
992       /* If VR0 is completely to the left or completely to the right
993          of VR1, they are always different.  Notice that we need to
994          make sure that both comparisons yield similar results to
995          avoid comparing values that cannot be compared at
996          compile-time.  */
997       cmp1 = compare_values (vr0->max, vr1->min);
998       cmp2 = compare_values (vr0->min, vr1->max);
999       if ((cmp1 == -1 && cmp2 == -1) || (cmp1 == 1 && cmp2 == 1))
1000         return boolean_true_node;
1001
1002       /* If VR0 and VR1 represent a single value and are identical,
1003          return false.  */
1004       else if (compare_values (vr0->min, vr0->max) == 0
1005                && compare_values (vr1->min, vr1->max) == 0
1006                && compare_values (vr0->min, vr1->min) == 0
1007                && compare_values (vr0->max, vr1->max) == 0)
1008         return boolean_false_node;
1009
1010       /* Otherwise, they may or may not be different.  */
1011       else
1012         return NULL_TREE;
1013     }
1014   else if (comp == LT_EXPR || comp == LE_EXPR)
1015     {
1016       int tst;
1017
1018       /* If VR0 is to the left of VR1, return true.  */
1019       tst = compare_values (vr0->max, vr1->min);
1020       if ((comp == LT_EXPR && tst == -1)
1021           || (comp == LE_EXPR && (tst == -1 || tst == 0)))
1022         return boolean_true_node;
1023
1024       /* If VR0 is to the right of VR1, return false.  */
1025       tst = compare_values (vr0->min, vr1->max);
1026       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
1027           || (comp == LE_EXPR && tst == 1))
1028         return boolean_false_node;
1029
1030       /* Otherwise, we don't know.  */
1031       return NULL_TREE;
1032     }
1033     
1034   gcc_unreachable ();
1035 }
1036
1037
1038 /* Given a value range VR, a value VAL and a comparison code COMP, return
1039    BOOLEAN_TRUE_NODE if VR COMP VR1 always returns true for all the
1040    values in VR.  Return BOOLEAN_FALSE_NODE if the comparison
1041    always returns false.  Return NULL_TREE if it is not always
1042    possible to determine the value of the comparison.  */
1043
1044 static tree
1045 compare_range_with_value (enum tree_code comp, value_range *vr, tree val)
1046 {
1047   if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
1048     return NULL_TREE;
1049
1050   /* Anti-ranges need to be handled separately.  */
1051   if (vr->type == VR_ANTI_RANGE)
1052     {
1053       /* For anti-ranges, the only predicates that we can compute at
1054          compile time are equality and inequality.  */
1055       if (comp == GT_EXPR
1056           || comp == GE_EXPR
1057           || comp == LT_EXPR
1058           || comp == LE_EXPR)
1059         return NULL_TREE;
1060
1061       /* ~[VAL, VAL] == VAL is always false.  */
1062       if (compare_values (vr->min, val) == 0
1063           && compare_values (vr->max, val) == 0)
1064         return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
1065
1066       return NULL_TREE;
1067     }
1068
1069   if (comp == EQ_EXPR)
1070     {
1071       /* EQ_EXPR may only be computed if VR represents exactly
1072          one value.  */
1073       if (compare_values (vr->min, vr->max) == 0)
1074         {
1075           int cmp = compare_values (vr->min, val);
1076           if (cmp == 0)
1077             return boolean_true_node;
1078           else if (cmp == -1 || cmp == 1 || cmp == 2)
1079             return boolean_false_node;
1080         }
1081
1082       return NULL_TREE;
1083     }
1084   else if (comp == NE_EXPR)
1085     {
1086       /* If VAL is not inside VR, then they are always different.  */
1087       if (compare_values (vr->max, val) == -1
1088           || compare_values (vr->min, val) == 1)
1089         return boolean_true_node;
1090
1091       /* If VR represents exactly one value equal to VAL, then return
1092          false.  */
1093       if (compare_values (vr->min, vr->max) == 0
1094           && compare_values (vr->min, val) == 0)
1095         return boolean_false_node;
1096
1097       /* Otherwise, they may or may not be different.  */
1098       return NULL_TREE;
1099     }
1100   else if (comp == LT_EXPR || comp == LE_EXPR)
1101     {
1102       int tst;
1103
1104       /* If VR is to the left of VAL, return true.  */
1105       tst = compare_values (vr->max, val);
1106       if ((comp == LT_EXPR && tst == -1)
1107           || (comp == LE_EXPR && (tst == -1 || tst == 0)))
1108         return boolean_true_node;
1109
1110       /* If VR is to the right of VAL, return false.  */
1111       tst = compare_values (vr->min, val);
1112       if ((comp == LT_EXPR && (tst == 0 || tst == 1))
1113           || (comp == LE_EXPR && tst == 1))
1114         return boolean_false_node;
1115
1116       /* Otherwise, we don't know.  */
1117       return NULL_TREE;
1118     }
1119   else if (comp == GT_EXPR || comp == GE_EXPR)
1120     {
1121       int tst;
1122
1123       /* If VR is to the right of VAL, return true.  */
1124       tst = compare_values (vr->min, val);
1125       if ((comp == GT_EXPR && tst == 1)
1126           || (comp == GE_EXPR && (tst == 0 || tst == 1)))
1127         return boolean_true_node;
1128
1129       /* If VR is to the left of VAL, return false.  */
1130       tst = compare_values (vr->max, val);
1131       if ((comp == GT_EXPR && (tst == -1 || tst == 0))
1132           || (comp == GE_EXPR && tst == -1))
1133         return boolean_false_node;
1134
1135       /* Otherwise, we don't know.  */
1136       return NULL_TREE;
1137     }
1138
1139   gcc_unreachable ();
1140 }
1141
1142
1143 /* Debugging dumps.  */
1144
1145 void
1146 dump_value_range (FILE *file, value_range *vr)
1147 {
1148   if (vr == NULL)
1149     fprintf (file, "[]");
1150   else if (vr->type == VR_UNDEFINED)
1151     fprintf (file, "UNDEFINED");
1152   else if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
1153     {
1154       fprintf (file, "%s[", (vr->type == VR_ANTI_RANGE) ? "~" : "");
1155       print_generic_expr (file, vr->min, 0);
1156       fprintf (file, ", ");
1157       print_generic_expr (file, vr->max, 0);
1158       fprintf (file, "]");
1159     }
1160   else if (vr->type == VR_VARYING)
1161     fprintf (file, "VARYING");
1162   else
1163     fprintf (file, "INVALID RANGE");
1164 }
1165
1166
1167 /* Dump value range VR to stderr.  */
1168
1169 void
1170 debug_value_range (value_range *vr)
1171 {
1172   dump_value_range (stderr, vr);
1173 }
1174
1175
1176 /* Dump value ranges of all SSA_NAMEs to FILE.  */
1177
1178 void
1179 dump_all_value_ranges (FILE *file)
1180 {
1181   size_t i;
1182
1183   for (i = 0; i < num_ssa_names; i++)
1184     {
1185       tree var = ssa_name (i);
1186       if (var && SSA_NAME_VALUE_RANGE (var))
1187         {
1188           print_generic_expr (file, var, 0);
1189           fprintf (file, ": ");
1190           dump_value_range (file, SSA_NAME_VALUE_RANGE (var));
1191           fprintf (file, "\n");
1192         }
1193     }
1194
1195   fprintf (file, "\n");
1196 }
1197
1198
1199 /* Dump all value ranges to stderr.  */
1200
1201 void
1202 debug_all_value_ranges (void)
1203 {
1204   dump_all_value_ranges (stderr);
1205 }
1206
1207
1208 /*---------------------------------------------------------------------------
1209                             Value Range Propagation
1210 ---------------------------------------------------------------------------*/
1211
1212 /* Given a COND_EXPR COND of the form 'V OP W', and an SSA name V,
1213    create a new SSA name N and return the assertion assignment
1214    'V = ASSERT_EXPR <V, V OP W>'.  */
1215
1216 static tree
1217 build_assert_expr_for (tree cond, tree v)
1218 {
1219   tree n, assertion;
1220
1221   gcc_assert (TREE_CODE (v) == SSA_NAME);
1222   n = duplicate_ssa_name (v, NULL_TREE);
1223
1224   if (TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison)
1225     {
1226       /* Build N = ASSERT_EXPR <V, COND>.  As a special case, if the
1227          conditional is an EQ_EXPR (V == Z), just build the assignment
1228          N = Z.  */
1229       if (TREE_CODE (cond) == EQ_EXPR)
1230         {
1231           tree other = get_opposite_operand (cond, v);
1232           assertion = build (MODIFY_EXPR, TREE_TYPE (v), n, other);
1233         }
1234       else
1235         assertion = build (MODIFY_EXPR, TREE_TYPE (v), n,
1236                            build (ASSERT_EXPR, TREE_TYPE (v), v, cond));
1237     }
1238   else if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
1239     {
1240       /* Given !V, build the assignment N = false.  */
1241       tree op0 = TREE_OPERAND (cond, 0);
1242       gcc_assert (op0 == v);
1243       assertion = build (MODIFY_EXPR, TREE_TYPE (v), n, boolean_false_node);
1244     }
1245   else if (TREE_CODE (cond) == SSA_NAME)
1246     {
1247       /* Given V, build the assignment N = true.  */
1248       gcc_assert (v == cond);
1249       assertion = build (MODIFY_EXPR, TREE_TYPE (v), n, boolean_true_node);
1250     }
1251   else
1252     gcc_unreachable ();
1253
1254   SSA_NAME_DEF_STMT (n) = assertion;
1255
1256   /* The new ASSERT_EXPR, creates a new SSA name that replaces the
1257      operand of the ASSERT_EXPR. Register the new name and the old one
1258      in the replacement table so that we can fix the SSA web after
1259      adding all the ASSERT_EXPRs.  */
1260   register_new_name_mapping (n, v);
1261
1262   return assertion;
1263 }
1264
1265
1266 /* Return false if EXPR is a predicate expression involving floating
1267    point values.  */
1268
1269 static inline bool
1270 fp_predicate (tree expr)
1271 {
1272   return TREE_CODE_CLASS (TREE_CODE (expr)) == tcc_comparison
1273          && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 0)));
1274 }
1275
1276
1277 /* Return an expression predicate that represents the range of values
1278    that can be taken by operand OP after STMT executes.  */
1279
1280 static tree
1281 infer_value_range (tree stmt, tree op)
1282 {
1283   /* Do not attempt to infer anything in names that flow through
1284      abnormal edges.  */
1285   if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
1286     return NULL_TREE;
1287
1288   if (POINTER_TYPE_P (TREE_TYPE (op)))
1289     {
1290       bool is_store;
1291       unsigned num_uses, num_derefs;
1292
1293       count_uses_and_derefs (op, stmt, &num_uses, &num_derefs, &is_store);
1294       if (num_derefs > 0 && flag_delete_null_pointer_checks)
1295         {
1296           /* We can only assume that a pointer dereference will yield
1297              non-NULL if -fdelete-null-pointer-checks is enabled.  */
1298           tree null = build_int_cst (TREE_TYPE (op), 0);
1299           tree t = build (NE_EXPR, boolean_type_node, op, null);
1300           return t;
1301         }
1302     }
1303
1304   return NULL_TREE;
1305 }
1306
1307
1308 /* Return true if OP is the result of an ASSERT_EXPR that tests the
1309    same condition as COND.  */
1310
1311 static bool
1312 has_assert_expr (tree op, tree cond)
1313 {
1314   tree def_stmt = SSA_NAME_DEF_STMT (op);
1315   tree assert_expr, other_cond, other_op;
1316
1317   /* If OP was not generated by an ASSERT_EXPR, return false.  */
1318   if (TREE_CODE (def_stmt) != MODIFY_EXPR
1319       || TREE_CODE (TREE_OPERAND (def_stmt, 1)) != ASSERT_EXPR)
1320     return false;
1321
1322   assert_expr = TREE_OPERAND (def_stmt, 1);
1323   other_cond = ASSERT_EXPR_COND (assert_expr);
1324   other_op = ASSERT_EXPR_VAR (assert_expr);
1325
1326   if (TREE_CODE (cond) == TREE_CODE (other_cond))
1327     {
1328       tree t1, t2;
1329
1330       /* If COND is not a comparison predicate, something is wrong.  */
1331       gcc_assert (TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison);
1332
1333       /* Note that we only need to compare against one of the operands
1334          of OTHER_COND.  
1335          
1336          Suppose that we are about to insert the assertion ASSERT_EXPR
1337          <x_4, x_4 != 0> and the defining statement for x_4 is x_4 =
1338          ASSERT_EXPR <x_3, x_3 != 0>.
1339
1340          In this case, we don't really want to insert a new
1341          ASSERT_EXPR for x_4 because that would be redundant.  We
1342          already know that x_4 is not 0.  So, when comparing the
1343          conditionals 'x_3 != 0' and 'x_4 != 0', we don't want to
1344          compare x_3 and x_4, we just want to compare the predicate's
1345          code (!=) and the other operand (0).  */
1346       if (TREE_OPERAND (cond, 0) == op)
1347         t1 = TREE_OPERAND (cond, 1);
1348       else
1349         t1 = TREE_OPERAND (cond, 0);
1350
1351       if (TREE_OPERAND (other_cond, 0) == other_op)
1352         t2 = TREE_OPERAND (other_cond, 1);
1353       else
1354         t2 = TREE_OPERAND (other_cond, 0);
1355
1356       return (t1 == t2 || operand_equal_p (t1, t2, 0));
1357     }
1358
1359   return false;
1360 }
1361
1362
1363 /* Traverse all the statements in block BB looking for used variables.
1364    Variables used in BB are added to bitmap FOUND.  The algorithm
1365    works in three main parts:
1366
1367    1- For every statement S in BB, all the variables used by S are
1368       added to bitmap FOUND.
1369
1370    2- If statement S uses an operand N in a way that exposes a known
1371       value range for N, then if N was not already generated by an
1372       ASSERT_EXPR, create a new ASSERT_EXPR for N.  For instance, if N
1373       is a pointer and the statement dereferences it, we can assume
1374       that N is not NULL.
1375
1376    3- COND_EXPRs are a special case of #2.  We can derive range
1377       information from the predicate but need to insert different
1378       ASSERT_EXPRs for each of the sub-graphs rooted at the
1379       conditional block.  If the last statement of BB is a conditional
1380       expression of the form 'X op Y', then
1381
1382       a) Remove X and Y from the set FOUND.
1383
1384       b) If the conditional dominates its THEN_CLAUSE sub-graph,
1385          recurse into it.  On return, if X and/or Y are marked in
1386          FOUND, then an ASSERT_EXPR is added for the corresponding
1387          variable.
1388
1389       c) Repeat step (b) on the ELSE_CLAUSE.
1390
1391       d) Mark X and Y in FOUND.
1392
1393    4- If BB does not end in a conditional expression, then we recurse
1394       into BB's dominator children.
1395    
1396    At the end of the recursive traversal, ASSERT_EXPRs will have been
1397    added to the edges of COND_EXPR blocks that have sub-graphs using
1398    one or both predicate operands.  For instance,
1399
1400         if (a == 9)
1401           b = a;
1402         else
1403           b = c + 1;
1404
1405    In this case, an assertion on the THEN clause is useful to
1406    determine that 'a' is always 9 on that edge.  However, an assertion
1407    on the ELSE clause would be unnecessary.
1408
1409    On exit from this function, all the names created by the newly
1410    inserted ASSERT_EXPRs need to be added to the SSA web by rewriting
1411    the SSA names that they replace.
1412    
1413    TODO.  Handle SWITCH_EXPR.  */
1414
1415 static bool
1416 maybe_add_assert_expr (basic_block bb)
1417 {
1418   block_stmt_iterator si;
1419   tree last;
1420   bool added;
1421   use_optype uses;
1422
1423   /* Step 1.  Mark all the SSA names used in BB in bitmap FOUND.  */
1424   added = false;
1425   last = NULL_TREE;
1426   for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1427     {
1428       tree stmt, op;
1429       ssa_op_iter i;
1430       
1431       stmt = bsi_stmt (si);
1432       get_stmt_operands (stmt);
1433
1434       /* Mark all the SSA names used by STMT in bitmap FOUND.  If STMT
1435          is inside the sub-graph of a conditional block, when we
1436          return from this recursive walk, our parent will use the
1437          FOUND bitset to determine if one of the operands it was
1438          looking for was present in the sub-graph.  */
1439       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
1440         {
1441           tree cond;
1442
1443           SET_BIT (found, SSA_NAME_VERSION (op));
1444
1445           cond = infer_value_range (stmt, op);
1446           if (!cond)
1447             continue;
1448
1449           /* Step 2.  If OP is used in such a way that we can infer a
1450              value range for it, create a new ASSERT_EXPR for OP
1451              (unless OP already has an ASSERT_EXPR).  */
1452           gcc_assert (!is_ctrl_stmt (stmt));
1453
1454           if (has_assert_expr (op, cond))
1455             continue;
1456
1457           if (!stmt_ends_bb_p (stmt))
1458             {
1459               /* If STMT does not end the block, we can insert the new
1460                  assertion right after it.  */
1461               tree t = build_assert_expr_for (cond, op);
1462               bsi_insert_after (&si, t, BSI_NEW_STMT);
1463               added = true;
1464             }
1465           else
1466             {
1467               /* STMT must be the last statement in BB.  We can only
1468                  insert new assertions on the non-abnormal edge out of
1469                  BB.  Note that since STMT is not control flow, there
1470                  may only be one non-abnormal edge out of BB.  */
1471               edge_iterator ei;
1472               edge e;
1473
1474               FOR_EACH_EDGE (e, ei, bb->succs)
1475                 if (!(e->flags & EDGE_ABNORMAL))
1476                   {
1477                     tree t = build_assert_expr_for (cond, op);
1478                     bsi_insert_on_edge (e, t);
1479                     added = true;
1480                     break;
1481                   }
1482             }
1483         }
1484
1485       /* Remember the last statement of the block.  */
1486       last = stmt;
1487     }
1488
1489   /* Step 3.  If BB's last statement is a conditional expression
1490      involving integer operands, recurse into each of the sub-graphs
1491      rooted at BB to determine if we need to add ASSERT_EXPRs.
1492      Notice that we only care about the first operand of the
1493      conditional.  Adding assertions for both operands may actually 
1494      hinder VRP.  FIXME, add example.  */
1495   if (last
1496       && TREE_CODE (last) == COND_EXPR
1497       && !fp_predicate (COND_EXPR_COND (last))
1498       && NUM_USES (uses = STMT_USE_OPS (last)) > 0)
1499     {
1500       edge e;
1501       edge_iterator ei;
1502       tree op, cond;
1503       
1504       cond = COND_EXPR_COND (last);
1505
1506       /* Remove the COND_EXPR operand from the FOUND bitmap.
1507          Otherwise, when we finish traversing each of the sub-graphs,
1508          we won't know whether the variables were found in the
1509          sub-graphs or if they had been found in a block upstream from
1510          BB.  */
1511       op = USE_OP (uses, 0);
1512
1513       /* Do not attempt to infer anything in names that flow through
1514          abnormal edges.  */
1515       if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
1516         return false;
1517
1518       RESET_BIT (found, SSA_NAME_VERSION (op));
1519
1520       /* Look for uses of the operands in each of the sub-graphs
1521          rooted at BB.  We need to check each of the outgoing edges
1522          separately, so that we know what kind of ASSERT_EXPR to
1523          insert.  */
1524       FOR_EACH_EDGE (e, ei, bb->succs)
1525         {
1526           /* If BB strictly dominates the sub-graph at E->DEST,
1527              recurse into it.  */
1528           if (e->dest != bb
1529               && dominated_by_p (CDI_DOMINATORS, e->dest, bb))
1530             added |= maybe_add_assert_expr (e->dest);
1531
1532           /* Once we traversed the sub-graph, check if any block inside
1533              used either of the predicate's operands.  If so, add the
1534              appropriate ASSERT_EXPR.  */
1535           if (TEST_BIT (found, SSA_NAME_VERSION (op)))
1536             {
1537               /* We found a use of OP in the sub-graph rooted at
1538                  E->DEST.  Add an ASSERT_EXPR according to whether
1539                  E goes to THEN_CLAUSE or ELSE_CLAUSE.  */
1540               tree c, t;
1541
1542               if (e->flags & EDGE_TRUE_VALUE)
1543                 c = unshare_expr (cond);
1544               else if (e->flags & EDGE_FALSE_VALUE)
1545                 c = invert_truthvalue (cond);
1546               else
1547                 gcc_unreachable ();
1548
1549               t = build_assert_expr_for (c, op);
1550               bsi_insert_on_edge (e, t);
1551               added = true;
1552             }
1553         }
1554
1555       /* Finally, mark all the COND_EXPR operands as found.  */
1556       SET_BIT (found, SSA_NAME_VERSION (op));
1557     }
1558   else
1559     {
1560       /* Step 4.  Recurse into the dominator children of BB.  */
1561       basic_block son;
1562
1563       for (son = first_dom_son (CDI_DOMINATORS, bb);
1564            son;
1565            son = next_dom_son (CDI_DOMINATORS, son))
1566         added |= maybe_add_assert_expr (son);
1567     }
1568
1569   return added;
1570 }
1571
1572
1573 /* Traverse the flowgraph looking for conditional jumps to insert range
1574    expressions.  These range expressions are meant to provide information
1575    to optimizations that need to reason in terms of value ranges.  They
1576    will not be expanded into RTL.  For instance, given:
1577
1578    x = ...
1579    y = ...
1580    if (x < y)
1581      y = x - 2;
1582    else
1583      x = y + 3;
1584
1585    this pass will transform the code into:
1586
1587    x = ...
1588    y = ...
1589    if (x < y)
1590     {
1591       x = ASSERT_EXPR <x, x < y>
1592       y = x - 2
1593     }
1594    else
1595     {
1596       y = ASSERT_EXPR <y, x <= y>
1597       x = y + 3
1598     }
1599
1600    The idea is that once copy and constant propagation have run, other
1601    optimizations will be able to determine what ranges of values can 'x'
1602    take in different paths of the code, simply by checking the reaching
1603    definition of 'x'.  */
1604
1605 static void
1606 insert_range_assertions (void)
1607 {
1608   edge e;
1609   edge_iterator ei;
1610   bool update_ssa_p;
1611   
1612   found = sbitmap_alloc (num_ssa_names);
1613   sbitmap_zero (found);
1614
1615   calculate_dominance_info (CDI_DOMINATORS);
1616
1617   update_ssa_p = false;
1618   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
1619     if (maybe_add_assert_expr (e->dest))
1620       update_ssa_p = true;
1621
1622   if (update_ssa_p)
1623     {
1624       bsi_commit_edge_inserts ();
1625       update_ssa (TODO_update_ssa_no_phi);
1626     }
1627
1628   if (dump_file && (dump_flags & TDF_DETAILS))
1629     {
1630       fprintf (dump_file, "\nSSA form after inserting ASSERT_EXPRs\n");
1631       dump_function_to_file (current_function_decl, dump_file, dump_flags);
1632     }
1633
1634   sbitmap_free (found);
1635 }
1636
1637
1638 /* Convert range assertion expressions into copies.  FIXME, explain why.  */
1639
1640 static void
1641 remove_range_assertions (void)
1642 {
1643   basic_block bb;
1644   block_stmt_iterator si;
1645
1646   FOR_EACH_BB (bb)
1647     for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1648       {
1649         tree stmt = bsi_stmt (si);
1650
1651         if (TREE_CODE (stmt) == MODIFY_EXPR
1652             && TREE_CODE (TREE_OPERAND (stmt, 1)) == ASSERT_EXPR)
1653           {
1654             tree rhs = TREE_OPERAND (stmt, 1);
1655             tree cond = fold (ASSERT_EXPR_COND (rhs));
1656             gcc_assert (cond != boolean_false_node);
1657             TREE_OPERAND (stmt, 1) = ASSERT_EXPR_VAR (rhs);
1658             update_stmt (stmt);
1659           }
1660       }
1661 }
1662
1663
1664 /* Return true if STMT is interesting for VRP.  */
1665
1666 static bool
1667 stmt_interesting_for_vrp (tree stmt)
1668 {
1669   if (TREE_CODE (stmt) == PHI_NODE
1670       && is_gimple_reg (PHI_RESULT (stmt))
1671       && (INTEGRAL_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))
1672           || POINTER_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))))
1673     return true;
1674   else if (TREE_CODE (stmt) == MODIFY_EXPR)
1675     {
1676       tree lhs = TREE_OPERAND (stmt, 0);
1677       stmt_ann_t ann = stmt_ann (stmt);
1678
1679       if (TREE_CODE (lhs) == SSA_NAME
1680           && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
1681               || POINTER_TYPE_P (TREE_TYPE (lhs)))
1682           && NUM_V_MAY_DEFS (V_MAY_DEF_OPS (ann)) == 0
1683           && NUM_VUSES (VUSE_OPS (ann)) == 0
1684           && NUM_V_MUST_DEFS (V_MUST_DEF_OPS (ann)) == 0)
1685         return true;
1686     }
1687   else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
1688     return true;
1689
1690   return false;
1691 }
1692
1693
1694 /* Initialize local data structures for VRP.  Return true if VRP
1695    is worth running (i.e. if we found any statements that could
1696    benefit from range information).  */
1697
1698 static bool
1699 vrp_initialize (void)
1700 {
1701   basic_block bb;
1702   bool do_vrp;
1703
1704   /* If we don't find any ASSERT_EXPRs in the code, there's no point
1705      running VRP.  */
1706   do_vrp = false;
1707
1708   FOR_EACH_BB (bb)
1709     {
1710       block_stmt_iterator si;
1711       tree phi;
1712
1713       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1714         {
1715           if (!stmt_interesting_for_vrp (phi))
1716             {
1717               tree lhs = PHI_RESULT (phi);
1718               set_value_range (get_value_range (lhs), VR_VARYING, 0, 0);
1719               DONT_SIMULATE_AGAIN (phi) = true;
1720             }
1721           else
1722             DONT_SIMULATE_AGAIN (phi) = false;
1723         }
1724
1725       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1726         {
1727           tree stmt = bsi_stmt (si);
1728
1729           if (!stmt_interesting_for_vrp (stmt))
1730             {
1731               ssa_op_iter i;
1732               tree def;
1733               FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
1734                 set_value_range (get_value_range (def), VR_VARYING, 0, 0);
1735               DONT_SIMULATE_AGAIN (stmt) = true;
1736             }
1737           else
1738             {
1739               if (TREE_CODE (stmt) == MODIFY_EXPR
1740                    && TREE_CODE (TREE_OPERAND (stmt, 1)) == ASSERT_EXPR)
1741                 do_vrp = true;
1742
1743               DONT_SIMULATE_AGAIN (stmt) = false;
1744             }
1745         }
1746     }
1747
1748   return do_vrp;
1749 }
1750
1751
1752 /* Visit assignment STMT.  If it produces an interesting range, record
1753    the SSA name in *OUTPUT_P.  */
1754
1755 static enum ssa_prop_result
1756 vrp_visit_assignment (tree stmt, tree *output_p)
1757 {
1758   tree lhs, rhs, def;
1759   ssa_op_iter iter;
1760
1761   lhs = TREE_OPERAND (stmt, 0);
1762   rhs = TREE_OPERAND (stmt, 1);
1763
1764   /* We only keep track of ranges in integral and pointer types.  */
1765   if (TREE_CODE (lhs) == SSA_NAME
1766       && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
1767           || POINTER_TYPE_P (TREE_TYPE (lhs))))
1768     {
1769       value_range *vr, new_vr;
1770       struct loop *l;
1771       
1772       vr = get_value_range (lhs);
1773       extract_range_from_expr (&new_vr, rhs);
1774
1775       /* If STMT is inside a loop, we may be able to know something
1776          else about the range of LHS by examining scalar evolution
1777          information.  */
1778       if (cfg_loops && (l = loop_containing_stmt (stmt)))
1779         adjust_range_with_scev (&new_vr, l, lhs);
1780
1781       if (update_value_range (vr, new_vr.type, new_vr.min, new_vr.max))
1782         {
1783           *output_p = lhs;
1784
1785           if (dump_file && (dump_flags & TDF_DETAILS))
1786             {
1787               fprintf (dump_file, "Found new range ");
1788               dump_value_range (dump_file, &new_vr);
1789               fprintf (dump_file, " for ");
1790               print_generic_expr (dump_file, lhs, 0);
1791               fprintf (dump_file, "\n\n");
1792             }
1793
1794           if (new_vr.type == VR_VARYING)
1795             return SSA_PROP_VARYING;
1796
1797           return SSA_PROP_INTERESTING;
1798         }
1799
1800       return SSA_PROP_NOT_INTERESTING;
1801     }
1802   
1803   /* Every other statements produces no useful ranges.  */
1804   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
1805     set_value_range (get_value_range (def), VR_VARYING, 0, 0);
1806
1807   return SSA_PROP_VARYING;
1808 }
1809
1810
1811 /* Given a conditional predicate COND, try to determine if COND yields
1812    true or false based on the value ranges of its operands.  */
1813
1814 static tree
1815 vrp_evaluate_conditional (tree cond)
1816 {
1817   gcc_assert (TREE_CODE (cond) == SSA_NAME
1818               || TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison);
1819
1820   if (TREE_CODE (cond) == SSA_NAME)
1821     {
1822       /* For SSA names, only return a truth value if the range is
1823          known and contains exactly one value.  */
1824       value_range *vr = SSA_NAME_VALUE_RANGE (cond);
1825       if (vr && vr->type == VR_RANGE && vr->min == vr->max)
1826         return vr->min;
1827     }
1828   else
1829     {
1830       /* For comparisons, evaluate each operand and compare their
1831          ranges.  */
1832       tree op0, op1;
1833       value_range *vr0, *vr1;
1834
1835       op0 = TREE_OPERAND (cond, 0);
1836       vr0 = (TREE_CODE (op0) == SSA_NAME) ? get_value_range (op0) : NULL;
1837
1838       op1 = TREE_OPERAND (cond, 1);
1839       vr1 = (TREE_CODE (op1) == SSA_NAME) ? get_value_range (op1) : NULL;
1840
1841       if (vr0 && vr1)
1842         return compare_ranges (TREE_CODE (cond), vr0, vr1);
1843       else if (vr0 && vr1 == NULL)
1844         return compare_range_with_value (TREE_CODE (cond), vr0, op1);
1845       else if (vr0 == NULL && vr1)
1846         return compare_range_with_value (opposite_comparison (TREE_CODE (cond)),
1847                                          vr1, op0);
1848     }
1849
1850   /* Anything else cannot be computed statically.  */
1851   return NULL_TREE;
1852 }
1853
1854
1855 /* Visit conditional statement STMT.  If we can determine which edge
1856    will be taken out of STMT's basic block, record it in
1857    *TAKEN_EDGE_P and return SSA_PROP_INTERESTING.  Otherwise, return
1858    SSA_PROP_VARYING.  */
1859
1860 static enum ssa_prop_result
1861 vrp_visit_cond_stmt (tree stmt, edge *taken_edge_p)
1862 {
1863   tree cond, val;
1864
1865   *taken_edge_p = NULL;
1866
1867   /* FIXME.  Handle SWITCH_EXPRs.  But first, the assert pass needs to
1868      add ASSERT_EXPRs for them.  */
1869   if (TREE_CODE (stmt) == SWITCH_EXPR)
1870     return SSA_PROP_VARYING;
1871
1872   cond = COND_EXPR_COND (stmt);
1873
1874   if (dump_file && (dump_flags & TDF_DETAILS))
1875     {
1876       tree use;
1877       ssa_op_iter i;
1878
1879       fprintf (dump_file, "\nVisiting conditional with predicate: ");
1880       print_generic_expr (dump_file, cond, 0);
1881       fprintf (dump_file, "\nWith known ranges\n");
1882       
1883       FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
1884         {
1885           fprintf (dump_file, "\t");
1886           print_generic_expr (dump_file, use, 0);
1887           fprintf (dump_file, ": ");
1888           dump_value_range (dump_file, SSA_NAME_VALUE_RANGE (use));
1889         }
1890
1891       fprintf (dump_file, "\n");
1892     }
1893
1894   /* Compute the value of the predicate COND by checking the known
1895      ranges of each of its operands.  */
1896   val = vrp_evaluate_conditional (cond);
1897   if (val)
1898     *taken_edge_p = find_taken_edge (bb_for_stmt (stmt), val);
1899
1900   if (dump_file && (dump_flags & TDF_DETAILS))
1901     {
1902       fprintf (dump_file, "\nPredicate evaluates to: ");
1903       if (val == NULL_TREE)
1904         fprintf (dump_file, "DON'T KNOW\n");
1905       else
1906         print_generic_stmt (dump_file, val, 0);
1907     }
1908
1909   return (*taken_edge_p) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
1910 }
1911
1912
1913 /* Evaluate statement STMT.  If the statement produces a useful range,
1914    return SSA_PROP_INTERESTING and record the SSA name with the
1915    interesting range into *OUTPUT_P.
1916
1917    If STMT is a conditional branch and we can determine its truth
1918    value, the taken edge is recorded in *TAKEN_EDGE_P.
1919
1920    If STMT produces a varying value, return SSA_PROP_VARYING.  */
1921
1922 static enum ssa_prop_result
1923 vrp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p)
1924 {
1925   tree def;
1926   ssa_op_iter iter;
1927   stmt_ann_t ann;
1928
1929   if (dump_file && (dump_flags & TDF_DETAILS))
1930     {
1931       fprintf (dump_file, "\nVisiting statement:\n");
1932       print_generic_stmt (dump_file, stmt, dump_flags);
1933       fprintf (dump_file, "\n");
1934     }
1935
1936   ann = stmt_ann (stmt);
1937   if (TREE_CODE (stmt) == MODIFY_EXPR
1938       && NUM_V_MAY_DEFS (V_MAY_DEF_OPS (ann)) == 0
1939       && NUM_VUSES (VUSE_OPS (ann)) == 0
1940       && NUM_V_MUST_DEFS (V_MUST_DEF_OPS (ann)) == 0)
1941     return vrp_visit_assignment (stmt, output_p);
1942   else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
1943     return vrp_visit_cond_stmt (stmt, taken_edge_p);
1944
1945   /* All other statements produce nothing of interest for VRP, so mark
1946      their outputs varying and prevent further simulation.  */
1947   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
1948     set_value_range (get_value_range (def), VR_VARYING, 0, 0);
1949
1950   return SSA_PROP_VARYING;
1951 }
1952
1953
1954 /* Meet operation for value ranges.  Given two value ranges VR0 and
1955    VR1, store in VR0 the result of meeting VR0 and VR1.
1956    
1957    The meeting rules are as follows:
1958
1959    1- If VR0 and VR1 have an empty intersection, set VR0 to VR_VARYING.
1960
1961    2- If VR0 and VR1 have a non-empty intersection, set VR0 to the
1962       union of VR0 and VR1.  */
1963
1964 static void
1965 vrp_meet (value_range *vr0, value_range *vr1)
1966 {
1967   if (vr0->type == VR_UNDEFINED)
1968     {
1969       *vr0 = *vr1;
1970       return;
1971     }
1972
1973   if (vr1->type == VR_UNDEFINED)
1974     {
1975       /* Nothing to do.  VR0 already has the resulting range.  */
1976       return;
1977     }
1978
1979   if (vr0->type == VR_VARYING)
1980     {
1981       /* Nothing to do.  VR0 already has the resulting range.  */
1982       return;
1983     }
1984
1985   if (vr1->type == VR_VARYING)
1986     {
1987       *vr0 = *vr1;
1988       return;
1989     }
1990
1991   /* If either is a symbolic range, drop to VARYING.  */
1992   if (symbolic_range_p (vr0) || symbolic_range_p (vr1))
1993     {
1994       set_value_range (vr0, VR_VARYING, NULL_TREE, NULL_TREE);
1995       return;
1996     }
1997
1998   if (vr0->type == VR_RANGE && vr1->type == VR_RANGE)
1999     {
2000       /* If VR0 and VR1 have a non-empty intersection, compute the
2001          union of both ranges.  */
2002       if (value_ranges_intersect_p (vr0, vr1))
2003         {
2004           tree min, max;
2005
2006           min = vr0->min;
2007           max = vr0->max;
2008
2009           /* The lower limit of the new range is the minimum of the
2010              two ranges.  */
2011           if (compare_values (vr0->min, vr1->min) == 1)
2012             min = vr1->min;
2013
2014           /* The upper limit of the new range is the maximum of the
2015              two ranges.  */
2016           if (compare_values (vr0->max, vr1->max) == -1)
2017             max = vr1->max;
2018
2019           set_value_range (vr0, vr0->type, min, max);
2020         }
2021       else
2022         {
2023           /* The two ranges don't intersect, set the result to VR_VARYING.  */
2024           set_value_range (vr0, VR_VARYING, NULL_TREE, NULL_TREE);
2025         }
2026     }
2027   else if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
2028     {
2029       /* Two anti-ranges meet only if they are both identical.  */
2030       if (compare_values (vr0->min, vr1->min) == 0
2031           && compare_values (vr0->max, vr1->max) == 0
2032           && compare_values (vr0->min, vr0->max) == 0)
2033         /* Nothing to do.  */ ;
2034       else
2035         set_value_range (vr0, VR_VARYING, NULL_TREE, NULL_TREE);
2036     }
2037   else if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
2038     {
2039       /* A range [VAL1, VAL2] and an anti-range ~[VAL3, VAL4] meet
2040          only if the ranges have an empty intersection.  The result of
2041          the meet operation is the anti-range.  */
2042       if (!value_ranges_intersect_p (vr0, vr1))
2043         {
2044           if (vr1->type == VR_ANTI_RANGE)
2045             *vr0 = *vr1;
2046         }
2047       else
2048         set_value_range (vr0, VR_VARYING, NULL_TREE, NULL_TREE);
2049     }
2050   else
2051     gcc_unreachable ();
2052 }
2053
2054       
2055 /* Visit all arguments for PHI node PHI that flow through executable
2056    edges.  If a valid value range can be derived from all the incoming
2057    value ranges, set a new range for the LHS of PHI.  */
2058
2059 static enum ssa_prop_result
2060 vrp_visit_phi_node (tree phi)
2061 {
2062   int i;
2063   tree lhs = PHI_RESULT (phi);
2064   value_range *lhs_vr = get_value_range (lhs);
2065   value_range vr_result = *lhs_vr;
2066
2067   if (dump_file && (dump_flags & TDF_DETAILS))
2068     {
2069       fprintf (dump_file, "\nVisiting PHI node: ");
2070       print_generic_expr (dump_file, phi, dump_flags);
2071     }
2072
2073   for (i = 0; i < PHI_NUM_ARGS (phi); i++)
2074     {
2075       edge e = PHI_ARG_EDGE (phi, i);
2076
2077       if (dump_file && (dump_flags & TDF_DETAILS))
2078         {
2079           fprintf (dump_file,
2080               "\n    Argument #%d (%d -> %d %sexecutable)\n",
2081               i, e->src->index, e->dest->index,
2082               (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
2083         }
2084
2085       if (e->flags & EDGE_EXECUTABLE)
2086         {
2087           tree arg = PHI_ARG_DEF (phi, i);
2088           value_range vr_arg;
2089
2090           if (TREE_CODE (arg) == SSA_NAME)
2091             vr_arg = *(get_value_range (arg));
2092           else
2093             {
2094               vr_arg.type = VR_RANGE;
2095               vr_arg.min = arg;
2096               vr_arg.max = arg;
2097             }
2098
2099           if (dump_file && (dump_flags & TDF_DETAILS))
2100             {
2101               fprintf (dump_file, "\t");
2102               print_generic_expr (dump_file, arg, dump_flags);
2103               fprintf (dump_file, "\n\tValue: ");
2104               dump_value_range (dump_file, &vr_arg);
2105               fprintf (dump_file, "\n");
2106             }
2107
2108           vrp_meet (&vr_result, &vr_arg);
2109
2110           if (vr_result.type == VR_VARYING)
2111             break;
2112         }
2113     }
2114
2115   if (vr_result.type == VR_VARYING)
2116     {
2117       set_value_range (lhs_vr, VR_VARYING, 0, 0);
2118       return SSA_PROP_VARYING;
2119     }
2120
2121   /* To prevent infinite iterations in the algorithm, derive ranges
2122      when the new value is slightly bigger or smaller than the
2123      previous one.  */
2124   if (lhs_vr->type == VR_RANGE)
2125     {
2126       if (!POINTER_TYPE_P (TREE_TYPE (lhs)))
2127         {
2128           int cmp_min = compare_values (lhs_vr->min, vr_result.min);
2129           int cmp_max = compare_values (lhs_vr->max, vr_result.max);
2130
2131           /* If the new minimum is smaller or larger than the previous
2132              one, go all the way to -INF.  In the first case, to avoid
2133              iterating millions of times to reach -INF, and in the
2134              other case to avoid infinite bouncing between different
2135              minimums.  */
2136           if (cmp_min > 0 || cmp_min < 0)
2137             vr_result.min = TYPE_MIN_VALUE (TREE_TYPE (vr_result.min));
2138
2139           /* Similarly, if the new maximum is smaller or larger than
2140              the previous one, go all the way to +INF.  */
2141           if (cmp_max < 0 || cmp_max > 0)
2142             vr_result.max = TYPE_MAX_VALUE (TREE_TYPE (vr_result.max));
2143
2144           /* If we ended up with a (-INF, +INF) range, set it to
2145              VARYING.  */
2146           if (vr_result.min == TYPE_MIN_VALUE (TREE_TYPE (vr_result.min))
2147               && vr_result.max == TYPE_MAX_VALUE (TREE_TYPE (vr_result.max)))
2148             {
2149               set_value_range (lhs_vr, VR_VARYING, 0, 0);
2150               return SSA_PROP_VARYING;
2151             }
2152         }
2153     }
2154
2155   /* If the new range is different than the previous value, keep
2156      iterating.  */
2157   if (update_value_range (lhs_vr, vr_result.type, vr_result.min, vr_result.max))
2158     return SSA_PROP_INTERESTING;
2159
2160   /* Nothing changed, don't add outgoing edges.  */
2161   return SSA_PROP_NOT_INTERESTING;
2162 }
2163
2164
2165 /* Traverse all the blocks folding conditionals with known ranges.  */
2166
2167 static void
2168 vrp_finalize (void)
2169 {
2170   basic_block bb;
2171   int num_pred_folded = 0;
2172
2173   if (dump_file)
2174     {
2175       fprintf (dump_file, "\nValue ranges after VRP:\n\n");
2176       dump_all_value_ranges (dump_file);
2177       fprintf (dump_file, "\n");
2178     }
2179
2180   FOR_EACH_BB (bb)
2181     {
2182       tree last = last_stmt (bb);
2183       if (last && TREE_CODE (last) == COND_EXPR)
2184         {
2185           tree val = vrp_evaluate_conditional (COND_EXPR_COND (last));
2186           if (val)
2187             {
2188               if (dump_file)
2189                 {
2190                   fprintf (dump_file, "Folding predicate ");
2191                   print_generic_expr (dump_file, COND_EXPR_COND (last), 0);
2192                   fprintf (dump_file, " to ");
2193                   print_generic_expr (dump_file, val, 0);
2194                   fprintf (dump_file, "\n");
2195                 }
2196
2197               num_pred_folded++;
2198               COND_EXPR_COND (last) = val;
2199               update_stmt (last);
2200             }
2201         }
2202     }
2203
2204   if (dump_file && (dump_flags & TDF_STATS))
2205     fprintf (dump_file, "\nNumber of predicates folded: %d\n\n",
2206              num_pred_folded);
2207 }
2208
2209
2210 /* Main entry point to VRP (Value Range Propagation).  This pass is
2211    loosely based on J. R. C. Patterson, ``Accurate Static Branch
2212    Prediction by Value Range Propagation,'' in SIGPLAN Conference on
2213    Programming Language Design and Implementation, pp. 67-78, 1995.
2214    Also available at http://citeseer.ist.psu.edu/patterson95accurate.html
2215
2216    This is essentially an SSA-CCP pass modified to deal with ranges
2217    instead of constants.
2218
2219    TODO, the main difference between this pass and Patterson's is that
2220    we do not propagate edge probabilities.  We only compute whether
2221    edges can be taken or not.  That is, instead of having a spectrum
2222    of jump probabilities between 0 and 1, we only deal with 0, 1 and
2223    DON'T KNOW.  In the future, it may be worthwhile to propagate
2224    probabilities to aid branch prediction.  */
2225
2226 static void
2227 execute_vrp (void)
2228 {
2229   insert_range_assertions ();
2230
2231   cfg_loops = loop_optimizer_init (NULL);
2232   if (cfg_loops)
2233     scev_initialize (cfg_loops);
2234
2235   if (vrp_initialize ())
2236     {
2237       ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
2238       vrp_finalize ();
2239     }
2240
2241   if (cfg_loops)
2242     {
2243       scev_finalize ();
2244       loop_optimizer_finalize (cfg_loops, NULL);
2245       current_loops = NULL;
2246     }
2247
2248   remove_range_assertions ();
2249 }
2250
2251 static bool
2252 gate_vrp (void)
2253 {
2254   return flag_tree_vrp != 0;
2255 }
2256
2257 struct tree_opt_pass pass_vrp =
2258 {
2259   "vrp",                                /* name */
2260   gate_vrp,                             /* gate */
2261   execute_vrp,                          /* execute */
2262   NULL,                                 /* sub */
2263   NULL,                                 /* next */
2264   0,                                    /* static_pass_number */
2265   TV_TREE_VRP,                          /* tv_id */
2266   PROP_ssa | PROP_alias,                /* properties_required */
2267   0,                                    /* properties_provided */
2268   0,                                    /* properties_destroyed */
2269   0,                                    /* todo_flags_start */
2270   TODO_cleanup_cfg
2271     | TODO_ggc_collect
2272     | TODO_verify_ssa
2273     | TODO_dump_func
2274     | TODO_update_ssa,                  /* todo_flags_finish */
2275   0                                     /* letter */
2276 };