OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [tree-vrp.c] - Blame information for rev 16

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 jlechner
/* 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, 51 Franklin Street, Fifth Floor,
20
Boston, MA 02110-1301, 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 find_assert_locations.  */
42
static sbitmap found_in_subgraph;
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
/* Location information for ASSERT_EXPRs.  Each instance of this
52
   structure describes an ASSERT_EXPR for an SSA name.  Since a single
53
   SSA name may have more than one assertion associated with it, these
54
   locations are kept in a linked list attached to the corresponding
55
   SSA name.  */
56
struct assert_locus_d
57
{
58
  /* Basic block where the assertion would be inserted.  */
59
  basic_block bb;
60
 
61
  /* Some assertions need to be inserted on an edge (e.g., assertions
62
     generated by COND_EXPRs).  In those cases, BB will be NULL.  */
63
  edge e;
64
 
65
  /* Pointer to the statement that generated this assertion.  */
66
  block_stmt_iterator si;
67
 
68
  /* Predicate code for the ASSERT_EXPR.  Must be COMPARISON_CLASS_P.  */
69
  enum tree_code comp_code;
70
 
71
  /* Value being compared against.  */
72
  tree val;
73
 
74
  /* Next node in the linked list.  */
75
  struct assert_locus_d *next;
76
};
77
 
78
typedef struct assert_locus_d *assert_locus_t;
79
 
80
/* If bit I is present, it means that SSA name N_i has a list of
81
   assertions that should be inserted in the IL.  */
82
static bitmap need_assert_for;
83
 
84
/* Array of locations lists where to insert assertions.  ASSERTS_FOR[I]
85
   holds a list of ASSERT_LOCUS_T nodes that describe where
86
   ASSERT_EXPRs for SSA name N_I should be inserted.  */
87
static assert_locus_t *asserts_for;
88
 
89
/* Set of blocks visited in find_assert_locations.  Used to avoid
90
   visiting the same block more than once.  */
91
static sbitmap blocks_visited;
92
 
93
/* Value range array.  After propagation, VR_VALUE[I] holds the range
94
   of values that SSA name N_I may take.  */
95
static value_range_t **vr_value;
96
 
97
 
98
/* Return true if ARG is marked with the nonnull attribute in the
99
   current function signature.  */
100
 
101
static bool
102
nonnull_arg_p (tree arg)
103
{
104
  tree t, attrs, fntype;
105
  unsigned HOST_WIDE_INT arg_num;
106
 
107
  gcc_assert (TREE_CODE (arg) == PARM_DECL && POINTER_TYPE_P (TREE_TYPE (arg)));
108
 
109
  fntype = TREE_TYPE (current_function_decl);
110
  attrs = lookup_attribute ("nonnull", TYPE_ATTRIBUTES (fntype));
111
 
112
  /* If "nonnull" wasn't specified, we know nothing about the argument.  */
113
  if (attrs == NULL_TREE)
114
    return false;
115
 
116
  /* If "nonnull" applies to all the arguments, then ARG is non-null.  */
117
  if (TREE_VALUE (attrs) == NULL_TREE)
118
    return true;
119
 
120
  /* Get the position number for ARG in the function signature.  */
121
  for (arg_num = 1, t = DECL_ARGUMENTS (current_function_decl);
122
       t;
123
       t = TREE_CHAIN (t), arg_num++)
124
    {
125
      if (t == arg)
126
        break;
127
    }
128
 
129
  gcc_assert (t == arg);
130
 
131
  /* Now see if ARG_NUM is mentioned in the nonnull list.  */
132
  for (t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
133
    {
134
      if (compare_tree_int (TREE_VALUE (t), arg_num) == 0)
135
        return true;
136
    }
137
 
138
  return false;
139
}
140
 
141
 
142
/* Set value range VR to {T, MIN, MAX, EQUIV}.  */
143
 
144
static void
145
set_value_range (value_range_t *vr, enum value_range_type t, tree min,
146
                 tree max, bitmap equiv)
147
{
148
#if defined ENABLE_CHECKING
149
  /* Check the validity of the range.  */
150
  if (t == VR_RANGE || t == VR_ANTI_RANGE)
151
    {
152
      int cmp;
153
 
154
      gcc_assert (min && max);
155
 
156
      if (INTEGRAL_TYPE_P (TREE_TYPE (min)) && t == VR_ANTI_RANGE)
157
        gcc_assert (min != TYPE_MIN_VALUE (TREE_TYPE (min))
158
                    || max != TYPE_MAX_VALUE (TREE_TYPE (max)));
159
 
160
      cmp = compare_values (min, max);
161
      gcc_assert (cmp == 0 || cmp == -1 || cmp == -2);
162
    }
163
 
164
  if (t == VR_UNDEFINED || t == VR_VARYING)
165
    gcc_assert (min == NULL_TREE && max == NULL_TREE);
166
 
167
  if (t == VR_UNDEFINED || t == VR_VARYING)
168
    gcc_assert (equiv == NULL || bitmap_empty_p (equiv));
169
#endif
170
 
171
  vr->type = t;
172
  vr->min = min;
173
  vr->max = max;
174
 
175
  /* Since updating the equivalence set involves deep copying the
176
     bitmaps, only do it if absolutely necessary.  */
177
  if (vr->equiv == NULL)
178
    vr->equiv = BITMAP_ALLOC (NULL);
179
 
180
  if (equiv != vr->equiv)
181
    {
182
      if (equiv && !bitmap_empty_p (equiv))
183
        bitmap_copy (vr->equiv, equiv);
184
      else
185
        bitmap_clear (vr->equiv);
186
    }
187
}
188
 
189
 
190
/* Copy value range FROM into value range TO.  */
191
 
192
static inline void
193
copy_value_range (value_range_t *to, value_range_t *from)
194
{
195
  set_value_range (to, from->type, from->min, from->max, from->equiv);
196
}
197
 
198
 
199
/* Set value range VR to a non-NULL range of type TYPE.  */
200
 
201
static inline void
202
set_value_range_to_nonnull (value_range_t *vr, tree type)
203
{
204
  tree zero = build_int_cst (type, 0);
205
  set_value_range (vr, VR_ANTI_RANGE, zero, zero, vr->equiv);
206
}
207
 
208
 
209
/* Set value range VR to a NULL range of type TYPE.  */
210
 
211
static inline void
212
set_value_range_to_null (value_range_t *vr, tree type)
213
{
214
  tree zero = build_int_cst (type, 0);
215
  set_value_range (vr, VR_RANGE, zero, zero, vr->equiv);
216
}
217
 
218
 
219
/* Set value range VR to VR_VARYING.  */
220
 
221
static inline void
222
set_value_range_to_varying (value_range_t *vr)
223
{
224
  vr->type = VR_VARYING;
225
  vr->min = vr->max = NULL_TREE;
226
  if (vr->equiv)
227
    bitmap_clear (vr->equiv);
228
}
229
 
230
 
231
/* Set value range VR to VR_UNDEFINED.  */
232
 
233
static inline void
234
set_value_range_to_undefined (value_range_t *vr)
235
{
236
  vr->type = VR_UNDEFINED;
237
  vr->min = vr->max = NULL_TREE;
238
  if (vr->equiv)
239
    bitmap_clear (vr->equiv);
240
}
241
 
242
 
243
/* Return value range information for VAR.  Create an empty range
244
   if none existed.  */
245
 
246
static value_range_t *
247
get_value_range (tree var)
248
{
249
  value_range_t *vr;
250
  tree sym;
251
  unsigned ver = SSA_NAME_VERSION (var);
252
 
253
  vr = vr_value[ver];
254
  if (vr)
255
    return vr;
256
 
257
  /* Create a default value range.  */
258
  vr_value[ver] = vr = xmalloc (sizeof (*vr));
259
  memset (vr, 0, sizeof (*vr));
260
 
261
  /* Allocate an equivalence set.  */
262
  vr->equiv = BITMAP_ALLOC (NULL);
263
 
264
  /* If VAR is a default definition, the variable can take any value
265
     in VAR's type.  */
266
  sym = SSA_NAME_VAR (var);
267
  if (var == default_def (sym))
268
    {
269
      /* Try to use the "nonnull" attribute to create ~[0, 0]
270
         anti-ranges for pointers.  Note that this is only valid with
271
         default definitions of PARM_DECLs.  */
272
      if (TREE_CODE (sym) == PARM_DECL
273
          && POINTER_TYPE_P (TREE_TYPE (sym))
274
          && nonnull_arg_p (sym))
275
        set_value_range_to_nonnull (vr, TREE_TYPE (sym));
276
      else
277
        set_value_range_to_varying (vr);
278
    }
279
 
280
  return vr;
281
}
282
 
283
 
284
/* Update the value range and equivalence set for variable VAR to
285
   NEW_VR.  Return true if NEW_VR is different from VAR's previous
286
   value.
287
 
288
   NOTE: This function assumes that NEW_VR is a temporary value range
289
   object created for the sole purpose of updating VAR's range.  The
290
   storage used by the equivalence set from NEW_VR will be freed by
291
   this function.  Do not call update_value_range when NEW_VR
292
   is the range object associated with another SSA name.  */
293
 
294
static inline bool
295
update_value_range (tree var, value_range_t *new_vr)
296
{
297
  value_range_t *old_vr;
298
  bool is_new;
299
 
300
  /* Update the value range, if necessary.  */
301
  old_vr = get_value_range (var);
302
  is_new = old_vr->type != new_vr->type
303
           || old_vr->min != new_vr->min
304
           || old_vr->max != new_vr->max
305
           || (old_vr->equiv == NULL && new_vr->equiv)
306
           || (old_vr->equiv && new_vr->equiv == NULL)
307
           || (!bitmap_equal_p (old_vr->equiv, new_vr->equiv));
308
 
309
  if (is_new)
310
    set_value_range (old_vr, new_vr->type, new_vr->min, new_vr->max,
311
                     new_vr->equiv);
312
 
313
  BITMAP_FREE (new_vr->equiv);
314
  new_vr->equiv = NULL;
315
 
316
  return is_new;
317
}
318
 
319
 
320
/* Add VAR and VAR's equivalence set to EQUIV.  */
321
 
322
static void
323
add_equivalence (bitmap equiv, tree var)
324
{
325
  unsigned ver = SSA_NAME_VERSION (var);
326
  value_range_t *vr = vr_value[ver];
327
 
328
  bitmap_set_bit (equiv, ver);
329
  if (vr && vr->equiv)
330
    bitmap_ior_into (equiv, vr->equiv);
331
}
332
 
333
 
334
/* Return true if VR is ~[0, 0].  */
335
 
336
static inline bool
337
range_is_nonnull (value_range_t *vr)
338
{
339
  return vr->type == VR_ANTI_RANGE
340
         && integer_zerop (vr->min)
341
         && integer_zerop (vr->max);
342
}
343
 
344
 
345
/* Return true if VR is [0, 0].  */
346
 
347
static inline bool
348
range_is_null (value_range_t *vr)
349
{
350
  return vr->type == VR_RANGE
351
         && integer_zerop (vr->min)
352
         && integer_zerop (vr->max);
353
}
354
 
355
 
356
/* Return true if value range VR involves at least one symbol.  */
357
 
358
static inline bool
359
symbolic_range_p (value_range_t *vr)
360
{
361
  return (!is_gimple_min_invariant (vr->min)
362
          || !is_gimple_min_invariant (vr->max));
363
}
364
 
365
 
366
/* Like tree_expr_nonzero_p, but this function uses value ranges
367
   obtained so far.  */
368
 
369
static bool
370
vrp_expr_computes_nonzero (tree expr)
371
{
372
  if (tree_expr_nonzero_p (expr))
373
    return true;
374
 
375
  /* If we have an expression of the form &X->a, then the expression
376
     is nonnull if X is nonnull.  */
377
  if (TREE_CODE (expr) == ADDR_EXPR)
378
    {
379
      tree base = get_base_address (TREE_OPERAND (expr, 0));
380
 
381
      if (base != NULL_TREE
382
          && TREE_CODE (base) == INDIRECT_REF
383
          && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
384
        {
385
          value_range_t *vr = get_value_range (TREE_OPERAND (base, 0));
386
          if (range_is_nonnull (vr))
387
            return true;
388
        }
389
    }
390
 
391
  return false;
392
}
393
 
394
 
395
/* Compare two values VAL1 and VAL2.  Return
396
 
397
        -2 if VAL1 and VAL2 cannot be compared at compile-time,
398
        -1 if VAL1 < VAL2,
399
 
400
        +1 if VAL1 > VAL2, and
401
        +2 if VAL1 != VAL2
402
 
403
   This is similar to tree_int_cst_compare but supports pointer values
404
   and values that cannot be compared at compile time.  */
405
 
406
static int
407
compare_values (tree val1, tree val2)
408
{
409
  if (val1 == val2)
410
    return 0;
411
 
412
  /* Below we rely on the fact that VAL1 and VAL2 are both pointers or
413
     both integers.  */
414
  gcc_assert (POINTER_TYPE_P (TREE_TYPE (val1))
415
              == POINTER_TYPE_P (TREE_TYPE (val2)));
416
 
417
  /* Do some limited symbolic comparisons.  */
418
  if (!POINTER_TYPE_P (TREE_TYPE (val1)))
419
    {
420
      /* We can determine some comparisons against +INF and -INF even
421
         if the other value is an expression.  */
422
      if (val1 == TYPE_MAX_VALUE (TREE_TYPE (val1))
423
          && TREE_CODE (val2) == MINUS_EXPR)
424
        {
425
          /* +INF > NAME - CST.  */
426
          return 1;
427
        }
428
      else if (val1 == TYPE_MIN_VALUE (TREE_TYPE (val1))
429
               && TREE_CODE (val2) == PLUS_EXPR)
430
        {
431
          /* -INF < NAME + CST.  */
432
          return -1;
433
        }
434
      else if (TREE_CODE (val1) == MINUS_EXPR
435
               && val2 == TYPE_MAX_VALUE (TREE_TYPE (val2)))
436
        {
437
          /* NAME - CST < +INF.  */
438
          return -1;
439
        }
440
      else if (TREE_CODE (val1) == PLUS_EXPR
441
               && val2 == TYPE_MIN_VALUE (TREE_TYPE (val2)))
442
        {
443
          /* NAME + CST > -INF.  */
444
          return 1;
445
        }
446
    }
447
 
448
  if ((TREE_CODE (val1) == SSA_NAME
449
       || TREE_CODE (val1) == PLUS_EXPR
450
       || TREE_CODE (val1) == MINUS_EXPR)
451
      && (TREE_CODE (val2) == SSA_NAME
452
          || TREE_CODE (val2) == PLUS_EXPR
453
          || TREE_CODE (val2) == MINUS_EXPR))
454
    {
455
      tree n1, c1, n2, c2;
456
 
457
      /* If VAL1 and VAL2 are of the form 'NAME [+-] CST' or 'NAME',
458
         return -1 or +1 accordingly.  If VAL1 and VAL2 don't use the
459
         same name, return -2.  */
460
      if (TREE_CODE (val1) == SSA_NAME)
461
        {
462
          n1 = val1;
463
          c1 = NULL_TREE;
464
        }
465
      else
466
        {
467
          n1 = TREE_OPERAND (val1, 0);
468
          c1 = TREE_OPERAND (val1, 1);
469
        }
470
 
471
      if (TREE_CODE (val2) == SSA_NAME)
472
        {
473
          n2 = val2;
474
          c2 = NULL_TREE;
475
        }
476
      else
477
        {
478
          n2 = TREE_OPERAND (val2, 0);
479
          c2 = TREE_OPERAND (val2, 1);
480
        }
481
 
482
      /* Both values must use the same name.  */
483
      if (n1 != n2)
484
        return -2;
485
 
486
      if (TREE_CODE (val1) == SSA_NAME)
487
        {
488
          if (TREE_CODE (val2) == SSA_NAME)
489
            /* NAME == NAME  */
490
            return 0;
491
          else if (TREE_CODE (val2) == PLUS_EXPR)
492
            /* NAME < NAME + CST  */
493
            return -1;
494
          else if (TREE_CODE (val2) == MINUS_EXPR)
495
            /* NAME > NAME - CST  */
496
            return 1;
497
        }
498
      else if (TREE_CODE (val1) == PLUS_EXPR)
499
        {
500
          if (TREE_CODE (val2) == SSA_NAME)
501
            /* NAME + CST > NAME  */
502
            return 1;
503
          else if (TREE_CODE (val2) == PLUS_EXPR)
504
            /* NAME + CST1 > NAME + CST2, if CST1 > CST2  */
505
            return compare_values (c1, c2);
506
          else if (TREE_CODE (val2) == MINUS_EXPR)
507
            /* NAME + CST1 > NAME - CST2  */
508
            return 1;
509
        }
510
      else if (TREE_CODE (val1) == MINUS_EXPR)
511
        {
512
          if (TREE_CODE (val2) == SSA_NAME)
513
            /* NAME - CST < NAME  */
514
            return -1;
515
          else if (TREE_CODE (val2) == PLUS_EXPR)
516
            /* NAME - CST1 < NAME + CST2  */
517
            return -1;
518
          else if (TREE_CODE (val2) == MINUS_EXPR)
519
            /* NAME - CST1 > NAME - CST2, if CST1 < CST2.  Notice that
520
               C1 and C2 are swapped in the call to compare_values.  */
521
            return compare_values (c2, c1);
522
        }
523
 
524
      gcc_unreachable ();
525
    }
526
 
527
  /* We cannot compare non-constants.  */
528
  if (!is_gimple_min_invariant (val1) || !is_gimple_min_invariant (val2))
529
    return -2;
530
 
531
  /* We cannot compare overflowed values.  */
532
  if (TREE_OVERFLOW (val1) || TREE_OVERFLOW (val2))
533
    return -2;
534
 
535
  if (!POINTER_TYPE_P (TREE_TYPE (val1)))
536
    return tree_int_cst_compare (val1, val2);
537
  else
538
    {
539
      tree t;
540
 
541
      /* First see if VAL1 and VAL2 are not the same.  */
542
      if (val1 == val2 || operand_equal_p (val1, val2, 0))
543
        return 0;
544
 
545
      /* If VAL1 is a lower address than VAL2, return -1.  */
546
      t = fold_binary (LT_EXPR, boolean_type_node, val1, val2);
547
      if (t == boolean_true_node)
548
        return -1;
549
 
550
      /* If VAL1 is a higher address than VAL2, return +1.  */
551
      t = fold_binary (GT_EXPR, boolean_type_node, val1, val2);
552
      if (t == boolean_true_node)
553
        return 1;
554
 
555
      /* If VAL1 is different than VAL2, return +2.  */
556
      t = fold_binary (NE_EXPR, boolean_type_node, val1, val2);
557
      if (t == boolean_true_node)
558
        return 2;
559
 
560
      return -2;
561
    }
562
}
563
 
564
 
565
/* Return 1 if VAL is inside value range VR (VR->MIN <= VAL <= VR->MAX),
566
 
567
         -2 if we cannot tell either way.
568
 
569
   FIXME, the current semantics of this functions are a bit quirky
570
          when taken in the context of VRP.  In here we do not care
571
          about VR's type.  If VR is the anti-range ~[3, 5] the call
572
          value_inside_range (4, VR) will return 1.
573
 
574
          This is counter-intuitive in a strict sense, but the callers
575
          currently expect this.  They are calling the function
576
          merely to determine whether VR->MIN <= VAL <= VR->MAX.  The
577
          callers are applying the VR_RANGE/VR_ANTI_RANGE semantics
578
          themselves.
579
 
580
          This also applies to value_ranges_intersect_p and
581
          range_includes_zero_p.  The semantics of VR_RANGE and
582
          VR_ANTI_RANGE should be encoded here, but that also means
583
          adapting the users of these functions to the new semantics.  */
584
 
585
static inline int
586
value_inside_range (tree val, value_range_t *vr)
587
{
588
  int cmp1, cmp2;
589
 
590
  cmp1 = compare_values (val, vr->min);
591
  if (cmp1 == -2 || cmp1 == 2)
592
    return -2;
593
 
594
  cmp2 = compare_values (val, vr->max);
595
  if (cmp2 == -2 || cmp2 == 2)
596
    return -2;
597
 
598
  return (cmp1 == 0 || cmp1 == 1) && (cmp2 == -1 || cmp2 == 0);
599
}
600
 
601
 
602
/* Return true if value ranges VR0 and VR1 have a non-empty
603
   intersection.  */
604
 
605
static inline bool
606
value_ranges_intersect_p (value_range_t *vr0, value_range_t *vr1)
607
{
608
  return (value_inside_range (vr1->min, vr0) == 1
609
          || value_inside_range (vr1->max, vr0) == 1
610
          || value_inside_range (vr0->min, vr1) == 1
611
          || value_inside_range (vr0->max, vr1) == 1);
612
}
613
 
614
 
615
/* Return true if VR includes the value zero, false otherwise.  FIXME,
616
   currently this will return false for an anti-range like ~[-4, 3].
617
   This will be wrong when the semantics of value_inside_range are
618
   modified (currently the users of this function expect these
619
   semantics).  */
620
 
621
static inline bool
622
range_includes_zero_p (value_range_t *vr)
623
{
624
  tree zero;
625
 
626
  gcc_assert (vr->type != VR_UNDEFINED
627
              && vr->type != VR_VARYING
628
              && !symbolic_range_p (vr));
629
 
630
  zero = build_int_cst (TREE_TYPE (vr->min), 0);
631
  return (value_inside_range (zero, vr) == 1);
632
}
633
 
634
 
635
/* When extracting ranges from X_i = ASSERT_EXPR <Y_j, pred>, we will
636
   initially consider X_i and Y_j equivalent, so the equivalence set
637
   of Y_j is added to the equivalence set of X_i.  However, it is
638
   possible to have a chain of ASSERT_EXPRs whose predicates are
639
   actually incompatible.  This is usually the result of nesting of
640
   contradictory if-then-else statements.  For instance, in PR 24670:
641
 
642
        count_4 has range [-INF, 63]
643
 
644
        if (count_4 != 0)
645
          {
646
            count_19 = ASSERT_EXPR <count_4, count_4 != 0>
647
            if (count_19 > 63)
648
              {
649
                count_18 = ASSERT_EXPR <count_19, count_19 > 63>
650
                if (count_18 <= 63)
651
                  ...
652
              }
653
          }
654
 
655
   Notice that 'if (count_19 > 63)' is trivially false and will be
656
   folded out at the end.  However, during propagation, the flowgraph
657
   is not cleaned up and so, VRP will evaluate predicates more
658
   predicates than necessary, so it must support these
659
   inconsistencies.  The problem here is that because of the chaining
660
   of ASSERT_EXPRs, the equivalency set for count_18 includes count_4.
661
   Since count_4 has an incompatible range, we ICE when evaluating the
662
   ranges in the equivalency set.  So, we need to remove count_4 from
663
   it.  */
664
 
665
static void
666
fix_equivalence_set (value_range_t *vr_p)
667
{
668
  bitmap_iterator bi;
669
  unsigned i;
670
  bitmap e = vr_p->equiv;
671
  bitmap to_remove = BITMAP_ALLOC (NULL);
672
 
673
  /* Only detect inconsistencies on numeric ranges.  */
674
  if (vr_p->type == VR_VARYING
675
      || vr_p->type == VR_UNDEFINED
676
      || symbolic_range_p (vr_p))
677
    return;
678
 
679
  EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
680
    {
681
      value_range_t *equiv_vr = vr_value[i];
682
 
683
      if (equiv_vr->type == VR_VARYING
684
          || equiv_vr->type == VR_UNDEFINED
685
          || symbolic_range_p (equiv_vr))
686
        continue;
687
 
688
      if (equiv_vr->type == VR_RANGE
689
          && vr_p->type == VR_RANGE
690
          && !value_ranges_intersect_p (vr_p, equiv_vr))
691
        bitmap_set_bit (to_remove, i);
692
      else if ((equiv_vr->type == VR_RANGE && vr_p->type == VR_ANTI_RANGE)
693
               || (equiv_vr->type == VR_ANTI_RANGE && vr_p->type == VR_RANGE))
694
        {
695
          /* A range and an anti-range have an empty intersection if
696
             their end points are the same.  FIXME,
697
             value_ranges_intersect_p should handle this
698
             automatically.  */
699
          if (compare_values (equiv_vr->min, vr_p->min) == 0
700
              && compare_values (equiv_vr->max, vr_p->max) == 0)
701
            bitmap_set_bit (to_remove, i);
702
        }
703
    }
704
 
705
  bitmap_and_compl_into (vr_p->equiv, to_remove);
706
  BITMAP_FREE (to_remove);
707
}
708
 
709
 
710
/* Extract value range information from an ASSERT_EXPR EXPR and store
711
   it in *VR_P.  */
712
 
713
static void
714
extract_range_from_assert (value_range_t *vr_p, tree expr)
715
{
716
  tree var, cond, limit, min, max, type;
717
  value_range_t *var_vr, *limit_vr;
718
  enum tree_code cond_code;
719
 
720
  var = ASSERT_EXPR_VAR (expr);
721
  cond = ASSERT_EXPR_COND (expr);
722
 
723
  gcc_assert (COMPARISON_CLASS_P (cond));
724
 
725
  /* Find VAR in the ASSERT_EXPR conditional.  */
726
  if (var == TREE_OPERAND (cond, 0))
727
    {
728
      /* If the predicate is of the form VAR COMP LIMIT, then we just
729
         take LIMIT from the RHS and use the same comparison code.  */
730
      limit = TREE_OPERAND (cond, 1);
731
      cond_code = TREE_CODE (cond);
732
    }
733
  else
734
    {
735
      /* If the predicate is of the form LIMIT COMP VAR, then we need
736
         to flip around the comparison code to create the proper range
737
         for VAR.  */
738
      limit = TREE_OPERAND (cond, 0);
739
      cond_code = swap_tree_comparison (TREE_CODE (cond));
740
    }
741
 
742
  type = TREE_TYPE (limit);
743
  gcc_assert (limit != var);
744
 
745
  /* For pointer arithmetic, we only keep track of pointer equality
746
     and inequality.  */
747
  if (POINTER_TYPE_P (type) && cond_code != NE_EXPR && cond_code != EQ_EXPR)
748
    {
749
      set_value_range_to_varying (vr_p);
750
      return;
751
    }
752
 
753
  /* If LIMIT is another SSA name and LIMIT has a range of its own,
754
     try to use LIMIT's range to avoid creating symbolic ranges
755
     unnecessarily. */
756
  limit_vr = (TREE_CODE (limit) == SSA_NAME) ? get_value_range (limit) : NULL;
757
 
758
  /* LIMIT's range is only interesting if it has any useful information.  */
759
  if (limit_vr
760
      && (limit_vr->type == VR_UNDEFINED
761
          || limit_vr->type == VR_VARYING
762
          || symbolic_range_p (limit_vr)))
763
    limit_vr = NULL;
764
 
765
  /* Special handling for integral types with super-types.  Some FEs
766
     construct integral types derived from other types and restrict
767
     the range of values these new types may take.
768
 
769
     It may happen that LIMIT is actually smaller than TYPE's minimum
770
     value.  For instance, the Ada FE is generating code like this
771
     during bootstrap:
772
 
773
            D.1480_32 = nam_30 - 300000361;
774
            if (D.1480_32 <= 1) goto <L112>; else goto <L52>;
775
            <L112>:;
776
            D.1480_94 = ASSERT_EXPR <D.1480_32, D.1480_32 <= 1>;
777
 
778
     All the names are of type types__name_id___XDLU_300000000__399999999
779
     which has min == 300000000 and max == 399999999.  This means that
780
     the ASSERT_EXPR would try to create the range [3000000, 1] which
781
     is invalid.
782
 
783
     The fact that the type specifies MIN and MAX values does not
784
     automatically mean that every variable of that type will always
785
     be within that range, so the predicate may well be true at run
786
     time.  If we had symbolic -INF and +INF values, we could
787
     represent this range, but we currently represent -INF and +INF
788
     using the type's min and max values.
789
 
790
     So, the only sensible thing we can do for now is set the
791
     resulting range to VR_VARYING.  TODO, would having symbolic -INF
792
     and +INF values be worth the trouble?  */
793
  if (TREE_CODE (limit) != SSA_NAME
794
      && INTEGRAL_TYPE_P (type)
795
      && TREE_TYPE (type))
796
    {
797
      if (cond_code == LE_EXPR || cond_code == LT_EXPR)
798
        {
799
          tree type_min = TYPE_MIN_VALUE (type);
800
          int cmp = compare_values (limit, type_min);
801
 
802
          /* For < or <= comparisons, if LIMIT is smaller than
803
             TYPE_MIN, set the range to VR_VARYING.  */
804
          if (cmp == -1 || cmp == 0)
805
            {
806
              set_value_range_to_varying (vr_p);
807
              return;
808
            }
809
        }
810
      else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
811
        {
812
          tree type_max = TYPE_MIN_VALUE (type);
813
          int cmp = compare_values (limit, type_max);
814
 
815
          /* For > or >= comparisons, if LIMIT is bigger than
816
             TYPE_MAX, set the range to VR_VARYING.  */
817
          if (cmp == 1 || cmp == 0)
818
            {
819
              set_value_range_to_varying (vr_p);
820
              return;
821
            }
822
        }
823
    }
824
 
825
  /* Initially, the new range has the same set of equivalences of
826
     VAR's range.  This will be revised before returning the final
827
     value.  Since assertions may be chained via mutually exclusive
828
     predicates, we will need to trim the set of equivalences before
829
     we are done.  */
830
  gcc_assert (vr_p->equiv == NULL);
831
  vr_p->equiv = BITMAP_ALLOC (NULL);
832
  add_equivalence (vr_p->equiv, var);
833
 
834
  /* Extract a new range based on the asserted comparison for VAR and
835
     LIMIT's value range.  Notice that if LIMIT has an anti-range, we
836
     will only use it for equality comparisons (EQ_EXPR).  For any
837
     other kind of assertion, we cannot derive a range from LIMIT's
838
     anti-range that can be used to describe the new range.  For
839
     instance, ASSERT_EXPR <x_2, x_2 <= b_4>.  If b_4 is ~[2, 10],
840
     then b_4 takes on the ranges [-INF, 1] and [11, +INF].  There is
841
     no single range for x_2 that could describe LE_EXPR, so we might
842
     as well build the range [b_4, +INF] for it.  */
843
  if (cond_code == EQ_EXPR)
844
    {
845
      enum value_range_type range_type;
846
 
847
      if (limit_vr)
848
        {
849
          range_type = limit_vr->type;
850
          min = limit_vr->min;
851
          max = limit_vr->max;
852
        }
853
      else
854
        {
855
          range_type = VR_RANGE;
856
          min = limit;
857
          max = limit;
858
        }
859
 
860
      set_value_range (vr_p, range_type, min, max, vr_p->equiv);
861
 
862
      /* When asserting the equality VAR == LIMIT and LIMIT is another
863
         SSA name, the new range will also inherit the equivalence set
864
         from LIMIT.  */
865
      if (TREE_CODE (limit) == SSA_NAME)
866
        add_equivalence (vr_p->equiv, limit);
867
    }
868
  else if (cond_code == NE_EXPR)
869
    {
870
      /* As described above, when LIMIT's range is an anti-range and
871
         this assertion is an inequality (NE_EXPR), then we cannot
872
         derive anything from the anti-range.  For instance, if
873
         LIMIT's range was ~[0, 0], the assertion 'VAR != LIMIT' does
874
         not imply that VAR's range is [0, 0].  So, in the case of
875
         anti-ranges, we just assert the inequality using LIMIT and
876
         not its anti-range.
877
 
878
         If LIMIT_VR is a range, we can only use it to build a new
879
         anti-range if LIMIT_VR is a single-valued range.  For
880
         instance, if LIMIT_VR is [0, 1], the predicate
881
         VAR != [0, 1] does not mean that VAR's range is ~[0, 1].
882
         Rather, it means that for value 0 VAR should be ~[0, 0]
883
         and for value 1, VAR should be ~[1, 1].  We cannot
884
         represent these ranges.
885
 
886
         The only situation in which we can build a valid
887
         anti-range is when LIMIT_VR is a single-valued range
888
         (i.e., LIMIT_VR->MIN == LIMIT_VR->MAX).  In that case,
889
         build the anti-range ~[LIMIT_VR->MIN, LIMIT_VR->MAX].  */
890
      if (limit_vr
891
          && limit_vr->type == VR_RANGE
892
          && compare_values (limit_vr->min, limit_vr->max) == 0)
893
        {
894
          min = limit_vr->min;
895
          max = limit_vr->max;
896
        }
897
      else
898
        {
899
          /* In any other case, we cannot use LIMIT's range to build a
900
             valid anti-range.  */
901
          min = max = limit;
902
        }
903
 
904
      /* If MIN and MAX cover the whole range for their type, then
905
         just use the original LIMIT.  */
906
      if (INTEGRAL_TYPE_P (type)
907
          && min == TYPE_MIN_VALUE (type)
908
          && max == TYPE_MAX_VALUE (type))
909
        min = max = limit;
910
 
911
      set_value_range (vr_p, VR_ANTI_RANGE, min, max, vr_p->equiv);
912
    }
913
  else if (cond_code == LE_EXPR || cond_code == LT_EXPR)
914
    {
915
      min = TYPE_MIN_VALUE (type);
916
 
917
      if (limit_vr == NULL || limit_vr->type == VR_ANTI_RANGE)
918
        max = limit;
919
      else
920
        {
921
          /* If LIMIT_VR is of the form [N1, N2], we need to build the
922
             range [MIN, N2] for LE_EXPR and [MIN, N2 - 1] for
923
             LT_EXPR.  */
924
          max = limit_vr->max;
925
        }
926
 
927
      /* For LT_EXPR, we create the range [MIN, MAX - 1].  */
928
      if (cond_code == LT_EXPR)
929
        {
930
          tree one = build_int_cst (type, 1);
931
          max = fold_build2 (MINUS_EXPR, type, max, one);
932
        }
933
 
934
      set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
935
    }
936
  else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
937
    {
938
      max = TYPE_MAX_VALUE (type);
939
 
940
      if (limit_vr == NULL || limit_vr->type == VR_ANTI_RANGE)
941
        min = limit;
942
      else
943
        {
944
          /* If LIMIT_VR is of the form [N1, N2], we need to build the
945
             range [N1, MAX] for GE_EXPR and [N1 + 1, MAX] for
946
             GT_EXPR.  */
947
          min = limit_vr->min;
948
        }
949
 
950
      /* For GT_EXPR, we create the range [MIN + 1, MAX].  */
951
      if (cond_code == GT_EXPR)
952
        {
953
          tree one = build_int_cst (type, 1);
954
          min = fold_build2 (PLUS_EXPR, type, min, one);
955
        }
956
 
957
      set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
958
    }
959
  else
960
    gcc_unreachable ();
961
 
962
  /* If VAR already had a known range, it may happen that the new
963
     range we have computed and VAR's range are not compatible.  For
964
     instance,
965
 
966
        if (p_5 == NULL)
967
          p_6 = ASSERT_EXPR <p_5, p_5 == NULL>;
968
          x_7 = p_6->fld;
969
          p_8 = ASSERT_EXPR <p_6, p_6 != NULL>;
970
 
971
     While the above comes from a faulty program, it will cause an ICE
972
     later because p_8 and p_6 will have incompatible ranges and at
973
     the same time will be considered equivalent.  A similar situation
974
     would arise from
975
 
976
        if (i_5 > 10)
977
          i_6 = ASSERT_EXPR <i_5, i_5 > 10>;
978
          if (i_5 < 5)
979
            i_7 = ASSERT_EXPR <i_6, i_6 < 5>;
980
 
981
     Again i_6 and i_7 will have incompatible ranges.  It would be
982
     pointless to try and do anything with i_7's range because
983
     anything dominated by 'if (i_5 < 5)' will be optimized away.
984
     Note, due to the wa in which simulation proceeds, the statement
985
     i_7 = ASSERT_EXPR <...> we would never be visited because the
986
     conditional 'if (i_5 < 5)' always evaluates to false.  However,
987
     this extra check does not hurt and may protect against future
988
     changes to VRP that may get into a situation similar to the
989
     NULL pointer dereference example.
990
 
991
     Note that these compatibility tests are only needed when dealing
992
     with ranges or a mix of range and anti-range.  If VAR_VR and VR_P
993
     are both anti-ranges, they will always be compatible, because two
994
     anti-ranges will always have a non-empty intersection.  */
995
 
996
  var_vr = get_value_range (var);
997
 
998
  /* We may need to make adjustments when VR_P and VAR_VR are numeric
999
     ranges or anti-ranges.  */
1000
  if (vr_p->type == VR_VARYING
1001
      || vr_p->type == VR_UNDEFINED
1002
      || var_vr->type == VR_VARYING
1003
      || var_vr->type == VR_UNDEFINED
1004
      || symbolic_range_p (vr_p)
1005
      || symbolic_range_p (var_vr))
1006
    goto done;
1007
 
1008
  if (var_vr->type == VR_RANGE && vr_p->type == VR_RANGE)
1009
    {
1010
      /* If the two ranges have a non-empty intersection, we can
1011
         refine the resulting range.  Since the assert expression
1012
         creates an equivalency and at the same time it asserts a
1013
         predicate, we can take the intersection of the two ranges to
1014
         get better precision.  */
1015
      if (value_ranges_intersect_p (var_vr, vr_p))
1016
        {
1017
          /* Use the larger of the two minimums.  */
1018
          if (compare_values (vr_p->min, var_vr->min) == -1)
1019
            min = var_vr->min;
1020
          else
1021
            min = vr_p->min;
1022
 
1023
          /* Use the smaller of the two maximums.  */
1024
          if (compare_values (vr_p->max, var_vr->max) == 1)
1025
            max = var_vr->max;
1026
          else
1027
            max = vr_p->max;
1028
 
1029
          set_value_range (vr_p, vr_p->type, min, max, vr_p->equiv);
1030
        }
1031
      else
1032
        {
1033
          /* The two ranges do not intersect, set the new range to
1034
             VARYING, because we will not be able to do anything
1035
             meaningful with it.  */
1036
          set_value_range_to_varying (vr_p);
1037
        }
1038
    }
1039
  else if ((var_vr->type == VR_RANGE && vr_p->type == VR_ANTI_RANGE)
1040
           || (var_vr->type == VR_ANTI_RANGE && vr_p->type == VR_RANGE))
1041
    {
1042
      /* A range and an anti-range will cancel each other only if
1043
         their ends are the same.  For instance, in the example above,
1044
         p_8's range ~[0, 0] and p_6's range [0, 0] are incompatible,
1045
         so VR_P should be set to VR_VARYING.  */
1046
      if (compare_values (var_vr->min, vr_p->min) == 0
1047
          && compare_values (var_vr->max, vr_p->max) == 0)
1048
        set_value_range_to_varying (vr_p);
1049
    }
1050
 
1051
  /* Remove names from the equivalence set that have ranges
1052
     incompatible with VR_P.  */
1053
done:
1054
  fix_equivalence_set (vr_p);
1055
}
1056
 
1057
 
1058
/* Extract range information from SSA name VAR and store it in VR.  If
1059
   VAR has an interesting range, use it.  Otherwise, create the
1060
   range [VAR, VAR] and return it.  This is useful in situations where
1061
   we may have conditionals testing values of VARYING names.  For
1062
   instance,
1063
 
1064
        x_3 = y_5;
1065
        if (x_3 > y_5)
1066
          ...
1067
 
1068
    Even if y_5 is deemed VARYING, we can determine that x_3 > y_5 is
1069
    always false.  */
1070
 
1071
static void
1072
extract_range_from_ssa_name (value_range_t *vr, tree var)
1073
{
1074
  value_range_t *var_vr = get_value_range (var);
1075
 
1076
  if (var_vr->type != VR_UNDEFINED && var_vr->type != VR_VARYING)
1077
    copy_value_range (vr, var_vr);
1078
  else
1079
    set_value_range (vr, VR_RANGE, var, var, NULL);
1080
 
1081
  add_equivalence (vr->equiv, var);
1082
}
1083
 
1084
 
1085
/* Wrapper around int_const_binop.  If the operation overflows and we
1086
   are not using wrapping arithmetic, then adjust the result to be
1087
   -INF or +INF depending on CODE, VAL1 and VAL2.  */
1088
 
1089
static inline tree
1090
vrp_int_const_binop (enum tree_code code, tree val1, tree val2)
1091
{
1092
  tree res;
1093
 
1094
  if (flag_wrapv)
1095
    return int_const_binop (code, val1, val2, 0);
1096
 
1097
  /* If we are not using wrapping arithmetic, operate symbolically
1098
     on -INF and +INF.  */
1099
  res = int_const_binop (code, val1, val2, 0);
1100
 
1101
  if (TYPE_UNSIGNED (TREE_TYPE (val1)))
1102
    {
1103
      int checkz = compare_values (res, val1);
1104
      bool overflow = false;
1105
 
1106
      /* Ensure that res = val1 [+*] val2 >= val1
1107
         or that res = val1 - val2 <= val1.  */
1108
      if ((code == PLUS_EXPR
1109
           && !(checkz == 1 || checkz == 0))
1110
          || (code == MINUS_EXPR
1111
              && !(checkz == 0 || checkz == -1)))
1112
        {
1113
          overflow = true;
1114
        }
1115
      /* Checking for multiplication overflow is done by dividing the
1116
         output of the multiplication by the first input of the
1117
         multiplication.  If the result of that division operation is
1118
         not equal to the second input of the multiplication, then the
1119
         multiplication overflowed.  */
1120
      else if (code == MULT_EXPR && !integer_zerop (val1))
1121
        {
1122
          tree tmp = int_const_binop (TRUNC_DIV_EXPR,
1123
                                      TYPE_MAX_VALUE (TREE_TYPE (val1)),
1124
                                      val1, 0);
1125
          int check = compare_values (tmp, val2);
1126
 
1127
          if (check != 0)
1128
            overflow = true;
1129
        }
1130
 
1131
      if (overflow)
1132
        {
1133
          res = copy_node (res);
1134
          TREE_OVERFLOW (res) = 1;
1135
        }
1136
 
1137
    }
1138
  else if (TREE_OVERFLOW (res)
1139
           && !TREE_OVERFLOW (val1)
1140
           && !TREE_OVERFLOW (val2))
1141
    {
1142
      /* If the operation overflowed but neither VAL1 nor VAL2 are
1143
         overflown, return -INF or +INF depending on the operation
1144
         and the combination of signs of the operands.  */
1145
      int sgn1 = tree_int_cst_sgn (val1);
1146
      int sgn2 = tree_int_cst_sgn (val2);
1147
 
1148
      /* Notice that we only need to handle the restricted set of
1149
         operations handled by extract_range_from_binary_expr.
1150
         Among them, only multiplication, addition and subtraction
1151
         can yield overflow without overflown operands because we
1152
         are working with integral types only... except in the
1153
         case VAL1 = -INF and VAL2 = -1 which overflows to +INF
1154
         for division too.  */
1155
 
1156
      /* For multiplication, the sign of the overflow is given
1157
         by the comparison of the signs of the operands.  */
1158
      if ((code == MULT_EXPR && sgn1 == sgn2)
1159
          /* For addition, the operands must be of the same sign
1160
             to yield an overflow.  Its sign is therefore that
1161
             of one of the operands, for example the first.  */
1162
          || (code == PLUS_EXPR && sgn1 > 0)
1163
          /* For subtraction, the operands must be of different
1164
             signs to yield an overflow.  Its sign is therefore
1165
             that of the first operand or the opposite of that
1166
             of the second operand.  A first operand of 0 counts
1167
             as positive here, for the corner case 0 - (-INF),
1168
             which overflows, but must yield +INF.  */
1169
          || (code == MINUS_EXPR && sgn1 >= 0)
1170
          /* For division, the only case is -INF / -1 = +INF.  */
1171
          || code == TRUNC_DIV_EXPR
1172
          || code == FLOOR_DIV_EXPR
1173
          || code == CEIL_DIV_EXPR
1174
          || code == EXACT_DIV_EXPR
1175
          || code == ROUND_DIV_EXPR)
1176
        return TYPE_MAX_VALUE (TREE_TYPE (res));
1177
      else
1178
        return TYPE_MIN_VALUE (TREE_TYPE (res));
1179
    }
1180
 
1181
  return res;
1182
}
1183
 
1184
 
1185
/* Extract range information from a binary expression EXPR based on
1186
   the ranges of each of its operands and the expression code.  */
1187
 
1188
static void
1189
extract_range_from_binary_expr (value_range_t *vr, tree expr)
1190
{
1191
  enum tree_code code = TREE_CODE (expr);
1192
  tree op0, op1, min, max;
1193
  int cmp;
1194
  value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
1195
  value_range_t vr1 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
1196
 
1197
  /* Not all binary expressions can be applied to ranges in a
1198
     meaningful way.  Handle only arithmetic operations.  */
1199
  if (code != PLUS_EXPR
1200
      && code != MINUS_EXPR
1201
      && code != MULT_EXPR
1202
      && code != TRUNC_DIV_EXPR
1203
      && code != FLOOR_DIV_EXPR
1204
      && code != CEIL_DIV_EXPR
1205
      && code != EXACT_DIV_EXPR
1206
      && code != ROUND_DIV_EXPR
1207
      && code != MIN_EXPR
1208
      && code != MAX_EXPR
1209
      && code != TRUTH_ANDIF_EXPR
1210
      && code != TRUTH_ORIF_EXPR
1211
      && code != TRUTH_AND_EXPR
1212
      && code != TRUTH_OR_EXPR
1213
      && code != TRUTH_XOR_EXPR)
1214
    {
1215
      set_value_range_to_varying (vr);
1216
      return;
1217
    }
1218
 
1219
  /* Get value ranges for each operand.  For constant operands, create
1220
     a new value range with the operand to simplify processing.  */
1221
  op0 = TREE_OPERAND (expr, 0);
1222
  if (TREE_CODE (op0) == SSA_NAME)
1223
    vr0 = *(get_value_range (op0));
1224
  else if (is_gimple_min_invariant (op0))
1225
    set_value_range (&vr0, VR_RANGE, op0, op0, NULL);
1226
  else
1227
    set_value_range_to_varying (&vr0);
1228
 
1229
  op1 = TREE_OPERAND (expr, 1);
1230
  if (TREE_CODE (op1) == SSA_NAME)
1231
    vr1 = *(get_value_range (op1));
1232
  else if (is_gimple_min_invariant (op1))
1233
    set_value_range (&vr1, VR_RANGE, op1, op1, NULL);
1234
  else
1235
    set_value_range_to_varying (&vr1);
1236
 
1237
  /* If either range is UNDEFINED, so is the result.  */
1238
  if (vr0.type == VR_UNDEFINED || vr1.type == VR_UNDEFINED)
1239
    {
1240
      set_value_range_to_undefined (vr);
1241
      return;
1242
    }
1243
 
1244
  /* Refuse to operate on VARYING ranges, ranges of different kinds
1245
     and symbolic ranges.  TODO, we may be able to derive anti-ranges
1246
     in some cases.  */
1247
  if (vr0.type == VR_VARYING
1248
      || vr1.type == VR_VARYING
1249
      || vr0.type != vr1.type
1250
      || symbolic_range_p (&vr0)
1251
      || symbolic_range_p (&vr1))
1252
    {
1253
      set_value_range_to_varying (vr);
1254
      return;
1255
    }
1256
 
1257
  /* Now evaluate the expression to determine the new range.  */
1258
  if (POINTER_TYPE_P (TREE_TYPE (expr))
1259
      || POINTER_TYPE_P (TREE_TYPE (op0))
1260
      || POINTER_TYPE_P (TREE_TYPE (op1)))
1261
    {
1262
      /* For pointer types, we are really only interested in asserting
1263
         whether the expression evaluates to non-NULL.  FIXME, we used
1264
         to gcc_assert (code == PLUS_EXPR || code == MINUS_EXPR), but
1265
         ivopts is generating expressions with pointer multiplication
1266
         in them.  */
1267
      if (code == PLUS_EXPR)
1268
        {
1269
          if (range_is_nonnull (&vr0) || range_is_nonnull (&vr1))
1270
            set_value_range_to_nonnull (vr, TREE_TYPE (expr));
1271
          else if (range_is_null (&vr0) && range_is_null (&vr1))
1272
            set_value_range_to_null (vr, TREE_TYPE (expr));
1273
          else
1274
            set_value_range_to_varying (vr);
1275
        }
1276
      else
1277
        {
1278
          /* Subtracting from a pointer, may yield 0, so just drop the
1279
             resulting range to varying.  */
1280
          set_value_range_to_varying (vr);
1281
        }
1282
 
1283
      return;
1284
    }
1285
 
1286
  /* For integer ranges, apply the operation to each end of the
1287
     range and see what we end up with.  */
1288
  if (code == TRUTH_ANDIF_EXPR
1289
      || code == TRUTH_ORIF_EXPR
1290
      || code == TRUTH_AND_EXPR
1291
      || code == TRUTH_OR_EXPR
1292
      || code == TRUTH_XOR_EXPR)
1293
    {
1294
      /* Boolean expressions cannot be folded with int_const_binop.  */
1295
      min = fold_binary (code, TREE_TYPE (expr), vr0.min, vr1.min);
1296
      max = fold_binary (code, TREE_TYPE (expr), vr0.max, vr1.max);
1297
    }
1298
  else if (code == PLUS_EXPR
1299
           || code == MIN_EXPR
1300
           || code == MAX_EXPR)
1301
    {
1302
      /* If we have a PLUS_EXPR with two VR_ANTI_RANGEs, drop to
1303
         VR_VARYING.  It would take more effort to compute a precise
1304
         range for such a case.  For example, if we have op0 == 1 and
1305
         op1 == -1 with their ranges both being ~[0,0], we would have
1306
         op0 + op1 == 0, so we cannot claim that the sum is in ~[0,0].
1307
         Note that we are guaranteed to have vr0.type == vr1.type at
1308
         this point.  */
1309
      if (code == PLUS_EXPR && vr0.type == VR_ANTI_RANGE)
1310
        {
1311
          set_value_range_to_varying (vr);
1312
          return;
1313
        }
1314
 
1315
      /* For operations that make the resulting range directly
1316
         proportional to the original ranges, apply the operation to
1317
         the same end of each range.  */
1318
      min = vrp_int_const_binop (code, vr0.min, vr1.min);
1319
      max = vrp_int_const_binop (code, vr0.max, vr1.max);
1320
    }
1321
  else if (code == MULT_EXPR
1322
           || code == TRUNC_DIV_EXPR
1323
           || code == FLOOR_DIV_EXPR
1324
           || code == CEIL_DIV_EXPR
1325
           || code == EXACT_DIV_EXPR
1326
           || code == ROUND_DIV_EXPR)
1327
    {
1328
      tree val[4];
1329
      size_t i;
1330
 
1331
      /* If we have an unsigned MULT_EXPR with two VR_ANTI_RANGEs,
1332
         drop to VR_VARYING.  It would take more effort to compute a
1333
         precise range for such a case.  For example, if we have
1334
         op0 == 65536 and op1 == 65536 with their ranges both being
1335
         ~[0,0] on a 32-bit machine, we would have op0 * op1 == 0, so
1336
         we cannot claim that the product is in ~[0,0].  Note that we
1337
         are guaranteed to have vr0.type == vr1.type at this
1338
         point.  */
1339
      if (code == MULT_EXPR
1340
          && vr0.type == VR_ANTI_RANGE
1341
          && (flag_wrapv || TYPE_UNSIGNED (TREE_TYPE (op0))))
1342
        {
1343
          set_value_range_to_varying (vr);
1344
          return;
1345
        }
1346
 
1347
      /* Multiplications and divisions are a bit tricky to handle,
1348
         depending on the mix of signs we have in the two ranges, we
1349
         need to operate on different values to get the minimum and
1350
         maximum values for the new range.  One approach is to figure
1351
         out all the variations of range combinations and do the
1352
         operations.
1353
 
1354
         However, this involves several calls to compare_values and it
1355
         is pretty convoluted.  It's simpler to do the 4 operations
1356
         (MIN0 OP MIN1, MIN0 OP MAX1, MAX0 OP MIN1 and MAX0 OP MAX0 OP
1357
         MAX1) and then figure the smallest and largest values to form
1358
         the new range.  */
1359
 
1360
      /* Divisions by zero result in a VARYING value.  */
1361
      if (code != MULT_EXPR
1362
          && (vr0.type == VR_ANTI_RANGE || range_includes_zero_p (&vr1)))
1363
        {
1364
          set_value_range_to_varying (vr);
1365
          return;
1366
        }
1367
 
1368
      /* Compute the 4 cross operations.  */
1369
      val[0] = vrp_int_const_binop (code, vr0.min, vr1.min);
1370
 
1371
      val[1] = (vr1.max != vr1.min)
1372
               ? vrp_int_const_binop (code, vr0.min, vr1.max)
1373
               : NULL_TREE;
1374
 
1375
      val[2] = (vr0.max != vr0.min)
1376
               ? vrp_int_const_binop (code, vr0.max, vr1.min)
1377
               : NULL_TREE;
1378
 
1379
      val[3] = (vr0.min != vr0.max && vr1.min != vr1.max)
1380
               ? vrp_int_const_binop (code, vr0.max, vr1.max)
1381
               : NULL_TREE;
1382
 
1383
      /* Set MIN to the minimum of VAL[i] and MAX to the maximum
1384
         of VAL[i].  */
1385
      min = val[0];
1386
      max = val[0];
1387
      for (i = 1; i < 4; i++)
1388
        {
1389
          if (TREE_OVERFLOW (min) || TREE_OVERFLOW (max))
1390
            break;
1391
 
1392
          if (val[i])
1393
            {
1394
              if (TREE_OVERFLOW (val[i]))
1395
                {
1396
                  /* If we found an overflowed value, set MIN and MAX
1397
                     to it so that we set the resulting range to
1398
                     VARYING.  */
1399
                  min = max = val[i];
1400
                  break;
1401
                }
1402
 
1403
              if (compare_values (val[i], min) == -1)
1404
                min = val[i];
1405
 
1406
              if (compare_values (val[i], max) == 1)
1407
                max = val[i];
1408
            }
1409
        }
1410
    }
1411
  else if (code == MINUS_EXPR)
1412
    {
1413
      /* If we have a MINUS_EXPR with two VR_ANTI_RANGEs, drop to
1414
         VR_VARYING.  It would take more effort to compute a precise
1415
         range for such a case.  For example, if we have op0 == 1 and
1416
         op1 == 1 with their ranges both being ~[0,0], we would have
1417
         op0 - op1 == 0, so we cannot claim that the difference is in
1418
         ~[0,0].  Note that we are guaranteed to have
1419
         vr0.type == vr1.type at this point.  */
1420
      if (vr0.type == VR_ANTI_RANGE)
1421
        {
1422
          set_value_range_to_varying (vr);
1423
          return;
1424
        }
1425
 
1426
      /* For MINUS_EXPR, apply the operation to the opposite ends of
1427
         each range.  */
1428
      min = vrp_int_const_binop (code, vr0.min, vr1.max);
1429
      max = vrp_int_const_binop (code, vr0.max, vr1.min);
1430
    }
1431
  else
1432
    gcc_unreachable ();
1433
 
1434
  /* If either MIN or MAX overflowed, then set the resulting range to
1435
     VARYING.  */
1436
  if (TREE_OVERFLOW (min) || TREE_OVERFLOW (max))
1437
    {
1438
      set_value_range_to_varying (vr);
1439
      return;
1440
    }
1441
 
1442
  cmp = compare_values (min, max);
1443
  if (cmp == -2 || cmp == 1)
1444
    {
1445
      /* If the new range has its limits swapped around (MIN > MAX),
1446
         then the operation caused one of them to wrap around, mark
1447
         the new range VARYING.  */
1448
      set_value_range_to_varying (vr);
1449
    }
1450
  else
1451
    set_value_range (vr, vr0.type, min, max, NULL);
1452
}
1453
 
1454
 
1455
/* Extract range information from a unary expression EXPR based on
1456
   the range of its operand and the expression code.  */
1457
 
1458
static void
1459
extract_range_from_unary_expr (value_range_t *vr, tree expr)
1460
{
1461
  enum tree_code code = TREE_CODE (expr);
1462
  tree min, max, op0;
1463
  int cmp;
1464
  value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
1465
 
1466
  /* Refuse to operate on certain unary expressions for which we
1467
     cannot easily determine a resulting range.  */
1468
  if (code == FIX_TRUNC_EXPR
1469
      || code == FIX_CEIL_EXPR
1470
      || code == FIX_FLOOR_EXPR
1471
      || code == FIX_ROUND_EXPR
1472
      || code == FLOAT_EXPR
1473
      || code == BIT_NOT_EXPR
1474
      || code == NON_LVALUE_EXPR
1475
      || code == CONJ_EXPR)
1476
    {
1477
      set_value_range_to_varying (vr);
1478
      return;
1479
    }
1480
 
1481
  /* Get value ranges for the operand.  For constant operands, create
1482
     a new value range with the operand to simplify processing.  */
1483
  op0 = TREE_OPERAND (expr, 0);
1484
  if (TREE_CODE (op0) == SSA_NAME)
1485
    vr0 = *(get_value_range (op0));
1486
  else if (is_gimple_min_invariant (op0))
1487
    set_value_range (&vr0, VR_RANGE, op0, op0, NULL);
1488
  else
1489
    set_value_range_to_varying (&vr0);
1490
 
1491
  /* If VR0 is UNDEFINED, so is the result.  */
1492
  if (vr0.type == VR_UNDEFINED)
1493
    {
1494
      set_value_range_to_undefined (vr);
1495
      return;
1496
    }
1497
 
1498
  /* Refuse to operate on varying and symbolic ranges.  Also, if the
1499
     operand is neither a pointer nor an integral type, set the
1500
     resulting range to VARYING.  TODO, in some cases we may be able
1501
     to derive anti-ranges (like nonzero values).  */
1502
  if (vr0.type == VR_VARYING
1503
      || (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
1504
          && !POINTER_TYPE_P (TREE_TYPE (op0)))
1505
      || symbolic_range_p (&vr0))
1506
    {
1507
      set_value_range_to_varying (vr);
1508
      return;
1509
    }
1510
 
1511
  /* If the expression involves pointers, we are only interested in
1512
     determining if it evaluates to NULL [0, 0] or non-NULL (~[0, 0]).  */
1513
  if (POINTER_TYPE_P (TREE_TYPE (expr)) || POINTER_TYPE_P (TREE_TYPE (op0)))
1514
    {
1515
      if (range_is_nonnull (&vr0) || tree_expr_nonzero_p (expr))
1516
        set_value_range_to_nonnull (vr, TREE_TYPE (expr));
1517
      else if (range_is_null (&vr0))
1518
        set_value_range_to_null (vr, TREE_TYPE (expr));
1519
      else
1520
        set_value_range_to_varying (vr);
1521
 
1522
      return;
1523
    }
1524
 
1525
  /* Handle unary expressions on integer ranges.  */
1526
  if (code == NOP_EXPR || code == CONVERT_EXPR)
1527
    {
1528
      tree inner_type = TREE_TYPE (op0);
1529
      tree outer_type = TREE_TYPE (expr);
1530
 
1531
      /* If VR0 represents a simple range, then try to convert
1532
         the min and max values for the range to the same type
1533
         as OUTER_TYPE.  If the results compare equal to VR0's
1534
         min and max values and the new min is still less than
1535
         or equal to the new max, then we can safely use the newly
1536
         computed range for EXPR.  This allows us to compute
1537
         accurate ranges through many casts.  */
1538
      if (vr0.type == VR_RANGE)
1539
        {
1540
          tree new_min, new_max;
1541
 
1542
          /* Convert VR0's min/max to OUTER_TYPE.  */
1543
          new_min = fold_convert (outer_type, vr0.min);
1544
          new_max = fold_convert (outer_type, vr0.max);
1545
 
1546
          /* Verify the new min/max values are gimple values and
1547
             that they compare equal to VR0's min/max values.  */
1548
          if (is_gimple_val (new_min)
1549
              && is_gimple_val (new_max)
1550
              && tree_int_cst_equal (new_min, vr0.min)
1551
              && tree_int_cst_equal (new_max, vr0.max)
1552
              && compare_values (new_min, new_max) <= 0
1553
              && compare_values (new_min, new_max) >= -1)
1554
            {
1555
              set_value_range (vr, VR_RANGE, new_min, new_max, vr->equiv);
1556
              return;
1557
            }
1558
        }
1559
 
1560
      /* When converting types of different sizes, set the result to
1561
         VARYING.  Things like sign extensions and precision loss may
1562
         change the range.  For instance, if x_3 is of type 'long long
1563
         int' and 'y_5 = (unsigned short) x_3', if x_3 is ~[0, 0], it
1564
         is impossible to know at compile time whether y_5 will be
1565
         ~[0, 0].  */
1566
      if (TYPE_SIZE (inner_type) != TYPE_SIZE (outer_type)
1567
          || TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
1568
        {
1569
          set_value_range_to_varying (vr);
1570
          return;
1571
        }
1572
    }
1573
 
1574
  /* Apply the operation to each end of the range and see what we end
1575
     up with.  */
1576
  if (code == NEGATE_EXPR
1577
      && !TYPE_UNSIGNED (TREE_TYPE (expr)))
1578
    {
1579
      /* NEGATE_EXPR flips the range around.  */
1580
      min = (vr0.max == TYPE_MAX_VALUE (TREE_TYPE (expr)) && !flag_wrapv)
1581
             ? TYPE_MIN_VALUE (TREE_TYPE (expr))
1582
             : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
1583
 
1584
      max = (vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)) && !flag_wrapv)
1585
             ? TYPE_MAX_VALUE (TREE_TYPE (expr))
1586
             : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
1587
    }
1588
  else if (code == ABS_EXPR
1589
           && !TYPE_UNSIGNED (TREE_TYPE (expr)))
1590
    {
1591
      /* -TYPE_MIN_VALUE = TYPE_MIN_VALUE with flag_wrapv so we can't get a
1592
         useful range.  */
1593
      if (flag_wrapv
1594
          && ((vr0.type == VR_RANGE
1595
               && vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)))
1596
              || (vr0.type == VR_ANTI_RANGE
1597
                  && vr0.min != TYPE_MIN_VALUE (TREE_TYPE (expr))
1598
                  && !range_includes_zero_p (&vr0))))
1599
        {
1600
          set_value_range_to_varying (vr);
1601
          return;
1602
        }
1603
 
1604
      /* ABS_EXPR may flip the range around, if the original range
1605
         included negative values.  */
1606
      min = (vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)))
1607
            ? TYPE_MAX_VALUE (TREE_TYPE (expr))
1608
            : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
1609
 
1610
      max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
1611
 
1612
      cmp = compare_values (min, max);
1613
 
1614
      /* If a VR_ANTI_RANGEs contains zero, then we have
1615
         ~[-INF, min(MIN, MAX)].  */
1616
      if (vr0.type == VR_ANTI_RANGE)
1617
        {
1618
          if (range_includes_zero_p (&vr0))
1619
            {
1620
              tree type_min_value = TYPE_MIN_VALUE (TREE_TYPE (expr));
1621
 
1622
              /* Take the lower of the two values.  */
1623
              if (cmp != 1)
1624
                max = min;
1625
 
1626
              /* Create ~[-INF, min (abs(MIN), abs(MAX))]
1627
                 or ~[-INF + 1, min (abs(MIN), abs(MAX))] when
1628
                 flag_wrapv is set and the original anti-range doesn't include
1629
                 TYPE_MIN_VALUE, remember -TYPE_MIN_VALUE = TYPE_MIN_VALUE.  */
1630
              min = (flag_wrapv && vr0.min != type_min_value
1631
                     ? int_const_binop (PLUS_EXPR,
1632
                                        type_min_value,
1633
                                        integer_one_node, 0)
1634
                     : type_min_value);
1635
            }
1636
          else
1637
            {
1638
              /* All else has failed, so create the range [0, INF], even for
1639
                 flag_wrapv since TYPE_MIN_VALUE is in the original
1640
                 anti-range.  */
1641
              vr0.type = VR_RANGE;
1642
              min = build_int_cst (TREE_TYPE (expr), 0);
1643
              max = TYPE_MAX_VALUE (TREE_TYPE (expr));
1644
            }
1645
        }
1646
 
1647
      /* If the range contains zero then we know that the minimum value in the
1648
         range will be zero.  */
1649
      else if (range_includes_zero_p (&vr0))
1650
        {
1651
          if (cmp == 1)
1652
            max = min;
1653
          min = build_int_cst (TREE_TYPE (expr), 0);
1654
        }
1655
      else
1656
        {
1657
          /* If the range was reversed, swap MIN and MAX.  */
1658
          if (cmp == 1)
1659
            {
1660
              tree t = min;
1661
              min = max;
1662
              max = t;
1663
            }
1664
        }
1665
    }
1666
  else
1667
    {
1668
      /* Otherwise, operate on each end of the range.  */
1669
      min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
1670
      max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
1671
    }
1672
 
1673
  cmp = compare_values (min, max);
1674
  if (cmp == -2 || cmp == 1)
1675
    {
1676
      /* If the new range has its limits swapped around (MIN > MAX),
1677
         then the operation caused one of them to wrap around, mark
1678
         the new range VARYING.  */
1679
      set_value_range_to_varying (vr);
1680
    }
1681
  else
1682
    set_value_range (vr, vr0.type, min, max, NULL);
1683
}
1684
 
1685
 
1686
/* Extract range information from a comparison expression EXPR based
1687
   on the range of its operand and the expression code.  */
1688
 
1689
static void
1690
extract_range_from_comparison (value_range_t *vr, tree expr)
1691
{
1692
  tree val = vrp_evaluate_conditional (expr, false);
1693
  if (val)
1694
    {
1695
      /* Since this expression was found on the RHS of an assignment,
1696
         its type may be different from _Bool.  Convert VAL to EXPR's
1697
         type.  */
1698
      val = fold_convert (TREE_TYPE (expr), val);
1699
      set_value_range (vr, VR_RANGE, val, val, vr->equiv);
1700
    }
1701
  else
1702
    set_value_range_to_varying (vr);
1703
}
1704
 
1705
 
1706
/* Try to compute a useful range out of expression EXPR and store it
1707
   in *VR.  */
1708
 
1709
static void
1710
extract_range_from_expr (value_range_t *vr, tree expr)
1711
{
1712
  enum tree_code code = TREE_CODE (expr);
1713
 
1714
  if (code == ASSERT_EXPR)
1715
    extract_range_from_assert (vr, expr);
1716
  else if (code == SSA_NAME)
1717
    extract_range_from_ssa_name (vr, expr);
1718
  else if (TREE_CODE_CLASS (code) == tcc_binary
1719
           || code == TRUTH_ANDIF_EXPR
1720
           || code == TRUTH_ORIF_EXPR
1721
           || code == TRUTH_AND_EXPR
1722
           || code == TRUTH_OR_EXPR
1723
           || code == TRUTH_XOR_EXPR)
1724
    extract_range_from_binary_expr (vr, expr);
1725
  else if (TREE_CODE_CLASS (code) == tcc_unary)
1726
    extract_range_from_unary_expr (vr, expr);
1727
  else if (TREE_CODE_CLASS (code) == tcc_comparison)
1728
    extract_range_from_comparison (vr, expr);
1729
  else if (is_gimple_min_invariant (expr))
1730
    set_value_range (vr, VR_RANGE, expr, expr, NULL);
1731
  else if (vrp_expr_computes_nonzero (expr))
1732
    set_value_range_to_nonnull (vr, TREE_TYPE (expr));
1733
  else
1734
    set_value_range_to_varying (vr);
1735
}
1736
 
1737
/* Given a range VR, a LOOP and a variable VAR, determine whether it
1738
   would be profitable to adjust VR using scalar evolution information
1739
   for VAR.  If so, update VR with the new limits.  */
1740
 
1741
static void
1742
adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt,
1743
                        tree var)
1744
{
1745
  tree init, step, chrec;
1746
  bool init_is_max, unknown_max;
1747
 
1748
  /* TODO.  Don't adjust anti-ranges.  An anti-range may provide
1749
     better opportunities than a regular range, but I'm not sure.  */
1750
  if (vr->type == VR_ANTI_RANGE)
1751
    return;
1752
 
1753
  chrec = instantiate_parameters (loop, analyze_scalar_evolution (loop, var));
1754
  if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
1755
    return;
1756
 
1757
  init = initial_condition_in_loop_num (chrec, loop->num);
1758
  step = evolution_part_in_loop_num (chrec, loop->num);
1759
 
1760
  /* If STEP is symbolic, we can't know whether INIT will be the
1761
     minimum or maximum value in the range.  */
1762
  if (step == NULL_TREE
1763
      || !is_gimple_min_invariant (step))
1764
    return;
1765
 
1766
  /* Do not adjust ranges when chrec may wrap.  */
1767
  if (scev_probably_wraps_p (chrec_type (chrec), init, step, stmt,
1768
                             cfg_loops->parray[CHREC_VARIABLE (chrec)],
1769
                             &init_is_max, &unknown_max)
1770
      || unknown_max)
1771
    return;
1772
 
1773
  if (!POINTER_TYPE_P (TREE_TYPE (init))
1774
      && (vr->type == VR_VARYING || vr->type == VR_UNDEFINED))
1775
    {
1776
      /* For VARYING or UNDEFINED ranges, just about anything we get
1777
         from scalar evolutions should be better.  */
1778
      if (init_is_max)
1779
        set_value_range (vr, VR_RANGE, TYPE_MIN_VALUE (TREE_TYPE (init)),
1780
                         init, vr->equiv);
1781
      else
1782
        set_value_range (vr, VR_RANGE, init, TYPE_MAX_VALUE (TREE_TYPE (init)),
1783
                         vr->equiv);
1784
    }
1785
  else if (vr->type == VR_RANGE)
1786
    {
1787
      tree min = vr->min;
1788
      tree max = vr->max;
1789
 
1790
      if (init_is_max)
1791
        {
1792
          /* INIT is the maximum value.  If INIT is lower than VR->MAX
1793
             but no smaller than VR->MIN, set VR->MAX to INIT.  */
1794
          if (compare_values (init, max) == -1)
1795
            {
1796
              max = init;
1797
 
1798
              /* If we just created an invalid range with the minimum
1799
                 greater than the maximum, take the minimum all the
1800
                 way to -INF.  */
1801
              if (compare_values (min, max) == 1)
1802
                min = TYPE_MIN_VALUE (TREE_TYPE (min));
1803
            }
1804
        }
1805
      else
1806
        {
1807
          /* If INIT is bigger than VR->MIN, set VR->MIN to INIT.  */
1808
          if (compare_values (init, min) == 1)
1809
            {
1810
              min = init;
1811
 
1812
              /* If we just created an invalid range with the minimum
1813
                 greater than the maximum, take the maximum all the
1814
                 way to +INF.  */
1815
              if (compare_values (min, max) == 1)
1816
                max = TYPE_MAX_VALUE (TREE_TYPE (max));
1817
            }
1818
        }
1819
 
1820
      set_value_range (vr, VR_RANGE, min, max, vr->equiv);
1821
    }
1822
}
1823
 
1824
 
1825
/* Given two numeric value ranges VR0, VR1 and a comparison code COMP:
1826
 
1827
   - Return BOOLEAN_TRUE_NODE if VR0 COMP VR1 always returns true for
1828
     all the values in the ranges.
1829
 
1830
   - Return BOOLEAN_FALSE_NODE if the comparison always returns false.
1831
 
1832
   - Return NULL_TREE if it is not always possible to determine the
1833
     value of the comparison.  */
1834
 
1835
 
1836
static tree
1837
compare_ranges (enum tree_code comp, value_range_t *vr0, value_range_t *vr1)
1838
{
1839
  /* VARYING or UNDEFINED ranges cannot be compared.  */
1840
  if (vr0->type == VR_VARYING
1841
      || vr0->type == VR_UNDEFINED
1842
      || vr1->type == VR_VARYING
1843
      || vr1->type == VR_UNDEFINED)
1844
    return NULL_TREE;
1845
 
1846
  /* Anti-ranges need to be handled separately.  */
1847
  if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
1848
    {
1849
      /* If both are anti-ranges, then we cannot compute any
1850
         comparison.  */
1851
      if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
1852
        return NULL_TREE;
1853
 
1854
      /* These comparisons are never statically computable.  */
1855
      if (comp == GT_EXPR
1856
          || comp == GE_EXPR
1857
          || comp == LT_EXPR
1858
          || comp == LE_EXPR)
1859
        return NULL_TREE;
1860
 
1861
      /* Equality can be computed only between a range and an
1862
         anti-range.  ~[VAL1, VAL2] == [VAL1, VAL2] is always false.  */
1863
      if (vr0->type == VR_RANGE)
1864
        {
1865
          /* To simplify processing, make VR0 the anti-range.  */
1866
          value_range_t *tmp = vr0;
1867
          vr0 = vr1;
1868
          vr1 = tmp;
1869
        }
1870
 
1871
      gcc_assert (comp == NE_EXPR || comp == EQ_EXPR);
1872
 
1873
      if (compare_values (vr0->min, vr1->min) == 0
1874
          && compare_values (vr0->max, vr1->max) == 0)
1875
        return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
1876
 
1877
      return NULL_TREE;
1878
    }
1879
 
1880
  /* Simplify processing.  If COMP is GT_EXPR or GE_EXPR, switch the
1881
     operands around and change the comparison code.  */
1882
  if (comp == GT_EXPR || comp == GE_EXPR)
1883
    {
1884
      value_range_t *tmp;
1885
      comp = (comp == GT_EXPR) ? LT_EXPR : LE_EXPR;
1886
      tmp = vr0;
1887
      vr0 = vr1;
1888
      vr1 = tmp;
1889
    }
1890
 
1891
  if (comp == EQ_EXPR)
1892
    {
1893
      /* Equality may only be computed if both ranges represent
1894
         exactly one value.  */
1895
      if (compare_values (vr0->min, vr0->max) == 0
1896
          && compare_values (vr1->min, vr1->max) == 0)
1897
        {
1898
          int cmp_min = compare_values (vr0->min, vr1->min);
1899
          int cmp_max = compare_values (vr0->max, vr1->max);
1900
          if (cmp_min == 0 && cmp_max == 0)
1901
            return boolean_true_node;
1902
          else if (cmp_min != -2 && cmp_max != -2)
1903
            return boolean_false_node;
1904
        }
1905
 
1906
      return NULL_TREE;
1907
    }
1908
  else if (comp == NE_EXPR)
1909
    {
1910
      int cmp1, cmp2;
1911
 
1912
      /* If VR0 is completely to the left or completely to the right
1913
         of VR1, they are always different.  Notice that we need to
1914
         make sure that both comparisons yield similar results to
1915
         avoid comparing values that cannot be compared at
1916
         compile-time.  */
1917
      cmp1 = compare_values (vr0->max, vr1->min);
1918
      cmp2 = compare_values (vr0->min, vr1->max);
1919
      if ((cmp1 == -1 && cmp2 == -1) || (cmp1 == 1 && cmp2 == 1))
1920
        return boolean_true_node;
1921
 
1922
      /* If VR0 and VR1 represent a single value and are identical,
1923
         return false.  */
1924
      else if (compare_values (vr0->min, vr0->max) == 0
1925
               && compare_values (vr1->min, vr1->max) == 0
1926
               && compare_values (vr0->min, vr1->min) == 0
1927
               && compare_values (vr0->max, vr1->max) == 0)
1928
        return boolean_false_node;
1929
 
1930
      /* Otherwise, they may or may not be different.  */
1931
      else
1932
        return NULL_TREE;
1933
    }
1934
  else if (comp == LT_EXPR || comp == LE_EXPR)
1935
    {
1936
      int tst;
1937
 
1938
      /* If VR0 is to the left of VR1, return true.  */
1939
      tst = compare_values (vr0->max, vr1->min);
1940
      if ((comp == LT_EXPR && tst == -1)
1941
          || (comp == LE_EXPR && (tst == -1 || tst == 0)))
1942
        return boolean_true_node;
1943
 
1944
      /* If VR0 is to the right of VR1, return false.  */
1945
      tst = compare_values (vr0->min, vr1->max);
1946
      if ((comp == LT_EXPR && (tst == 0 || tst == 1))
1947
          || (comp == LE_EXPR && tst == 1))
1948
        return boolean_false_node;
1949
 
1950
      /* Otherwise, we don't know.  */
1951
      return NULL_TREE;
1952
    }
1953
 
1954
  gcc_unreachable ();
1955
}
1956
 
1957
 
1958
/* Given a value range VR, a value VAL and a comparison code COMP, return
1959
   BOOLEAN_TRUE_NODE if VR COMP VAL always returns true for all the
1960
   values in VR.  Return BOOLEAN_FALSE_NODE if the comparison
1961
   always returns false.  Return NULL_TREE if it is not always
1962
   possible to determine the value of the comparison.  */
1963
 
1964
static tree
1965
compare_range_with_value (enum tree_code comp, value_range_t *vr, tree val)
1966
{
1967
  if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
1968
    return NULL_TREE;
1969
 
1970
  /* Anti-ranges need to be handled separately.  */
1971
  if (vr->type == VR_ANTI_RANGE)
1972
    {
1973
      /* For anti-ranges, the only predicates that we can compute at
1974
         compile time are equality and inequality.  */
1975
      if (comp == GT_EXPR
1976
          || comp == GE_EXPR
1977
          || comp == LT_EXPR
1978
          || comp == LE_EXPR)
1979
        return NULL_TREE;
1980
 
1981
      /* ~[VAL_1, VAL_2] OP VAL is known if VAL_1 <= VAL <= VAL_2.  */
1982
      if (value_inside_range (val, vr) == 1)
1983
        return (comp == NE_EXPR) ? boolean_true_node : boolean_false_node;
1984
 
1985
      return NULL_TREE;
1986
    }
1987
 
1988
  if (comp == EQ_EXPR)
1989
    {
1990
      /* EQ_EXPR may only be computed if VR represents exactly
1991
         one value.  */
1992
      if (compare_values (vr->min, vr->max) == 0)
1993
        {
1994
          int cmp = compare_values (vr->min, val);
1995
          if (cmp == 0)
1996
            return boolean_true_node;
1997
          else if (cmp == -1 || cmp == 1 || cmp == 2)
1998
            return boolean_false_node;
1999
        }
2000
      else if (compare_values (val, vr->min) == -1
2001
               || compare_values (vr->max, val) == -1)
2002
        return boolean_false_node;
2003
 
2004
      return NULL_TREE;
2005
    }
2006
  else if (comp == NE_EXPR)
2007
    {
2008
      /* If VAL is not inside VR, then they are always different.  */
2009
      if (compare_values (vr->max, val) == -1
2010
          || compare_values (vr->min, val) == 1)
2011
        return boolean_true_node;
2012
 
2013
      /* If VR represents exactly one value equal to VAL, then return
2014
         false.  */
2015
      if (compare_values (vr->min, vr->max) == 0
2016
          && compare_values (vr->min, val) == 0)
2017
        return boolean_false_node;
2018
 
2019
      /* Otherwise, they may or may not be different.  */
2020
      return NULL_TREE;
2021
    }
2022
  else if (comp == LT_EXPR || comp == LE_EXPR)
2023
    {
2024
      int tst;
2025
 
2026
      /* If VR is to the left of VAL, return true.  */
2027
      tst = compare_values (vr->max, val);
2028
      if ((comp == LT_EXPR && tst == -1)
2029
          || (comp == LE_EXPR && (tst == -1 || tst == 0)))
2030
        return boolean_true_node;
2031
 
2032
      /* If VR is to the right of VAL, return false.  */
2033
      tst = compare_values (vr->min, val);
2034
      if ((comp == LT_EXPR && (tst == 0 || tst == 1))
2035
          || (comp == LE_EXPR && tst == 1))
2036
        return boolean_false_node;
2037
 
2038
      /* Otherwise, we don't know.  */
2039
      return NULL_TREE;
2040
    }
2041
  else if (comp == GT_EXPR || comp == GE_EXPR)
2042
    {
2043
      int tst;
2044
 
2045
      /* If VR is to the right of VAL, return true.  */
2046
      tst = compare_values (vr->min, val);
2047
      if ((comp == GT_EXPR && tst == 1)
2048
          || (comp == GE_EXPR && (tst == 0 || tst == 1)))
2049
        return boolean_true_node;
2050
 
2051
      /* If VR is to the left of VAL, return false.  */
2052
      tst = compare_values (vr->max, val);
2053
      if ((comp == GT_EXPR && (tst == -1 || tst == 0))
2054
          || (comp == GE_EXPR && tst == -1))
2055
        return boolean_false_node;
2056
 
2057
      /* Otherwise, we don't know.  */
2058
      return NULL_TREE;
2059
    }
2060
 
2061
  gcc_unreachable ();
2062
}
2063
 
2064
 
2065
/* Debugging dumps.  */
2066
 
2067
void dump_value_range (FILE *, value_range_t *);
2068
void debug_value_range (value_range_t *);
2069
void dump_all_value_ranges (FILE *);
2070
void debug_all_value_ranges (void);
2071
void dump_vr_equiv (FILE *, bitmap);
2072
void debug_vr_equiv (bitmap);
2073
 
2074
 
2075
/* Dump value range VR to FILE.  */
2076
 
2077
void
2078
dump_value_range (FILE *file, value_range_t *vr)
2079
{
2080
  if (vr == NULL)
2081
    fprintf (file, "[]");
2082
  else if (vr->type == VR_UNDEFINED)
2083
    fprintf (file, "UNDEFINED");
2084
  else if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
2085
    {
2086
      tree type = TREE_TYPE (vr->min);
2087
 
2088
      fprintf (file, "%s[", (vr->type == VR_ANTI_RANGE) ? "~" : "");
2089
 
2090
      if (INTEGRAL_TYPE_P (type)
2091
          && !TYPE_UNSIGNED (type)
2092
          && vr->min == TYPE_MIN_VALUE (type))
2093
        fprintf (file, "-INF");
2094
      else
2095
        print_generic_expr (file, vr->min, 0);
2096
 
2097
      fprintf (file, ", ");
2098
 
2099
      if (INTEGRAL_TYPE_P (type)
2100
          && vr->max == TYPE_MAX_VALUE (type))
2101
        fprintf (file, "+INF");
2102
      else
2103
        print_generic_expr (file, vr->max, 0);
2104
 
2105
      fprintf (file, "]");
2106
 
2107
      if (vr->equiv)
2108
        {
2109
          bitmap_iterator bi;
2110
          unsigned i, c = 0;
2111
 
2112
          fprintf (file, "  EQUIVALENCES: { ");
2113
 
2114
          EXECUTE_IF_SET_IN_BITMAP (vr->equiv, 0, i, bi)
2115
            {
2116
              print_generic_expr (file, ssa_name (i), 0);
2117
              fprintf (file, " ");
2118
              c++;
2119
            }
2120
 
2121
          fprintf (file, "} (%u elements)", c);
2122
        }
2123
    }
2124
  else if (vr->type == VR_VARYING)
2125
    fprintf (file, "VARYING");
2126
  else
2127
    fprintf (file, "INVALID RANGE");
2128
}
2129
 
2130
 
2131
/* Dump value range VR to stderr.  */
2132
 
2133
void
2134
debug_value_range (value_range_t *vr)
2135
{
2136
  dump_value_range (stderr, vr);
2137
}
2138
 
2139
 
2140
/* Dump value ranges of all SSA_NAMEs to FILE.  */
2141
 
2142
void
2143
dump_all_value_ranges (FILE *file)
2144
{
2145
  size_t i;
2146
 
2147
  for (i = 0; i < num_ssa_names; i++)
2148
    {
2149
      if (vr_value[i])
2150
        {
2151
          print_generic_expr (file, ssa_name (i), 0);
2152
          fprintf (file, ": ");
2153
          dump_value_range (file, vr_value[i]);
2154
          fprintf (file, "\n");
2155
        }
2156
    }
2157
 
2158
  fprintf (file, "\n");
2159
}
2160
 
2161
 
2162
/* Dump all value ranges to stderr.  */
2163
 
2164
void
2165
debug_all_value_ranges (void)
2166
{
2167
  dump_all_value_ranges (stderr);
2168
}
2169
 
2170
 
2171
/* Given a COND_EXPR COND of the form 'V OP W', and an SSA name V,
2172
   create a new SSA name N and return the assertion assignment
2173
   'V = ASSERT_EXPR <V, V OP W>'.  */
2174
 
2175
static tree
2176
build_assert_expr_for (tree cond, tree v)
2177
{
2178
  tree n, assertion;
2179
 
2180
  gcc_assert (TREE_CODE (v) == SSA_NAME);
2181
  n = duplicate_ssa_name (v, NULL_TREE);
2182
 
2183
  if (COMPARISON_CLASS_P (cond))
2184
    {
2185
      tree a = build (ASSERT_EXPR, TREE_TYPE (v), v, cond);
2186
      assertion = build (MODIFY_EXPR, TREE_TYPE (v), n, a);
2187
    }
2188
  else if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
2189
    {
2190
      /* Given !V, build the assignment N = false.  */
2191
      tree op0 = TREE_OPERAND (cond, 0);
2192
      gcc_assert (op0 == v);
2193
      assertion = build (MODIFY_EXPR, TREE_TYPE (v), n, boolean_false_node);
2194
    }
2195
  else if (TREE_CODE (cond) == SSA_NAME)
2196
    {
2197
      /* Given V, build the assignment N = true.  */
2198
      gcc_assert (v == cond);
2199
      assertion = build (MODIFY_EXPR, TREE_TYPE (v), n, boolean_true_node);
2200
    }
2201
  else
2202
    gcc_unreachable ();
2203
 
2204
  SSA_NAME_DEF_STMT (n) = assertion;
2205
 
2206
  /* The new ASSERT_EXPR, creates a new SSA name that replaces the
2207
     operand of the ASSERT_EXPR. Register the new name and the old one
2208
     in the replacement table so that we can fix the SSA web after
2209
     adding all the ASSERT_EXPRs.  */
2210
  register_new_name_mapping (n, v);
2211
 
2212
  return assertion;
2213
}
2214
 
2215
 
2216
/* Return false if EXPR is a predicate expression involving floating
2217
   point values.  */
2218
 
2219
static inline bool
2220
fp_predicate (tree expr)
2221
{
2222
  return (COMPARISON_CLASS_P (expr)
2223
          && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 0))));
2224
}
2225
 
2226
 
2227
/* If the range of values taken by OP can be inferred after STMT executes,
2228
   return the comparison code (COMP_CODE_P) and value (VAL_P) that
2229
   describes the inferred range.  Return true if a range could be
2230
   inferred.  */
2231
 
2232
static bool
2233
infer_value_range (tree stmt, tree op, enum tree_code *comp_code_p, tree *val_p)
2234
{
2235
  *val_p = NULL_TREE;
2236
  *comp_code_p = ERROR_MARK;
2237
 
2238
  /* Do not attempt to infer anything in names that flow through
2239
     abnormal edges.  */
2240
  if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
2241
    return false;
2242
 
2243
  /* Similarly, don't infer anything from statements that may throw
2244
     exceptions.  */
2245
  if (tree_could_throw_p (stmt))
2246
    return false;
2247
 
2248
  /* If STMT is the last statement of a basic block with no
2249
     successors, there is no point inferring anything about any of its
2250
     operands.  We would not be able to find a proper insertion point
2251
     for the assertion, anyway.  */
2252
  if (stmt_ends_bb_p (stmt) && EDGE_COUNT (bb_for_stmt (stmt)->succs) == 0)
2253
    return false;
2254
 
2255
  if (POINTER_TYPE_P (TREE_TYPE (op)))
2256
    {
2257
      bool is_store;
2258
      unsigned num_uses, num_derefs;
2259
 
2260
      count_uses_and_derefs (op, stmt, &num_uses, &num_derefs, &is_store);
2261
      if (num_derefs > 0 && flag_delete_null_pointer_checks)
2262
        {
2263
          /* We can only assume that a pointer dereference will yield
2264
             non-NULL if -fdelete-null-pointer-checks is enabled.  */
2265
          *val_p = build_int_cst (TREE_TYPE (op), 0);
2266
          *comp_code_p = NE_EXPR;
2267
          return true;
2268
        }
2269
    }
2270
 
2271
  return false;
2272
}
2273
 
2274
 
2275
void dump_asserts_for (FILE *, tree);
2276
void debug_asserts_for (tree);
2277
void dump_all_asserts (FILE *);
2278
void debug_all_asserts (void);
2279
 
2280
/* Dump all the registered assertions for NAME to FILE.  */
2281
 
2282
void
2283
dump_asserts_for (FILE *file, tree name)
2284
{
2285
  assert_locus_t loc;
2286
 
2287
  fprintf (file, "Assertions to be inserted for ");
2288
  print_generic_expr (file, name, 0);
2289
  fprintf (file, "\n");
2290
 
2291
  loc = asserts_for[SSA_NAME_VERSION (name)];
2292
  while (loc)
2293
    {
2294
      fprintf (file, "\t");
2295
      print_generic_expr (file, bsi_stmt (loc->si), 0);
2296
      fprintf (file, "\n\tBB #%d", loc->bb->index);
2297
      if (loc->e)
2298
        {
2299
          fprintf (file, "\n\tEDGE %d->%d", loc->e->src->index,
2300
                   loc->e->dest->index);
2301
          dump_edge_info (file, loc->e, 0);
2302
        }
2303
      fprintf (file, "\n\tPREDICATE: ");
2304
      print_generic_expr (file, name, 0);
2305
      fprintf (file, " %s ", tree_code_name[(int)loc->comp_code]);
2306
      print_generic_expr (file, loc->val, 0);
2307
      fprintf (file, "\n\n");
2308
      loc = loc->next;
2309
    }
2310
 
2311
  fprintf (file, "\n");
2312
}
2313
 
2314
 
2315
/* Dump all the registered assertions for NAME to stderr.  */
2316
 
2317
void
2318
debug_asserts_for (tree name)
2319
{
2320
  dump_asserts_for (stderr, name);
2321
}
2322
 
2323
 
2324
/* Dump all the registered assertions for all the names to FILE.  */
2325
 
2326
void
2327
dump_all_asserts (FILE *file)
2328
{
2329
  unsigned i;
2330
  bitmap_iterator bi;
2331
 
2332
  fprintf (file, "\nASSERT_EXPRs to be inserted\n\n");
2333
  EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
2334
    dump_asserts_for (file, ssa_name (i));
2335
  fprintf (file, "\n");
2336
}
2337
 
2338
 
2339
/* Dump all the registered assertions for all the names to stderr.  */
2340
 
2341
void
2342
debug_all_asserts (void)
2343
{
2344
  dump_all_asserts (stderr);
2345
}
2346
 
2347
 
2348
/* If NAME doesn't have an ASSERT_EXPR registered for asserting
2349
   'NAME COMP_CODE VAL' at a location that dominates block BB or
2350
   E->DEST, then register this location as a possible insertion point
2351
   for ASSERT_EXPR <NAME, NAME COMP_CODE VAL>.
2352
 
2353
   BB, E and SI provide the exact insertion point for the new
2354
   ASSERT_EXPR.  If BB is NULL, then the ASSERT_EXPR is to be inserted
2355
   on edge E.  Otherwise, if E is NULL, the ASSERT_EXPR is inserted on
2356
   BB.  If SI points to a COND_EXPR or a SWITCH_EXPR statement, then E
2357
   must not be NULL.  */
2358
 
2359
static void
2360
register_new_assert_for (tree name,
2361
                         enum tree_code comp_code,
2362
                         tree val,
2363
                         basic_block bb,
2364
                         edge e,
2365
                         block_stmt_iterator si)
2366
{
2367
  assert_locus_t n, loc, last_loc;
2368
  bool found;
2369
  basic_block dest_bb;
2370
 
2371
#if defined ENABLE_CHECKING
2372
  gcc_assert (bb == NULL || e == NULL);
2373
 
2374
  if (e == NULL)
2375
    gcc_assert (TREE_CODE (bsi_stmt (si)) != COND_EXPR
2376
                && TREE_CODE (bsi_stmt (si)) != SWITCH_EXPR);
2377
#endif
2378
 
2379
  /* The new assertion A will be inserted at BB or E.  We need to
2380
     determine if the new location is dominated by a previously
2381
     registered location for A.  If we are doing an edge insertion,
2382
     assume that A will be inserted at E->DEST.  Note that this is not
2383
     necessarily true.
2384
 
2385
     If E is a critical edge, it will be split.  But even if E is
2386
     split, the new block will dominate the same set of blocks that
2387
     E->DEST dominates.
2388
 
2389
     The reverse, however, is not true, blocks dominated by E->DEST
2390
     will not be dominated by the new block created to split E.  So,
2391
     if the insertion location is on a critical edge, we will not use
2392
     the new location to move another assertion previously registered
2393
     at a block dominated by E->DEST.  */
2394
  dest_bb = (bb) ? bb : e->dest;
2395
 
2396
  /* If NAME already has an ASSERT_EXPR registered for COMP_CODE and
2397
     VAL at a block dominating DEST_BB, then we don't need to insert a new
2398
     one.  Similarly, if the same assertion already exists at a block
2399
     dominated by DEST_BB and the new location is not on a critical
2400
     edge, then update the existing location for the assertion (i.e.,
2401
     move the assertion up in the dominance tree).
2402
 
2403
     Note, this is implemented as a simple linked list because there
2404
     should not be more than a handful of assertions registered per
2405
     name.  If this becomes a performance problem, a table hashed by
2406
     COMP_CODE and VAL could be implemented.  */
2407
  loc = asserts_for[SSA_NAME_VERSION (name)];
2408
  last_loc = loc;
2409
  found = false;
2410
  while (loc)
2411
    {
2412
      if (loc->comp_code == comp_code
2413
          && (loc->val == val
2414
              || operand_equal_p (loc->val, val, 0)))
2415
        {
2416
          /* If the assertion NAME COMP_CODE VAL has already been
2417
             registered at a basic block that dominates DEST_BB, then
2418
             we don't need to insert the same assertion again.  Note
2419
             that we don't check strict dominance here to avoid
2420
             replicating the same assertion inside the same basic
2421
             block more than once (e.g., when a pointer is
2422
             dereferenced several times inside a block).
2423
 
2424
             An exception to this rule are edge insertions.  If the
2425
             new assertion is to be inserted on edge E, then it will
2426
             dominate all the other insertions that we may want to
2427
             insert in DEST_BB.  So, if we are doing an edge
2428
             insertion, don't do this dominance check.  */
2429
          if (e == NULL
2430
              && dominated_by_p (CDI_DOMINATORS, dest_bb, loc->bb))
2431
            return;
2432
 
2433
          /* Otherwise, if E is not a critical edge and DEST_BB
2434
             dominates the existing location for the assertion, move
2435
             the assertion up in the dominance tree by updating its
2436
             location information.  */
2437
          if ((e == NULL || !EDGE_CRITICAL_P (e))
2438
              && dominated_by_p (CDI_DOMINATORS, loc->bb, dest_bb))
2439
            {
2440
              loc->bb = dest_bb;
2441
              loc->e = e;
2442
              loc->si = si;
2443
              return;
2444
            }
2445
        }
2446
 
2447
      /* Update the last node of the list and move to the next one.  */
2448
      last_loc = loc;
2449
      loc = loc->next;
2450
    }
2451
 
2452
  /* If we didn't find an assertion already registered for
2453
     NAME COMP_CODE VAL, add a new one at the end of the list of
2454
     assertions associated with NAME.  */
2455
  n = xmalloc (sizeof (*n));
2456
  n->bb = dest_bb;
2457
  n->e = e;
2458
  n->si = si;
2459
  n->comp_code = comp_code;
2460
  n->val = val;
2461
  n->next = NULL;
2462
 
2463
  if (last_loc)
2464
    last_loc->next = n;
2465
  else
2466
    asserts_for[SSA_NAME_VERSION (name)] = n;
2467
 
2468
  bitmap_set_bit (need_assert_for, SSA_NAME_VERSION (name));
2469
}
2470
 
2471
 
2472
/* Try to register an edge assertion for SSA name NAME on edge E for
2473
   the conditional jump pointed to by SI.  Return true if an assertion
2474
   for NAME could be registered.  */
2475
 
2476
static bool
2477
register_edge_assert_for (tree name, edge e, block_stmt_iterator si)
2478
{
2479
  tree val, stmt;
2480
  enum tree_code comp_code;
2481
 
2482
  stmt = bsi_stmt (si);
2483
 
2484
  /* Do not attempt to infer anything in names that flow through
2485
     abnormal edges.  */
2486
  if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
2487
    return false;
2488
 
2489
  /* If NAME was not found in the sub-graph reachable from E, then
2490
     there's nothing to do.  */
2491
  if (!TEST_BIT (found_in_subgraph, SSA_NAME_VERSION (name)))
2492
    return false;
2493
 
2494
  /* We found a use of NAME in the sub-graph rooted at E->DEST.
2495
     Register an assertion for NAME according to the value that NAME
2496
     takes on edge E.  */
2497
  if (TREE_CODE (stmt) == COND_EXPR)
2498
    {
2499
      /* If BB ends in a COND_EXPR then NAME then we should insert
2500
         the original predicate on EDGE_TRUE_VALUE and the
2501
         opposite predicate on EDGE_FALSE_VALUE.  */
2502
      tree cond = COND_EXPR_COND (stmt);
2503
      bool is_else_edge = (e->flags & EDGE_FALSE_VALUE) != 0;
2504
 
2505
      /* Predicates may be a single SSA name or NAME OP VAL.  */
2506
      if (cond == name)
2507
        {
2508
          /* If the predicate is a name, it must be NAME, in which
2509
             case we create the predicate NAME == true or
2510
             NAME == false accordingly.  */
2511
          comp_code = EQ_EXPR;
2512
          val = (is_else_edge) ? boolean_false_node : boolean_true_node;
2513
        }
2514
      else
2515
        {
2516
          /* Otherwise, we have a comparison of the form NAME COMP VAL
2517
             or VAL COMP NAME.  */
2518
          if (name == TREE_OPERAND (cond, 1))
2519
            {
2520
              /* If the predicate is of the form VAL COMP NAME, flip
2521
                 COMP around because we need to register NAME as the
2522
                 first operand in the predicate.  */
2523
              comp_code = swap_tree_comparison (TREE_CODE (cond));
2524
              val = TREE_OPERAND (cond, 0);
2525
            }
2526
          else
2527
            {
2528
              /* The comparison is of the form NAME COMP VAL, so the
2529
                 comparison code remains unchanged.  */
2530
              comp_code = TREE_CODE (cond);
2531
              val = TREE_OPERAND (cond, 1);
2532
            }
2533
 
2534
          /* If we are inserting the assertion on the ELSE edge, we
2535
             need to invert the sign comparison.  */
2536
          if (is_else_edge)
2537
            comp_code = invert_tree_comparison (comp_code, 0);
2538
 
2539
          /* Do not register always-false predicates.  FIXME, this
2540
             works around a limitation in fold() when dealing with
2541
             enumerations.  Given 'enum { N1, N2 } x;', fold will not
2542
             fold 'if (x > N2)' to 'if (0)'.  */
2543
          if ((comp_code == GT_EXPR || comp_code == LT_EXPR)
2544
              && (INTEGRAL_TYPE_P (TREE_TYPE (val))
2545
                  || SCALAR_FLOAT_TYPE_P (TREE_TYPE (val))))
2546
            {
2547
              tree min = TYPE_MIN_VALUE (TREE_TYPE (val));
2548
              tree max = TYPE_MAX_VALUE (TREE_TYPE (val));
2549
 
2550
              if (comp_code == GT_EXPR && compare_values (val, max) == 0)
2551
                return false;
2552
 
2553
              if (comp_code == LT_EXPR && compare_values (val, min) == 0)
2554
                return false;
2555
            }
2556
        }
2557
    }
2558
  else
2559
    {
2560
      /* FIXME.  Handle SWITCH_EXPR.  */
2561
      gcc_unreachable ();
2562
    }
2563
 
2564
  register_new_assert_for (name, comp_code, val, NULL, e, si);
2565
  return true;
2566
}
2567
 
2568
 
2569
static bool find_assert_locations (basic_block bb);
2570
 
2571
/* Determine whether the outgoing edges of BB should receive an
2572
   ASSERT_EXPR for each of the operands of BB's last statement.  The
2573
   last statement of BB must be a COND_EXPR or a SWITCH_EXPR.
2574
 
2575
   If any of the sub-graphs rooted at BB have an interesting use of
2576
   the predicate operands, an assert location node is added to the
2577
   list of assertions for the corresponding operands.  */
2578
 
2579
static bool
2580
find_conditional_asserts (basic_block bb)
2581
{
2582
  bool need_assert;
2583
  block_stmt_iterator last_si;
2584
  tree op, last;
2585
  edge_iterator ei;
2586
  edge e;
2587
  ssa_op_iter iter;
2588
 
2589
  need_assert = false;
2590
  last_si = bsi_last (bb);
2591
  last = bsi_stmt (last_si);
2592
 
2593
  /* Look for uses of the operands in each of the sub-graphs
2594
     rooted at BB.  We need to check each of the outgoing edges
2595
     separately, so that we know what kind of ASSERT_EXPR to
2596
     insert.  */
2597
  FOR_EACH_EDGE (e, ei, bb->succs)
2598
    {
2599
      if (e->dest == bb)
2600
        continue;
2601
 
2602
      /* Remove the COND_EXPR operands from the FOUND_IN_SUBGRAPH bitmap.
2603
         Otherwise, when we finish traversing each of the sub-graphs, we
2604
         won't know whether the variables were found in the sub-graphs or
2605
         if they had been found in a block upstream from BB.  */
2606
      FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
2607
        RESET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
2608
 
2609
      /* Traverse the strictly dominated sub-graph rooted at E->DEST
2610
         to determine if any of the operands in the conditional
2611
         predicate are used.  */
2612
      if (e->dest != bb)
2613
        need_assert |= find_assert_locations (e->dest);
2614
 
2615
      /* Register the necessary assertions for each operand in the
2616
         conditional predicate.  */
2617
      FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
2618
        need_assert |= register_edge_assert_for (op, e, last_si);
2619
    }
2620
 
2621
  /* Finally, indicate that we have found the operands in the
2622
     conditional.  */
2623
  FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
2624
    SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
2625
 
2626
  return need_assert;
2627
}
2628
 
2629
 
2630
/* Traverse all the statements in block BB looking for statements that
2631
   may generate useful assertions for the SSA names in their operand.
2632
   If a statement produces a useful assertion A for name N_i, then the
2633
   list of assertions already generated for N_i is scanned to
2634
   determine if A is actually needed.
2635
 
2636
   If N_i already had the assertion A at a location dominating the
2637
   current location, then nothing needs to be done.  Otherwise, the
2638
   new location for A is recorded instead.
2639
 
2640
   1- For every statement S in BB, all the variables used by S are
2641
      added to bitmap FOUND_IN_SUBGRAPH.
2642
 
2643
   2- If statement S uses an operand N in a way that exposes a known
2644
      value range for N, then if N was not already generated by an
2645
      ASSERT_EXPR, create a new assert location for N.  For instance,
2646
      if N is a pointer and the statement dereferences it, we can
2647
      assume that N is not NULL.
2648
 
2649
   3- COND_EXPRs are a special case of #2.  We can derive range
2650
      information from the predicate but need to insert different
2651
      ASSERT_EXPRs for each of the sub-graphs rooted at the
2652
      conditional block.  If the last statement of BB is a conditional
2653
      expression of the form 'X op Y', then
2654
 
2655
      a) Remove X and Y from the set FOUND_IN_SUBGRAPH.
2656
 
2657
      b) If the conditional is the only entry point to the sub-graph
2658
         corresponding to the THEN_CLAUSE, recurse into it.  On
2659
         return, if X and/or Y are marked in FOUND_IN_SUBGRAPH, then
2660
         an ASSERT_EXPR is added for the corresponding variable.
2661
 
2662
      c) Repeat step (b) on the ELSE_CLAUSE.
2663
 
2664
      d) Mark X and Y in FOUND_IN_SUBGRAPH.
2665
 
2666
      For instance,
2667
 
2668
            if (a == 9)
2669
              b = a;
2670
            else
2671
              b = c + 1;
2672
 
2673
      In this case, an assertion on the THEN clause is useful to
2674
      determine that 'a' is always 9 on that edge.  However, an assertion
2675
      on the ELSE clause would be unnecessary.
2676
 
2677
   4- If BB does not end in a conditional expression, then we recurse
2678
      into BB's dominator children.
2679
 
2680
   At the end of the recursive traversal, every SSA name will have a
2681
   list of locations where ASSERT_EXPRs should be added.  When a new
2682
   location for name N is found, it is registered by calling
2683
   register_new_assert_for.  That function keeps track of all the
2684
   registered assertions to prevent adding unnecessary assertions.
2685
   For instance, if a pointer P_4 is dereferenced more than once in a
2686
   dominator tree, only the location dominating all the dereference of
2687
   P_4 will receive an ASSERT_EXPR.
2688
 
2689
   If this function returns true, then it means that there are names
2690
   for which we need to generate ASSERT_EXPRs.  Those assertions are
2691
   inserted by process_assert_insertions.
2692
 
2693
   TODO.  Handle SWITCH_EXPR.  */
2694
 
2695
static bool
2696
find_assert_locations (basic_block bb)
2697
{
2698
  block_stmt_iterator si;
2699
  tree last, phi;
2700
  bool need_assert;
2701
  basic_block son;
2702
 
2703
  if (TEST_BIT (blocks_visited, bb->index))
2704
    return false;
2705
 
2706
  SET_BIT (blocks_visited, bb->index);
2707
 
2708
  need_assert = false;
2709
 
2710
  /* Traverse all PHI nodes in BB marking used operands.  */
2711
  for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
2712
    {
2713
      use_operand_p arg_p;
2714
      ssa_op_iter i;
2715
 
2716
      FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_USE)
2717
        {
2718
          tree arg = USE_FROM_PTR (arg_p);
2719
          if (TREE_CODE (arg) == SSA_NAME)
2720
            {
2721
              gcc_assert (is_gimple_reg (PHI_RESULT (phi)));
2722
              SET_BIT (found_in_subgraph, SSA_NAME_VERSION (arg));
2723
            }
2724
        }
2725
    }
2726
 
2727
  /* Traverse all the statements in BB marking used names and looking
2728
     for statements that may infer assertions for their used operands.  */
2729
  last = NULL_TREE;
2730
  for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
2731
    {
2732
      tree stmt, op;
2733
      ssa_op_iter i;
2734
 
2735
      stmt = bsi_stmt (si);
2736
 
2737
      /* See if we can derive an assertion for any of STMT's operands.  */
2738
      FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
2739
        {
2740
          tree value;
2741
          enum tree_code comp_code;
2742
 
2743
          /* Mark OP in bitmap FOUND_IN_SUBGRAPH.  If STMT is inside
2744
             the sub-graph of a conditional block, when we return from
2745
             this recursive walk, our parent will use the
2746
             FOUND_IN_SUBGRAPH bitset to determine if one of the
2747
             operands it was looking for was present in the sub-graph.  */
2748
          SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
2749
 
2750
          /* If OP is used only once, namely in this STMT, don't
2751
             bother creating an ASSERT_EXPR for it.  Such an
2752
             ASSERT_EXPR would do nothing but increase compile time.
2753
             Experiments show that with this simple check, we can save
2754
             more than 20% of ASSERT_EXPRs.  */
2755
          if (has_single_use (op))
2756
            continue;
2757
 
2758
          /* If OP is used in such a way that we can infer a value
2759
             range for it, and we don't find a previous assertion for
2760
             it, create a new assertion location node for OP.  */
2761
          if (infer_value_range (stmt, op, &comp_code, &value))
2762
            {
2763
              register_new_assert_for (op, comp_code, value, bb, NULL, si);
2764
              need_assert = true;
2765
            }
2766
        }
2767
 
2768
      /* Remember the last statement of the block.  */
2769
      last = stmt;
2770
    }
2771
 
2772
  /* If BB's last statement is a conditional expression
2773
     involving integer operands, recurse into each of the sub-graphs
2774
     rooted at BB to determine if we need to add ASSERT_EXPRs.  */
2775
  if (last
2776
      && TREE_CODE (last) == COND_EXPR
2777
      && !fp_predicate (COND_EXPR_COND (last))
2778
      && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
2779
    need_assert |= find_conditional_asserts (bb);
2780
 
2781
  /* Recurse into the dominator children of BB.  */
2782
  for (son = first_dom_son (CDI_DOMINATORS, bb);
2783
       son;
2784
       son = next_dom_son (CDI_DOMINATORS, son))
2785
    need_assert |= find_assert_locations (son);
2786
 
2787
  return need_assert;
2788
}
2789
 
2790
 
2791
/* Create an ASSERT_EXPR for NAME and insert it in the location
2792
   indicated by LOC.  Return true if we made any edge insertions.  */
2793
 
2794
static bool
2795
process_assert_insertions_for (tree name, assert_locus_t loc)
2796
{
2797
  /* Build the comparison expression NAME_i COMP_CODE VAL.  */
2798
  tree stmt, cond, assert_expr;
2799
  edge_iterator ei;
2800
  edge e;
2801
 
2802
  cond = build (loc->comp_code, boolean_type_node, name, loc->val);
2803
  assert_expr = build_assert_expr_for (cond, name);
2804
 
2805
  if (loc->e)
2806
    {
2807
      /* We have been asked to insert the assertion on an edge.  This
2808
         is used only by COND_EXPR and SWITCH_EXPR assertions.  */
2809
#if defined ENABLE_CHECKING
2810
      gcc_assert (TREE_CODE (bsi_stmt (loc->si)) == COND_EXPR
2811
          || TREE_CODE (bsi_stmt (loc->si)) == SWITCH_EXPR);
2812
#endif
2813
 
2814
      bsi_insert_on_edge (loc->e, assert_expr);
2815
      return true;
2816
    }
2817
 
2818
  /* Otherwise, we can insert right after LOC->SI iff the
2819
     statement must not be the last statement in the block.  */
2820
  stmt = bsi_stmt (loc->si);
2821
  if (!stmt_ends_bb_p (stmt))
2822
    {
2823
      bsi_insert_after (&loc->si, assert_expr, BSI_SAME_STMT);
2824
      return false;
2825
    }
2826
 
2827
  /* If STMT must be the last statement in BB, we can only insert new
2828
     assertions on the non-abnormal edge out of BB.  Note that since
2829
     STMT is not control flow, there may only be one non-abnormal edge
2830
     out of BB.  */
2831
  FOR_EACH_EDGE (e, ei, loc->bb->succs)
2832
    if (!(e->flags & EDGE_ABNORMAL))
2833
      {
2834
        bsi_insert_on_edge (e, assert_expr);
2835
        return true;
2836
      }
2837
 
2838
  gcc_unreachable ();
2839
}
2840
 
2841
 
2842
/* Process all the insertions registered for every name N_i registered
2843
   in NEED_ASSERT_FOR.  The list of assertions to be inserted are
2844
   found in ASSERTS_FOR[i].  */
2845
 
2846
static void
2847
process_assert_insertions (void)
2848
{
2849
  unsigned i;
2850
  bitmap_iterator bi;
2851
  bool update_edges_p = false;
2852
  int num_asserts = 0;
2853
 
2854
  if (dump_file && (dump_flags & TDF_DETAILS))
2855
    dump_all_asserts (dump_file);
2856
 
2857
  EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
2858
    {
2859
      assert_locus_t loc = asserts_for[i];
2860
      gcc_assert (loc);
2861
 
2862
      while (loc)
2863
        {
2864
          assert_locus_t next = loc->next;
2865
          update_edges_p |= process_assert_insertions_for (ssa_name (i), loc);
2866
          free (loc);
2867
          loc = next;
2868
          num_asserts++;
2869
        }
2870
    }
2871
 
2872
  if (update_edges_p)
2873
    bsi_commit_edge_inserts ();
2874
 
2875
  if (dump_file && (dump_flags & TDF_STATS))
2876
    fprintf (dump_file, "\nNumber of ASSERT_EXPR expressions inserted: %d\n\n",
2877
             num_asserts);
2878
}
2879
 
2880
 
2881
/* Traverse the flowgraph looking for conditional jumps to insert range
2882
   expressions.  These range expressions are meant to provide information
2883
   to optimizations that need to reason in terms of value ranges.  They
2884
   will not be expanded into RTL.  For instance, given:
2885
 
2886
   x = ...
2887
   y = ...
2888
   if (x < y)
2889
     y = x - 2;
2890
   else
2891
     x = y + 3;
2892
 
2893
   this pass will transform the code into:
2894
 
2895
   x = ...
2896
   y = ...
2897
   if (x < y)
2898
    {
2899
      x = ASSERT_EXPR <x, x < y>
2900
      y = x - 2
2901
    }
2902
   else
2903
    {
2904
      y = ASSERT_EXPR <y, x <= y>
2905
      x = y + 3
2906
    }
2907
 
2908
   The idea is that once copy and constant propagation have run, other
2909
   optimizations will be able to determine what ranges of values can 'x'
2910
   take in different paths of the code, simply by checking the reaching
2911
   definition of 'x'.  */
2912
 
2913
static void
2914
insert_range_assertions (void)
2915
{
2916
  edge e;
2917
  edge_iterator ei;
2918
  bool update_ssa_p;
2919
 
2920
  found_in_subgraph = sbitmap_alloc (num_ssa_names);
2921
  sbitmap_zero (found_in_subgraph);
2922
 
2923
  blocks_visited = sbitmap_alloc (last_basic_block);
2924
  sbitmap_zero (blocks_visited);
2925
 
2926
  need_assert_for = BITMAP_ALLOC (NULL);
2927
  asserts_for = xmalloc (num_ssa_names * sizeof (assert_locus_t));
2928
  memset (asserts_for, 0, num_ssa_names * sizeof (assert_locus_t));
2929
 
2930
  calculate_dominance_info (CDI_DOMINATORS);
2931
 
2932
  update_ssa_p = false;
2933
  FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
2934
    if (find_assert_locations (e->dest))
2935
      update_ssa_p = true;
2936
 
2937
  if (update_ssa_p)
2938
    {
2939
      process_assert_insertions ();
2940
      update_ssa (TODO_update_ssa_no_phi);
2941
    }
2942
 
2943
  if (dump_file && (dump_flags & TDF_DETAILS))
2944
    {
2945
      fprintf (dump_file, "\nSSA form after inserting ASSERT_EXPRs\n");
2946
      dump_function_to_file (current_function_decl, dump_file, dump_flags);
2947
    }
2948
 
2949
  sbitmap_free (found_in_subgraph);
2950
  free (asserts_for);
2951
  BITMAP_FREE (need_assert_for);
2952
}
2953
 
2954
 
2955
/* Convert range assertion expressions into the implied copies and
2956
   copy propagate away the copies.  Doing the trivial copy propagation
2957
   here avoids the need to run the full copy propagation pass after
2958
   VRP.
2959
 
2960
   FIXME, this will eventually lead to copy propagation removing the
2961
   names that had useful range information attached to them.  For
2962
   instance, if we had the assertion N_i = ASSERT_EXPR <N_j, N_j > 3>,
2963
   then N_i will have the range [3, +INF].
2964
 
2965
   However, by converting the assertion into the implied copy
2966
   operation N_i = N_j, we will then copy-propagate N_j into the uses
2967
   of N_i and lose the range information.  We may want to hold on to
2968
   ASSERT_EXPRs a little while longer as the ranges could be used in
2969
   things like jump threading.
2970
 
2971
   The problem with keeping ASSERT_EXPRs around is that passes after
2972
   VRP need to handle them appropriately.
2973
 
2974
   Another approach would be to make the range information a first
2975
   class property of the SSA_NAME so that it can be queried from
2976
   any pass.  This is made somewhat more complex by the need for
2977
   multiple ranges to be associated with one SSA_NAME.  */
2978
 
2979
static void
2980
remove_range_assertions (void)
2981
{
2982
  basic_block bb;
2983
  block_stmt_iterator si;
2984
 
2985
  /* Note that the BSI iterator bump happens at the bottom of the
2986
     loop and no bump is necessary if we're removing the statement
2987
     referenced by the current BSI.  */
2988
  FOR_EACH_BB (bb)
2989
    for (si = bsi_start (bb); !bsi_end_p (si);)
2990
      {
2991
        tree stmt = bsi_stmt (si);
2992
 
2993
        if (TREE_CODE (stmt) == MODIFY_EXPR
2994
            && TREE_CODE (TREE_OPERAND (stmt, 1)) == ASSERT_EXPR)
2995
          {
2996
            tree rhs = TREE_OPERAND (stmt, 1);
2997
            tree cond = fold (ASSERT_EXPR_COND (rhs));
2998
            use_operand_p use_p;
2999
            imm_use_iterator iter;
3000
 
3001
            gcc_assert (cond != boolean_false_node);
3002
            TREE_OPERAND (stmt, 1) = ASSERT_EXPR_VAR (rhs);
3003
            update_stmt (stmt);
3004
 
3005
            /* The statement is now a copy.  Propagate the RHS into
3006
               every use of the LHS.  */
3007
            FOR_EACH_IMM_USE_SAFE (use_p, iter, TREE_OPERAND (stmt, 0))
3008
              {
3009
                SET_USE (use_p, ASSERT_EXPR_VAR (rhs));
3010
                update_stmt (USE_STMT (use_p));
3011
              }
3012
 
3013
            /* And finally, remove the copy, it is not needed.  */
3014
            bsi_remove (&si);
3015
          }
3016
        else
3017
          bsi_next (&si);
3018
      }
3019
 
3020
  sbitmap_free (blocks_visited);
3021
}
3022
 
3023
 
3024
/* Return true if STMT is interesting for VRP.  */
3025
 
3026
static bool
3027
stmt_interesting_for_vrp (tree stmt)
3028
{
3029
  if (TREE_CODE (stmt) == PHI_NODE
3030
      && is_gimple_reg (PHI_RESULT (stmt))
3031
      && (INTEGRAL_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))
3032
          || POINTER_TYPE_P (TREE_TYPE (PHI_RESULT (stmt)))))
3033
    return true;
3034
  else if (TREE_CODE (stmt) == MODIFY_EXPR)
3035
    {
3036
      tree lhs = TREE_OPERAND (stmt, 0);
3037
 
3038
      if (TREE_CODE (lhs) == SSA_NAME
3039
          && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
3040
              || POINTER_TYPE_P (TREE_TYPE (lhs)))
3041
          && ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
3042
        return true;
3043
    }
3044
  else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
3045
    return true;
3046
 
3047
  return false;
3048
}
3049
 
3050
 
3051
/* Initialize local data structures for VRP.  */
3052
 
3053
static void
3054
vrp_initialize (void)
3055
{
3056
  basic_block bb;
3057
 
3058
  vr_value = xmalloc (num_ssa_names * sizeof (value_range_t *));
3059
  memset (vr_value, 0, num_ssa_names * sizeof (value_range_t *));
3060
 
3061
  FOR_EACH_BB (bb)
3062
    {
3063
      block_stmt_iterator si;
3064
      tree phi;
3065
 
3066
      for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
3067
        {
3068
          if (!stmt_interesting_for_vrp (phi))
3069
            {
3070
              tree lhs = PHI_RESULT (phi);
3071
              set_value_range_to_varying (get_value_range (lhs));
3072
              DONT_SIMULATE_AGAIN (phi) = true;
3073
            }
3074
          else
3075
            DONT_SIMULATE_AGAIN (phi) = false;
3076
        }
3077
 
3078
      for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
3079
        {
3080
          tree stmt = bsi_stmt (si);
3081
 
3082
          if (!stmt_interesting_for_vrp (stmt))
3083
            {
3084
              ssa_op_iter i;
3085
              tree def;
3086
              FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
3087
                set_value_range_to_varying (get_value_range (def));
3088
              DONT_SIMULATE_AGAIN (stmt) = true;
3089
            }
3090
          else
3091
            {
3092
              DONT_SIMULATE_AGAIN (stmt) = false;
3093
            }
3094
        }
3095
    }
3096
}
3097
 
3098
 
3099
/* Visit assignment STMT.  If it produces an interesting range, record
3100
   the SSA name in *OUTPUT_P.  */
3101
 
3102
static enum ssa_prop_result
3103
vrp_visit_assignment (tree stmt, tree *output_p)
3104
{
3105
  tree lhs, rhs, def;
3106
  ssa_op_iter iter;
3107
 
3108
  lhs = TREE_OPERAND (stmt, 0);
3109
  rhs = TREE_OPERAND (stmt, 1);
3110
 
3111
  /* We only keep track of ranges in integral and pointer types.  */
3112
  if (TREE_CODE (lhs) == SSA_NAME
3113
      && (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
3114
          || POINTER_TYPE_P (TREE_TYPE (lhs))))
3115
    {
3116
      struct loop *l;
3117
      value_range_t new_vr = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
3118
 
3119
      extract_range_from_expr (&new_vr, rhs);
3120
 
3121
      /* If STMT is inside a loop, we may be able to know something
3122
         else about the range of LHS by examining scalar evolution
3123
         information.  */
3124
      if (cfg_loops && (l = loop_containing_stmt (stmt)))
3125
        adjust_range_with_scev (&new_vr, l, stmt, lhs);
3126
 
3127
      if (update_value_range (lhs, &new_vr))
3128
        {
3129
          *output_p = lhs;
3130
 
3131
          if (dump_file && (dump_flags & TDF_DETAILS))
3132
            {
3133
              fprintf (dump_file, "Found new range for ");
3134
              print_generic_expr (dump_file, lhs, 0);
3135
              fprintf (dump_file, ": ");
3136
              dump_value_range (dump_file, &new_vr);
3137
              fprintf (dump_file, "\n\n");
3138
            }
3139
 
3140
          if (new_vr.type == VR_VARYING)
3141
            return SSA_PROP_VARYING;
3142
 
3143
          return SSA_PROP_INTERESTING;
3144
        }
3145
 
3146
      return SSA_PROP_NOT_INTERESTING;
3147
    }
3148
 
3149
  /* Every other statement produces no useful ranges.  */
3150
  FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
3151
    set_value_range_to_varying (get_value_range (def));
3152
 
3153
  return SSA_PROP_VARYING;
3154
}
3155
 
3156
 
3157
/* Compare all the value ranges for names equivalent to VAR with VAL
3158
   using comparison code COMP.  Return the same value returned by
3159
   compare_range_with_value.  */
3160
 
3161
static tree
3162
compare_name_with_value (enum tree_code comp, tree var, tree val)
3163
{
3164
  bitmap_iterator bi;
3165
  unsigned i;
3166
  bitmap e;
3167
  tree retval, t;
3168
 
3169
  t = retval = NULL_TREE;
3170
 
3171
  /* Get the set of equivalences for VAR.  */
3172
  e = get_value_range (var)->equiv;
3173
 
3174
  /* Add VAR to its own set of equivalences so that VAR's value range
3175
     is processed by this loop (otherwise, we would have to replicate
3176
     the body of the loop just to check VAR's value range).  */
3177
  bitmap_set_bit (e, SSA_NAME_VERSION (var));
3178
 
3179
  EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
3180
    {
3181
      value_range_t equiv_vr = *(vr_value[i]);
3182
 
3183
      /* If name N_i does not have a valid range, use N_i as its own
3184
         range.  This allows us to compare against names that may
3185
         have N_i in their ranges.  */
3186
      if (equiv_vr.type == VR_VARYING || equiv_vr.type == VR_UNDEFINED)
3187
        {
3188
          equiv_vr.type = VR_RANGE;
3189
          equiv_vr.min = ssa_name (i);
3190
          equiv_vr.max = ssa_name (i);
3191
        }
3192
 
3193
      t = compare_range_with_value (comp, &equiv_vr, val);
3194
      if (t)
3195
        {
3196
          /* All the ranges should compare the same against VAL.  */
3197
          gcc_assert (retval == NULL || t == retval);
3198
          retval = t;
3199
        }
3200
    }
3201
 
3202
  /* Remove VAR from its own equivalence set.  */
3203
  bitmap_clear_bit (e, SSA_NAME_VERSION (var));
3204
 
3205
  if (retval)
3206
    return retval;
3207
 
3208
  /* We couldn't find a non-NULL value for the predicate.  */
3209
  return NULL_TREE;
3210
}
3211
 
3212
 
3213
/* Given a comparison code COMP and names N1 and N2, compare all the
3214
   ranges equivalent to N1 against all the ranges equivalent to N2
3215
   to determine the value of N1 COMP N2.  Return the same value
3216
   returned by compare_ranges.  */
3217
 
3218
static tree
3219
compare_names (enum tree_code comp, tree n1, tree n2)
3220
{
3221
  tree t, retval;
3222
  bitmap e1, e2;
3223
  bitmap_iterator bi1, bi2;
3224
  unsigned i1, i2;
3225
 
3226
  /* Compare the ranges of every name equivalent to N1 against the
3227
     ranges of every name equivalent to N2.  */
3228
  e1 = get_value_range (n1)->equiv;
3229
  e2 = get_value_range (n2)->equiv;
3230
 
3231
  /* Add N1 and N2 to their own set of equivalences to avoid
3232
     duplicating the body of the loop just to check N1 and N2
3233
     ranges.  */
3234
  bitmap_set_bit (e1, SSA_NAME_VERSION (n1));
3235
  bitmap_set_bit (e2, SSA_NAME_VERSION (n2));
3236
 
3237
  /* If the equivalence sets have a common intersection, then the two
3238
     names can be compared without checking their ranges.  */
3239
  if (bitmap_intersect_p (e1, e2))
3240
    {
3241
      bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
3242
      bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
3243
 
3244
      return (comp == EQ_EXPR || comp == GE_EXPR || comp == LE_EXPR)
3245
             ? boolean_true_node
3246
             : boolean_false_node;
3247
    }
3248
 
3249
  /* Otherwise, compare all the equivalent ranges.  First, add N1 and
3250
     N2 to their own set of equivalences to avoid duplicating the body
3251
     of the loop just to check N1 and N2 ranges.  */
3252
  EXECUTE_IF_SET_IN_BITMAP (e1, 0, i1, bi1)
3253
    {
3254
      value_range_t vr1 = *(vr_value[i1]);
3255
 
3256
      /* If the range is VARYING or UNDEFINED, use the name itself.  */
3257
      if (vr1.type == VR_VARYING || vr1.type == VR_UNDEFINED)
3258
        {
3259
          vr1.type = VR_RANGE;
3260
          vr1.min = ssa_name (i1);
3261
          vr1.max = ssa_name (i1);
3262
        }
3263
 
3264
      t = retval = NULL_TREE;
3265
      EXECUTE_IF_SET_IN_BITMAP (e2, 0, i2, bi2)
3266
        {
3267
          value_range_t vr2 = *(vr_value[i2]);
3268
 
3269
          if (vr2.type == VR_VARYING || vr2.type == VR_UNDEFINED)
3270
            {
3271
              vr2.type = VR_RANGE;
3272
              vr2.min = ssa_name (i2);
3273
              vr2.max = ssa_name (i2);
3274
            }
3275
 
3276
          t = compare_ranges (comp, &vr1, &vr2);
3277
          if (t)
3278
            {
3279
              /* All the ranges in the equivalent sets should compare
3280
                 the same.  */
3281
              gcc_assert (retval == NULL || t == retval);
3282
              retval = t;
3283
            }
3284
        }
3285
 
3286
      if (retval)
3287
        {
3288
          bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
3289
          bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
3290
          return retval;
3291
        }
3292
    }
3293
 
3294
  /* None of the equivalent ranges are useful in computing this
3295
     comparison.  */
3296
  bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
3297
  bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
3298
  return NULL_TREE;
3299
}
3300
 
3301
 
3302
/* Given a conditional predicate COND, try to determine if COND yields
3303
   true or false based on the value ranges of its operands.  Return
3304
   BOOLEAN_TRUE_NODE if the conditional always evaluates to true,
3305
   BOOLEAN_FALSE_NODE if the conditional always evaluates to false, and,
3306
   NULL if the conditional cannot be evaluated at compile time.
3307
 
3308
   If USE_EQUIV_P is true, the ranges of all the names equivalent with
3309
   the operands in COND are used when trying to compute its value.
3310
   This is only used during final substitution.  During propagation,
3311
   we only check the range of each variable and not its equivalents.  */
3312
 
3313
tree
3314
vrp_evaluate_conditional (tree cond, bool use_equiv_p)
3315
{
3316
  gcc_assert (TREE_CODE (cond) == SSA_NAME
3317
              || TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison);
3318
 
3319
  if (TREE_CODE (cond) == SSA_NAME)
3320
    {
3321
      value_range_t *vr;
3322
      tree retval;
3323
 
3324
      if (use_equiv_p)
3325
        retval = compare_name_with_value (NE_EXPR, cond, boolean_false_node);
3326
      else
3327
        {
3328
          value_range_t *vr = get_value_range (cond);
3329
          retval = compare_range_with_value (NE_EXPR, vr, boolean_false_node);
3330
        }
3331
 
3332
      /* If COND has a known boolean range, return it.  */
3333
      if (retval)
3334
        return retval;
3335
 
3336
      /* Otherwise, if COND has a symbolic range of exactly one value,
3337
         return it.  */
3338
      vr = get_value_range (cond);
3339
      if (vr->type == VR_RANGE && vr->min == vr->max)
3340
        return vr->min;
3341
    }
3342
  else
3343
    {
3344
      tree op0 = TREE_OPERAND (cond, 0);
3345
      tree op1 = TREE_OPERAND (cond, 1);
3346
 
3347
      /* We only deal with integral and pointer types.  */
3348
      if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
3349
          && !POINTER_TYPE_P (TREE_TYPE (op0)))
3350
        return NULL_TREE;
3351
 
3352
      if (use_equiv_p)
3353
        {
3354
          if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME)
3355
            return compare_names (TREE_CODE (cond), op0, op1);
3356
          else if (TREE_CODE (op0) == SSA_NAME)
3357
            return compare_name_with_value (TREE_CODE (cond), op0, op1);
3358
          else if (TREE_CODE (op1) == SSA_NAME)
3359
            return compare_name_with_value (
3360
                    swap_tree_comparison (TREE_CODE (cond)), op1, op0);
3361
        }
3362
      else
3363
        {
3364
          value_range_t *vr0, *vr1;
3365
 
3366
          vr0 = (TREE_CODE (op0) == SSA_NAME) ? get_value_range (op0) : NULL;
3367
          vr1 = (TREE_CODE (op1) == SSA_NAME) ? get_value_range (op1) : NULL;
3368
 
3369
          if (vr0 && vr1)
3370
            return compare_ranges (TREE_CODE (cond), vr0, vr1);
3371
          else if (vr0 && vr1 == NULL)
3372
            return compare_range_with_value (TREE_CODE (cond), vr0, op1);
3373
          else if (vr0 == NULL && vr1)
3374
            return compare_range_with_value (
3375
                    swap_tree_comparison (TREE_CODE (cond)), vr1, op0);
3376
        }
3377
    }
3378
 
3379
  /* Anything else cannot be computed statically.  */
3380
  return NULL_TREE;
3381
}
3382
 
3383
 
3384
/* Visit conditional statement STMT.  If we can determine which edge
3385
   will be taken out of STMT's basic block, record it in
3386
   *TAKEN_EDGE_P and return SSA_PROP_INTERESTING.  Otherwise, return
3387
   SSA_PROP_VARYING.  */
3388
 
3389
static enum ssa_prop_result
3390
vrp_visit_cond_stmt (tree stmt, edge *taken_edge_p)
3391
{
3392
  tree cond, val;
3393
 
3394
  *taken_edge_p = NULL;
3395
 
3396
  /* FIXME.  Handle SWITCH_EXPRs.  But first, the assert pass needs to
3397
     add ASSERT_EXPRs for them.  */
3398
  if (TREE_CODE (stmt) == SWITCH_EXPR)
3399
    return SSA_PROP_VARYING;
3400
 
3401
  cond = COND_EXPR_COND (stmt);
3402
 
3403
  if (dump_file && (dump_flags & TDF_DETAILS))
3404
    {
3405
      tree use;
3406
      ssa_op_iter i;
3407
 
3408
      fprintf (dump_file, "\nVisiting conditional with predicate: ");
3409
      print_generic_expr (dump_file, cond, 0);
3410
      fprintf (dump_file, "\nWith known ranges\n");
3411
 
3412
      FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
3413
        {
3414
          fprintf (dump_file, "\t");
3415
          print_generic_expr (dump_file, use, 0);
3416
          fprintf (dump_file, ": ");
3417
          dump_value_range (dump_file, vr_value[SSA_NAME_VERSION (use)]);
3418
        }
3419
 
3420
      fprintf (dump_file, "\n");
3421
    }
3422
 
3423
  /* Compute the value of the predicate COND by checking the known
3424
     ranges of each of its operands.
3425
 
3426
     Note that we cannot evaluate all the equivalent ranges here
3427
     because those ranges may not yet be final and with the current
3428
     propagation strategy, we cannot determine when the value ranges
3429
     of the names in the equivalence set have changed.
3430
 
3431
     For instance, given the following code fragment
3432
 
3433
        i_5 = PHI <8, i_13>
3434
        ...
3435
        i_14 = ASSERT_EXPR <i_5, i_5 != 0>
3436
        if (i_14 == 1)
3437
          ...
3438
 
3439
     Assume that on the first visit to i_14, i_5 has the temporary
3440
     range [8, 8] because the second argument to the PHI function is
3441
     not yet executable.  We derive the range ~[0, 0] for i_14 and the
3442
     equivalence set { i_5 }.  So, when we visit 'if (i_14 == 1)' for
3443
     the first time, since i_14 is equivalent to the range [8, 8], we
3444
     determine that the predicate is always false.
3445
 
3446
     On the next round of propagation, i_13 is determined to be
3447
     VARYING, which causes i_5 to drop down to VARYING.  So, another
3448
     visit to i_14 is scheduled.  In this second visit, we compute the
3449
     exact same range and equivalence set for i_14, namely ~[0, 0] and
3450
     { i_5 }.  But we did not have the previous range for i_5
3451
     registered, so vrp_visit_assignment thinks that the range for
3452
     i_14 has not changed.  Therefore, the predicate 'if (i_14 == 1)'
3453
     is not visited again, which stops propagation from visiting
3454
     statements in the THEN clause of that if().
3455
 
3456
     To properly fix this we would need to keep the previous range
3457
     value for the names in the equivalence set.  This way we would've
3458
     discovered that from one visit to the other i_5 changed from
3459
     range [8, 8] to VR_VARYING.
3460
 
3461
     However, fixing this apparent limitation may not be worth the
3462
     additional checking.  Testing on several code bases (GCC, DLV,
3463
     MICO, TRAMP3D and SPEC2000) showed that doing this results in
3464
     4 more predicates folded in SPEC.  */
3465
  val = vrp_evaluate_conditional (cond, false);
3466
  if (val)
3467
    *taken_edge_p = find_taken_edge (bb_for_stmt (stmt), val);
3468
 
3469
  if (dump_file && (dump_flags & TDF_DETAILS))
3470
    {
3471
      fprintf (dump_file, "\nPredicate evaluates to: ");
3472
      if (val == NULL_TREE)
3473
        fprintf (dump_file, "DON'T KNOW\n");
3474
      else
3475
        print_generic_stmt (dump_file, val, 0);
3476
    }
3477
 
3478
  return (*taken_edge_p) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING;
3479
}
3480
 
3481
 
3482
/* Evaluate statement STMT.  If the statement produces a useful range,
3483
   return SSA_PROP_INTERESTING and record the SSA name with the
3484
   interesting range into *OUTPUT_P.
3485
 
3486
   If STMT is a conditional branch and we can determine its truth
3487
   value, the taken edge is recorded in *TAKEN_EDGE_P.
3488
 
3489
   If STMT produces a varying value, return SSA_PROP_VARYING.  */
3490
 
3491
static enum ssa_prop_result
3492
vrp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p)
3493
{
3494
  tree def;
3495
  ssa_op_iter iter;
3496
  stmt_ann_t ann;
3497
 
3498
  if (dump_file && (dump_flags & TDF_DETAILS))
3499
    {
3500
      fprintf (dump_file, "\nVisiting statement:\n");
3501
      print_generic_stmt (dump_file, stmt, dump_flags);
3502
      fprintf (dump_file, "\n");
3503
    }
3504
 
3505
  ann = stmt_ann (stmt);
3506
  if (TREE_CODE (stmt) == MODIFY_EXPR
3507
      && ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
3508
    return vrp_visit_assignment (stmt, output_p);
3509
  else if (TREE_CODE (stmt) == COND_EXPR || TREE_CODE (stmt) == SWITCH_EXPR)
3510
    return vrp_visit_cond_stmt (stmt, taken_edge_p);
3511
 
3512
  /* All other statements produce nothing of interest for VRP, so mark
3513
     their outputs varying and prevent further simulation.  */
3514
  FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
3515
    set_value_range_to_varying (get_value_range (def));
3516
 
3517
  return SSA_PROP_VARYING;
3518
}
3519
 
3520
 
3521
/* Meet operation for value ranges.  Given two value ranges VR0 and
3522
   VR1, store in VR0 the result of meeting VR0 and VR1.
3523
 
3524
   The meeting rules are as follows:
3525
 
3526
   1- If VR0 and VR1 have an empty intersection, set VR0 to VR_VARYING.
3527
 
3528
   2- If VR0 and VR1 have a non-empty intersection, set VR0 to the
3529
      union of VR0 and VR1.  */
3530
 
3531
static void
3532
vrp_meet (value_range_t *vr0, value_range_t *vr1)
3533
{
3534
  if (vr0->type == VR_UNDEFINED)
3535
    {
3536
      copy_value_range (vr0, vr1);
3537
      return;
3538
    }
3539
 
3540
  if (vr1->type == VR_UNDEFINED)
3541
    {
3542
      /* Nothing to do.  VR0 already has the resulting range.  */
3543
      return;
3544
    }
3545
 
3546
  if (vr0->type == VR_VARYING)
3547
    {
3548
      /* Nothing to do.  VR0 already has the resulting range.  */
3549
      return;
3550
    }
3551
 
3552
  if (vr1->type == VR_VARYING)
3553
    {
3554
      set_value_range_to_varying (vr0);
3555
      return;
3556
    }
3557
 
3558
  if (vr0->type == VR_RANGE && vr1->type == VR_RANGE)
3559
    {
3560
      /* If VR0 and VR1 have a non-empty intersection, compute the
3561
         union of both ranges.  */
3562
      if (value_ranges_intersect_p (vr0, vr1))
3563
        {
3564
          int cmp;
3565
          tree min, max;
3566
 
3567
          /* The lower limit of the new range is the minimum of the
3568
             two ranges.  If they cannot be compared, the result is
3569
             VARYING.  */
3570
          cmp = compare_values (vr0->min, vr1->min);
3571
          if (cmp == 0 || cmp == 1)
3572
            min = vr1->min;
3573
          else if (cmp == -1)
3574
            min = vr0->min;
3575
          else
3576
            {
3577
              set_value_range_to_varying (vr0);
3578
              return;
3579
            }
3580
 
3581
          /* Similarly, the upper limit of the new range is the
3582
             maximum of the two ranges.  If they cannot be compared,
3583
             the result is VARYING.  */
3584
          cmp = compare_values (vr0->max, vr1->max);
3585
          if (cmp == 0 || cmp == -1)
3586
            max = vr1->max;
3587
          else if (cmp == 1)
3588
            max = vr0->max;
3589
          else
3590
            {
3591
              set_value_range_to_varying (vr0);
3592
              return;
3593
            }
3594
 
3595
          /* The resulting set of equivalences is the intersection of
3596
             the two sets.  */
3597
          if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
3598
            bitmap_and_into (vr0->equiv, vr1->equiv);
3599
          else if (vr0->equiv && !vr1->equiv)
3600
            bitmap_clear (vr0->equiv);
3601
 
3602
          set_value_range (vr0, vr0->type, min, max, vr0->equiv);
3603
        }
3604
      else
3605
        goto no_meet;
3606
    }
3607
  else if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
3608
    {
3609
      /* Two anti-ranges meet only if they are both identical.  */
3610
      if (compare_values (vr0->min, vr1->min) == 0
3611
          && compare_values (vr0->max, vr1->max) == 0
3612
          && compare_values (vr0->min, vr0->max) == 0)
3613
        {
3614
          /* The resulting set of equivalences is the intersection of
3615
             the two sets.  */
3616
          if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
3617
            bitmap_and_into (vr0->equiv, vr1->equiv);
3618
          else if (vr0->equiv && !vr1->equiv)
3619
            bitmap_clear (vr0->equiv);
3620
        }
3621
      else
3622
        goto no_meet;
3623
    }
3624
  else if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
3625
    {
3626
      /* A numeric range [VAL1, VAL2] and an anti-range ~[VAL3, VAL4]
3627
         meet only if the ranges have an empty intersection.  The
3628
         result of the meet operation is the anti-range.  */
3629
      if (!symbolic_range_p (vr0)
3630
          && !symbolic_range_p (vr1)
3631
          && !value_ranges_intersect_p (vr0, vr1))
3632
        {
3633
          /* Copy most of VR1 into VR0.  Don't copy VR1's equivalence
3634
             set.  We need to compute the intersection of the two
3635
             equivalence sets.  */
3636
          if (vr1->type == VR_ANTI_RANGE)
3637
            set_value_range (vr0, vr1->type, vr1->min, vr1->max, vr0->equiv);
3638
 
3639
          /* The resulting set of equivalences is the intersection of
3640
             the two sets.  */
3641
          if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
3642
            bitmap_and_into (vr0->equiv, vr1->equiv);
3643
          else if (vr0->equiv && !vr1->equiv)
3644
            bitmap_clear (vr0->equiv);
3645
        }
3646
      else
3647
        goto no_meet;
3648
    }
3649
  else
3650
    gcc_unreachable ();
3651
 
3652
  return;
3653
 
3654
no_meet:
3655
  /* The two range VR0 and VR1 do not meet.  Before giving up and
3656
     setting the result to VARYING, see if we can at least derive a
3657
     useful anti-range.  FIXME, all this nonsense about distinguishing
3658
     anti-ranges from ranges is necessary because of the odd
3659
     semantics of range_includes_zero_p and friends.  */
3660
  if (!symbolic_range_p (vr0)
3661
      && ((vr0->type == VR_RANGE && !range_includes_zero_p (vr0))
3662
          || (vr0->type == VR_ANTI_RANGE && range_includes_zero_p (vr0)))
3663
      && !symbolic_range_p (vr1)
3664
      && ((vr1->type == VR_RANGE && !range_includes_zero_p (vr1))
3665
          || (vr1->type == VR_ANTI_RANGE && range_includes_zero_p (vr1))))
3666
    {
3667
      set_value_range_to_nonnull (vr0, TREE_TYPE (vr0->min));
3668
 
3669
      /* Since this meet operation did not result from the meeting of
3670
         two equivalent names, VR0 cannot have any equivalences.  */
3671
      if (vr0->equiv)
3672
        bitmap_clear (vr0->equiv);
3673
    }
3674
  else
3675
    set_value_range_to_varying (vr0);
3676
}
3677
 
3678
 
3679
/* Visit all arguments for PHI node PHI that flow through executable
3680
   edges.  If a valid value range can be derived from all the incoming
3681
   value ranges, set a new range for the LHS of PHI.  */
3682
 
3683
static enum ssa_prop_result
3684
vrp_visit_phi_node (tree phi)
3685
{
3686
  int i;
3687
  tree lhs = PHI_RESULT (phi);
3688
  value_range_t *lhs_vr = get_value_range (lhs);
3689
  value_range_t vr_result = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
3690
 
3691
  copy_value_range (&vr_result, lhs_vr);
3692
 
3693
  if (dump_file && (dump_flags & TDF_DETAILS))
3694
    {
3695
      fprintf (dump_file, "\nVisiting PHI node: ");
3696
      print_generic_expr (dump_file, phi, dump_flags);
3697
    }
3698
 
3699
  for (i = 0; i < PHI_NUM_ARGS (phi); i++)
3700
    {
3701
      edge e = PHI_ARG_EDGE (phi, i);
3702
 
3703
      if (dump_file && (dump_flags & TDF_DETAILS))
3704
        {
3705
          fprintf (dump_file,
3706
              "\n    Argument #%d (%d -> %d %sexecutable)\n",
3707
              i, e->src->index, e->dest->index,
3708
              (e->flags & EDGE_EXECUTABLE) ? "" : "not ");
3709
        }
3710
 
3711
      if (e->flags & EDGE_EXECUTABLE)
3712
        {
3713
          tree arg = PHI_ARG_DEF (phi, i);
3714
          value_range_t vr_arg;
3715
 
3716
          if (TREE_CODE (arg) == SSA_NAME)
3717
            vr_arg = *(get_value_range (arg));
3718
          else
3719
            {
3720
              vr_arg.type = VR_RANGE;
3721
              vr_arg.min = arg;
3722
              vr_arg.max = arg;
3723
              vr_arg.equiv = NULL;
3724
            }
3725
 
3726
          if (dump_file && (dump_flags & TDF_DETAILS))
3727
            {
3728
              fprintf (dump_file, "\t");
3729
              print_generic_expr (dump_file, arg, dump_flags);
3730
              fprintf (dump_file, "\n\tValue: ");
3731
              dump_value_range (dump_file, &vr_arg);
3732
              fprintf (dump_file, "\n");
3733
            }
3734
 
3735
          vrp_meet (&vr_result, &vr_arg);
3736
 
3737
          if (vr_result.type == VR_VARYING)
3738
            break;
3739
        }
3740
    }
3741
 
3742
  if (vr_result.type == VR_VARYING)
3743
    goto varying;
3744
 
3745
  /* To prevent infinite iterations in the algorithm, derive ranges
3746
     when the new value is slightly bigger or smaller than the
3747
     previous one.  */
3748
  if (lhs_vr->type == VR_RANGE && vr_result.type == VR_RANGE)
3749
    {
3750
      if (!POINTER_TYPE_P (TREE_TYPE (lhs)))
3751
        {
3752
          int cmp_min = compare_values (lhs_vr->min, vr_result.min);
3753
          int cmp_max = compare_values (lhs_vr->max, vr_result.max);
3754
 
3755
          /* If the new minimum is smaller or larger than the previous
3756
             one, go all the way to -INF.  In the first case, to avoid
3757
             iterating millions of times to reach -INF, and in the
3758
             other case to avoid infinite bouncing between different
3759
             minimums.  */
3760
          if (cmp_min > 0 || cmp_min < 0)
3761
            vr_result.min = TYPE_MIN_VALUE (TREE_TYPE (vr_result.min));
3762
 
3763
          /* Similarly, if the new maximum is smaller or larger than
3764
             the previous one, go all the way to +INF.  */
3765
          if (cmp_max < 0 || cmp_max > 0)
3766
            vr_result.max = TYPE_MAX_VALUE (TREE_TYPE (vr_result.max));
3767
 
3768
          /* If we ended up with a (-INF, +INF) range, set it to
3769
             VARYING.  */
3770
          if (vr_result.min == TYPE_MIN_VALUE (TREE_TYPE (vr_result.min))
3771
              && vr_result.max == TYPE_MAX_VALUE (TREE_TYPE (vr_result.max)))
3772
            goto varying;
3773
        }
3774
    }
3775
 
3776
  /* If the new range is different than the previous value, keep
3777
     iterating.  */
3778
  if (update_value_range (lhs, &vr_result))
3779
    return SSA_PROP_INTERESTING;
3780
 
3781
  /* Nothing changed, don't add outgoing edges.  */
3782
  return SSA_PROP_NOT_INTERESTING;
3783
 
3784
  /* No match found.  Set the LHS to VARYING.  */
3785
varying:
3786
  set_value_range_to_varying (lhs_vr);
3787
  return SSA_PROP_VARYING;
3788
}
3789
 
3790
/* Simplify a division or modulo operator to a right shift or
3791
   bitwise and if the first operand is unsigned or is greater
3792
   than zero and the second operand is an exact power of two.  */
3793
 
3794
static void
3795
simplify_div_or_mod_using_ranges (tree stmt, tree rhs, enum tree_code rhs_code)
3796
{
3797
  tree val = NULL;
3798
  tree op = TREE_OPERAND (rhs, 0);
3799
  value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
3800
 
3801
  if (TYPE_UNSIGNED (TREE_TYPE (op)))
3802
    {
3803
      val = integer_one_node;
3804
    }
3805
  else
3806
    {
3807
      val = compare_range_with_value (GT_EXPR, vr, integer_zero_node);
3808
    }
3809
 
3810
  if (val && integer_onep (val))
3811
    {
3812
      tree t;
3813
      tree op0 = TREE_OPERAND (rhs, 0);
3814
      tree op1 = TREE_OPERAND (rhs, 1);
3815
 
3816
      if (rhs_code == TRUNC_DIV_EXPR)
3817
        {
3818
          t = build_int_cst (NULL_TREE, tree_log2 (op1));
3819
          t = build2 (RSHIFT_EXPR, TREE_TYPE (op0), op0, t);
3820
        }
3821
      else
3822
        {
3823
          t = build_int_cst (TREE_TYPE (op1), 1);
3824
          t = int_const_binop (MINUS_EXPR, op1, t, 0);
3825
          t = fold_convert (TREE_TYPE (op0), t);
3826
          t = build2 (BIT_AND_EXPR, TREE_TYPE (op0), op0, t);
3827
        }
3828
 
3829
      TREE_OPERAND (stmt, 1) = t;
3830
      update_stmt (stmt);
3831
    }
3832
}
3833
 
3834
/* If the operand to an ABS_EXPR is >= 0, then eliminate the
3835
   ABS_EXPR.  If the operand is <= 0, then simplify the
3836
   ABS_EXPR into a NEGATE_EXPR.  */
3837
 
3838
static void
3839
simplify_abs_using_ranges (tree stmt, tree rhs)
3840
{
3841
  tree val = NULL;
3842
  tree op = TREE_OPERAND (rhs, 0);
3843
  tree type = TREE_TYPE (op);
3844
  value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
3845
 
3846
  if (TYPE_UNSIGNED (type))
3847
    {
3848
      val = integer_zero_node;
3849
    }
3850
  else if (vr)
3851
    {
3852
      val = compare_range_with_value (LE_EXPR, vr, integer_zero_node);
3853
      if (!val)
3854
        {
3855
          val = compare_range_with_value (GE_EXPR, vr, integer_zero_node);
3856
 
3857
          if (val)
3858
            {
3859
              if (integer_zerop (val))
3860
                val = integer_one_node;
3861
              else if (integer_onep (val))
3862
                val = integer_zero_node;
3863
            }
3864
        }
3865
 
3866
      if (val
3867
          && (integer_onep (val) || integer_zerop (val)))
3868
        {
3869
          tree t;
3870
 
3871
          if (integer_onep (val))
3872
            t = build1 (NEGATE_EXPR, TREE_TYPE (op), op);
3873
          else
3874
            t = op;
3875
 
3876
          TREE_OPERAND (stmt, 1) = t;
3877
          update_stmt (stmt);
3878
        }
3879
    }
3880
}
3881
 
3882
/* We are comparing trees OP0 and OP1 using COND_CODE.  OP0 has
3883
   a known value range VR.
3884
 
3885
   If there is one and only one value which will satisfy the
3886
   conditional, then return that value.  Else return NULL.  */
3887
 
3888
static tree
3889
test_for_singularity (enum tree_code cond_code, tree op0,
3890
                      tree op1, value_range_t *vr)
3891
{
3892
  tree min = NULL;
3893
  tree max = NULL;
3894
 
3895
  /* Extract minimum/maximum values which satisfy the
3896
     the conditional as it was written.  */
3897
  if (cond_code == LE_EXPR || cond_code == LT_EXPR)
3898
    {
3899
      min = TYPE_MIN_VALUE (TREE_TYPE (op0));
3900
 
3901
      max = op1;
3902
      if (cond_code == LT_EXPR)
3903
        {
3904
          tree one = build_int_cst (TREE_TYPE (op0), 1);
3905
          max = fold_build2 (MINUS_EXPR, TREE_TYPE (op0), max, one);
3906
        }
3907
    }
3908
  else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
3909
    {
3910
      max = TYPE_MAX_VALUE (TREE_TYPE (op0));
3911
 
3912
      min = op1;
3913
      if (cond_code == GT_EXPR)
3914
        {
3915
          tree one = build_int_cst (TREE_TYPE (op0), 1);
3916
          max = fold_build2 (PLUS_EXPR, TREE_TYPE (op0), max, one);
3917
        }
3918
    }
3919
 
3920
  /* Now refine the minimum and maximum values using any
3921
     value range information we have for op0.  */
3922
  if (min && max)
3923
    {
3924
      if (compare_values (vr->min, min) == -1)
3925
        min = min;
3926
      else
3927
        min = vr->min;
3928
      if (compare_values (vr->max, max) == 1)
3929
        max = max;
3930
      else
3931
        max = vr->max;
3932
 
3933
      /* If the new min/max values have converged to a
3934
         single value, then there is only one value which
3935
         can satisfy the condition, return that value.  */
3936
      if (min == max && is_gimple_min_invariant (min))
3937
        return min;
3938
    }
3939
  return NULL;
3940
}
3941
 
3942
/* Simplify a conditional using a relational operator to an equality
3943
   test if the range information indicates only one value can satisfy
3944
   the original conditional.  */
3945
 
3946
static void
3947
simplify_cond_using_ranges (tree stmt)
3948
{
3949
  tree cond = COND_EXPR_COND (stmt);
3950
  tree op0 = TREE_OPERAND (cond, 0);
3951
  tree op1 = TREE_OPERAND (cond, 1);
3952
  enum tree_code cond_code = TREE_CODE (cond);
3953
 
3954
  if (cond_code != NE_EXPR
3955
      && cond_code != EQ_EXPR
3956
      && TREE_CODE (op0) == SSA_NAME
3957
      && INTEGRAL_TYPE_P (TREE_TYPE (op0))
3958
      && is_gimple_min_invariant (op1))
3959
    {
3960
      value_range_t *vr = get_value_range (op0);
3961
 
3962
      /* If we have range information for OP0, then we might be
3963
         able to simplify this conditional. */
3964
      if (vr->type == VR_RANGE)
3965
        {
3966
          tree new = test_for_singularity (cond_code, op0, op1, vr);
3967
 
3968
          if (new)
3969
            {
3970
              if (dump_file)
3971
                {
3972
                  fprintf (dump_file, "Simplified relational ");
3973
                  print_generic_expr (dump_file, cond, 0);
3974
                  fprintf (dump_file, " into ");
3975
                }
3976
 
3977
              COND_EXPR_COND (stmt)
3978
                = build (EQ_EXPR, boolean_type_node, op0, new);
3979
              update_stmt (stmt);
3980
 
3981
              if (dump_file)
3982
                {
3983
                  print_generic_expr (dump_file, COND_EXPR_COND (stmt), 0);
3984
                  fprintf (dump_file, "\n");
3985
                }
3986
              return;
3987
 
3988
            }
3989
 
3990
          /* Try again after inverting the condition.  We only deal
3991
             with integral types here, so no need to worry about
3992
             issues with inverting FP comparisons.  */
3993
          cond_code = invert_tree_comparison (cond_code, false);
3994
          new = test_for_singularity (cond_code, op0, op1, vr);
3995
 
3996
          if (new)
3997
            {
3998
              if (dump_file)
3999
                {
4000
                  fprintf (dump_file, "Simplified relational ");
4001
                  print_generic_expr (dump_file, cond, 0);
4002
                  fprintf (dump_file, " into ");
4003
                }
4004
 
4005
              COND_EXPR_COND (stmt)
4006
                = build (NE_EXPR, boolean_type_node, op0, new);
4007
              update_stmt (stmt);
4008
 
4009
              if (dump_file)
4010
                {
4011
                  print_generic_expr (dump_file, COND_EXPR_COND (stmt), 0);
4012
                  fprintf (dump_file, "\n");
4013
                }
4014
              return;
4015
 
4016
            }
4017
        }
4018
    }
4019
}
4020
 
4021
/* Simplify STMT using ranges if possible.  */
4022
 
4023
void
4024
simplify_stmt_using_ranges (tree stmt)
4025
{
4026
  if (TREE_CODE (stmt) == MODIFY_EXPR)
4027
    {
4028
      tree rhs = TREE_OPERAND (stmt, 1);
4029
      enum tree_code rhs_code = TREE_CODE (rhs);
4030
 
4031
      /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
4032
         and BIT_AND_EXPR respectively if the first operand is greater
4033
         than zero and the second operand is an exact power of two.  */
4034
      if ((rhs_code == TRUNC_DIV_EXPR || rhs_code == TRUNC_MOD_EXPR)
4035
          && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0)))
4036
          && integer_pow2p (TREE_OPERAND (rhs, 1)))
4037
        simplify_div_or_mod_using_ranges (stmt, rhs, rhs_code);
4038
 
4039
      /* Transform ABS (X) into X or -X as appropriate.  */
4040
      if (rhs_code == ABS_EXPR
4041
          && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME
4042
          && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0))))
4043
        simplify_abs_using_ranges (stmt, rhs);
4044
    }
4045
  else if (TREE_CODE (stmt) == COND_EXPR
4046
           && COMPARISON_CLASS_P (COND_EXPR_COND (stmt)))
4047
    {
4048
      simplify_cond_using_ranges (stmt);
4049
    }
4050
}
4051
 
4052
 
4053
 
4054
/* Traverse all the blocks folding conditionals with known ranges.  */
4055
 
4056
static void
4057
vrp_finalize (void)
4058
{
4059
  size_t i;
4060
  prop_value_t *single_val_range;
4061
  bool do_value_subst_p;
4062
 
4063
  if (dump_file)
4064
    {
4065
      fprintf (dump_file, "\nValue ranges after VRP:\n\n");
4066
      dump_all_value_ranges (dump_file);
4067
      fprintf (dump_file, "\n");
4068
    }
4069
 
4070
  /* We may have ended with ranges that have exactly one value.  Those
4071
     values can be substituted as any other copy/const propagated
4072
     value using substitute_and_fold.  */
4073
  single_val_range = xmalloc (num_ssa_names * sizeof (*single_val_range));
4074
  memset (single_val_range, 0, num_ssa_names * sizeof (*single_val_range));
4075
 
4076
  do_value_subst_p = false;
4077
  for (i = 0; i < num_ssa_names; i++)
4078
    if (vr_value[i]
4079
        && vr_value[i]->type == VR_RANGE
4080
        && vr_value[i]->min == vr_value[i]->max)
4081
      {
4082
        single_val_range[i].value = vr_value[i]->min;
4083
        do_value_subst_p = true;
4084
      }
4085
 
4086
  if (!do_value_subst_p)
4087
    {
4088
      /* We found no single-valued ranges, don't waste time trying to
4089
         do single value substitution in substitute_and_fold.  */
4090
      free (single_val_range);
4091
      single_val_range = NULL;
4092
    }
4093
 
4094
  substitute_and_fold (single_val_range, true);
4095
 
4096
  /* Free allocated memory.  */
4097
  for (i = 0; i < num_ssa_names; i++)
4098
    if (vr_value[i])
4099
      {
4100
        BITMAP_FREE (vr_value[i]->equiv);
4101
        free (vr_value[i]);
4102
      }
4103
 
4104
  free (single_val_range);
4105
  free (vr_value);
4106
}
4107
 
4108
 
4109
/* Main entry point to VRP (Value Range Propagation).  This pass is
4110
   loosely based on J. R. C. Patterson, ``Accurate Static Branch
4111
   Prediction by Value Range Propagation,'' in SIGPLAN Conference on
4112
   Programming Language Design and Implementation, pp. 67-78, 1995.
4113
   Also available at http://citeseer.ist.psu.edu/patterson95accurate.html
4114
 
4115
   This is essentially an SSA-CCP pass modified to deal with ranges
4116
   instead of constants.
4117
 
4118
   While propagating ranges, we may find that two or more SSA name
4119
   have equivalent, though distinct ranges.  For instance,
4120
 
4121
     1  x_9 = p_3->a;
4122
     2  p_4 = ASSERT_EXPR <p_3, p_3 != 0>
4123
     3  if (p_4 == q_2)
4124
     4    p_5 = ASSERT_EXPR <p_4, p_4 == q_2>;
4125
     5  endif
4126
     6  if (q_2)
4127
 
4128
   In the code above, pointer p_5 has range [q_2, q_2], but from the
4129
   code we can also determine that p_5 cannot be NULL and, if q_2 had
4130
   a non-varying range, p_5's range should also be compatible with it.
4131
 
4132
   These equivalences are created by two expressions: ASSERT_EXPR and
4133
   copy operations.  Since p_5 is an assertion on p_4, and p_4 was the
4134
   result of another assertion, then we can use the fact that p_5 and
4135
   p_4 are equivalent when evaluating p_5's range.
4136
 
4137
   Together with value ranges, we also propagate these equivalences
4138
   between names so that we can take advantage of information from
4139
   multiple ranges when doing final replacement.  Note that this
4140
   equivalency relation is transitive but not symmetric.
4141
 
4142
   In the example above, p_5 is equivalent to p_4, q_2 and p_3, but we
4143
   cannot assert that q_2 is equivalent to p_5 because q_2 may be used
4144
   in contexts where that assertion does not hold (e.g., in line 6).
4145
 
4146
   TODO, the main difference between this pass and Patterson's is that
4147
   we do not propagate edge probabilities.  We only compute whether
4148
   edges can be taken or not.  That is, instead of having a spectrum
4149
   of jump probabilities between 0 and 1, we only deal with 0, 1 and
4150
   DON'T KNOW.  In the future, it may be worthwhile to propagate
4151
   probabilities to aid branch prediction.  */
4152
 
4153
static void
4154
execute_vrp (void)
4155
{
4156
  insert_range_assertions ();
4157
 
4158
  cfg_loops = loop_optimizer_init (NULL);
4159
  if (cfg_loops)
4160
    scev_initialize (cfg_loops);
4161
 
4162
  vrp_initialize ();
4163
  ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
4164
  vrp_finalize ();
4165
 
4166
  if (cfg_loops)
4167
    {
4168
      scev_finalize ();
4169
      loop_optimizer_finalize (cfg_loops, NULL);
4170
      current_loops = NULL;
4171
    }
4172
 
4173
  remove_range_assertions ();
4174
}
4175
 
4176
static bool
4177
gate_vrp (void)
4178
{
4179
  return flag_tree_vrp != 0;
4180
}
4181
 
4182
struct tree_opt_pass pass_vrp =
4183
{
4184
  "vrp",                                /* name */
4185
  gate_vrp,                             /* gate */
4186
  execute_vrp,                          /* execute */
4187
  NULL,                                 /* sub */
4188
  NULL,                                 /* next */
4189
  0,                                     /* static_pass_number */
4190
  TV_TREE_VRP,                          /* tv_id */
4191
  PROP_ssa | PROP_alias,                /* properties_required */
4192
  0,                                     /* properties_provided */
4193
  0,                                     /* properties_destroyed */
4194
  0,                                     /* todo_flags_start */
4195
  TODO_cleanup_cfg
4196
    | TODO_ggc_collect
4197
    | TODO_verify_ssa
4198
    | TODO_dump_func
4199
    | TODO_update_ssa,                  /* todo_flags_finish */
4200
 
4201
};

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.