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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [loop-iv.c] - Blame information for rev 684

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 684 jeremybenn
/* Rtl-level induction variable analysis.
2
   Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
3
   Free Software Foundation, Inc.
4
 
5
This file is part of GCC.
6
 
7
GCC is free software; you can redistribute it and/or modify it
8
under the terms of the GNU General Public License as published by the
9
Free Software Foundation; either version 3, or (at your option) any
10
later version.
11
 
12
GCC is distributed in the hope that it will be useful, but WITHOUT
13
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15
for more details.
16
 
17
You should have received a copy of the GNU General Public License
18
along with GCC; see the file COPYING3.  If not see
19
<http://www.gnu.org/licenses/>.  */
20
 
21
/* This is a simple analysis of induction variables of the loop.  The major use
22
   is for determining the number of iterations of a loop for loop unrolling,
23
   doloop optimization and branch prediction.  The iv information is computed
24
   on demand.
25
 
26
   Induction variables are analyzed by walking the use-def chains.  When
27
   a basic induction variable (biv) is found, it is cached in the bivs
28
   hash table.  When register is proved to be a biv, its description
29
   is stored to DF_REF_DATA of the def reference.
30
 
31
   The analysis works always with one loop -- you must call
32
   iv_analysis_loop_init (loop) for it.  All the other functions then work with
33
   this loop.   When you need to work with another loop, just call
34
   iv_analysis_loop_init for it.  When you no longer need iv analysis, call
35
   iv_analysis_done () to clean up the memory.
36
 
37
   The available functions are:
38
 
39
   iv_analyze (insn, reg, iv): Stores the description of the induction variable
40
     corresponding to the use of register REG in INSN to IV.  Returns true if
41
     REG is an induction variable in INSN. false otherwise.
42
     If use of REG is not found in INSN, following insns are scanned (so that
43
     we may call this function on insn returned by get_condition).
44
   iv_analyze_result (insn, def, iv):  Stores to IV the description of the iv
45
     corresponding to DEF, which is a register defined in INSN.
46
   iv_analyze_expr (insn, rhs, mode, iv):  Stores to IV the description of iv
47
     corresponding to expression EXPR evaluated at INSN.  All registers used bu
48
     EXPR must also be used in INSN.
49
*/
50
 
51
#include "config.h"
52
#include "system.h"
53
#include "coretypes.h"
54
#include "tm.h"
55
#include "rtl.h"
56
#include "hard-reg-set.h"
57
#include "obstack.h"
58
#include "basic-block.h"
59
#include "cfgloop.h"
60
#include "expr.h"
61
#include "intl.h"
62
#include "output.h"
63
#include "diagnostic-core.h"
64
#include "df.h"
65
#include "hashtab.h"
66
 
67
/* Possible return values of iv_get_reaching_def.  */
68
 
69
enum iv_grd_result
70
{
71
  /* More than one reaching def, or reaching def that does not
72
     dominate the use.  */
73
  GRD_INVALID,
74
 
75
  /* The use is trivial invariant of the loop, i.e. is not changed
76
     inside the loop.  */
77
  GRD_INVARIANT,
78
 
79
  /* The use is reached by initial value and a value from the
80
     previous iteration.  */
81
  GRD_MAYBE_BIV,
82
 
83
  /* The use has single dominating def.  */
84
  GRD_SINGLE_DOM
85
};
86
 
87
/* Information about a biv.  */
88
 
89
struct biv_entry
90
{
91
  unsigned regno;       /* The register of the biv.  */
92
  struct rtx_iv iv;     /* Value of the biv.  */
93
};
94
 
95
static bool clean_slate = true;
96
 
97
static unsigned int iv_ref_table_size = 0;
98
 
99
/* Table of rtx_ivs indexed by the df_ref uid field.  */
100
static struct rtx_iv ** iv_ref_table;
101
 
102
/* Induction variable stored at the reference.  */
103
#define DF_REF_IV(REF) iv_ref_table[DF_REF_ID(REF)]
104
#define DF_REF_IV_SET(REF, IV) iv_ref_table[DF_REF_ID(REF)] = (IV)
105
 
106
/* The current loop.  */
107
 
108
static struct loop *current_loop;
109
 
110
/* Bivs of the current loop.  */
111
 
112
static htab_t bivs;
113
 
114
static bool iv_analyze_op (rtx, rtx, struct rtx_iv *);
115
 
116
/* Dumps information about IV to FILE.  */
117
 
118
extern void dump_iv_info (FILE *, struct rtx_iv *);
119
void
120
dump_iv_info (FILE *file, struct rtx_iv *iv)
121
{
122
  if (!iv->base)
123
    {
124
      fprintf (file, "not simple");
125
      return;
126
    }
127
 
128
  if (iv->step == const0_rtx
129
      && !iv->first_special)
130
    fprintf (file, "invariant ");
131
 
132
  print_rtl (file, iv->base);
133
  if (iv->step != const0_rtx)
134
    {
135
      fprintf (file, " + ");
136
      print_rtl (file, iv->step);
137
      fprintf (file, " * iteration");
138
    }
139
  fprintf (file, " (in %s)", GET_MODE_NAME (iv->mode));
140
 
141
  if (iv->mode != iv->extend_mode)
142
    fprintf (file, " %s to %s",
143
             rtx_name[iv->extend],
144
             GET_MODE_NAME (iv->extend_mode));
145
 
146
  if (iv->mult != const1_rtx)
147
    {
148
      fprintf (file, " * ");
149
      print_rtl (file, iv->mult);
150
    }
151
  if (iv->delta != const0_rtx)
152
    {
153
      fprintf (file, " + ");
154
      print_rtl (file, iv->delta);
155
    }
156
  if (iv->first_special)
157
    fprintf (file, " (first special)");
158
}
159
 
160
/* Generates a subreg to get the least significant part of EXPR (in mode
161
   INNER_MODE) to OUTER_MODE.  */
162
 
163
rtx
164
lowpart_subreg (enum machine_mode outer_mode, rtx expr,
165
                enum machine_mode inner_mode)
166
{
167
  return simplify_gen_subreg (outer_mode, expr, inner_mode,
168
                              subreg_lowpart_offset (outer_mode, inner_mode));
169
}
170
 
171
static void
172
check_iv_ref_table_size (void)
173
{
174
  if (iv_ref_table_size < DF_DEFS_TABLE_SIZE())
175
    {
176
      unsigned int new_size = DF_DEFS_TABLE_SIZE () + (DF_DEFS_TABLE_SIZE () / 4);
177
      iv_ref_table = XRESIZEVEC (struct rtx_iv *, iv_ref_table, new_size);
178
      memset (&iv_ref_table[iv_ref_table_size], 0,
179
              (new_size - iv_ref_table_size) * sizeof (struct rtx_iv *));
180
      iv_ref_table_size = new_size;
181
    }
182
}
183
 
184
 
185
/* Checks whether REG is a well-behaved register.  */
186
 
187
static bool
188
simple_reg_p (rtx reg)
189
{
190
  unsigned r;
191
 
192
  if (GET_CODE (reg) == SUBREG)
193
    {
194
      if (!subreg_lowpart_p (reg))
195
        return false;
196
      reg = SUBREG_REG (reg);
197
    }
198
 
199
  if (!REG_P (reg))
200
    return false;
201
 
202
  r = REGNO (reg);
203
  if (HARD_REGISTER_NUM_P (r))
204
    return false;
205
 
206
  if (GET_MODE_CLASS (GET_MODE (reg)) != MODE_INT)
207
    return false;
208
 
209
  return true;
210
}
211
 
212
/* Clears the information about ivs stored in df.  */
213
 
214
static void
215
clear_iv_info (void)
216
{
217
  unsigned i, n_defs = DF_DEFS_TABLE_SIZE ();
218
  struct rtx_iv *iv;
219
 
220
  check_iv_ref_table_size ();
221
  for (i = 0; i < n_defs; i++)
222
    {
223
      iv = iv_ref_table[i];
224
      if (iv)
225
        {
226
          free (iv);
227
          iv_ref_table[i] = NULL;
228
        }
229
    }
230
 
231
  htab_empty (bivs);
232
}
233
 
234
/* Returns hash value for biv B.  */
235
 
236
static hashval_t
237
biv_hash (const void *b)
238
{
239
  return ((const struct biv_entry *) b)->regno;
240
}
241
 
242
/* Compares biv B and register R.  */
243
 
244
static int
245
biv_eq (const void *b, const void *r)
246
{
247
  return ((const struct biv_entry *) b)->regno == REGNO ((const_rtx) r);
248
}
249
 
250
/* Prepare the data for an induction variable analysis of a LOOP.  */
251
 
252
void
253
iv_analysis_loop_init (struct loop *loop)
254
{
255
  basic_block *body = get_loop_body_in_dom_order (loop), bb;
256
  bitmap blocks = BITMAP_ALLOC (NULL);
257
  unsigned i;
258
 
259
  current_loop = loop;
260
 
261
  /* Clear the information from the analysis of the previous loop.  */
262
  if (clean_slate)
263
    {
264
      df_set_flags (DF_EQ_NOTES + DF_DEFER_INSN_RESCAN);
265
      bivs = htab_create (10, biv_hash, biv_eq, free);
266
      clean_slate = false;
267
    }
268
  else
269
    clear_iv_info ();
270
 
271
  for (i = 0; i < loop->num_nodes; i++)
272
    {
273
      bb = body[i];
274
      bitmap_set_bit (blocks, bb->index);
275
    }
276
  /* Get rid of the ud chains before processing the rescans.  Then add
277
     the problem back.  */
278
  df_remove_problem (df_chain);
279
  df_process_deferred_rescans ();
280
  df_chain_add_problem (DF_UD_CHAIN);
281
  df_note_add_problem ();
282
  df_set_blocks (blocks);
283
  df_analyze ();
284
  if (dump_file)
285
    df_dump_region (dump_file);
286
 
287
  check_iv_ref_table_size ();
288
  BITMAP_FREE (blocks);
289
  free (body);
290
}
291
 
292
/* Finds the definition of REG that dominates loop latch and stores
293
   it to DEF.  Returns false if there is not a single definition
294
   dominating the latch.  If REG has no definition in loop, DEF
295
   is set to NULL and true is returned.  */
296
 
297
static bool
298
latch_dominating_def (rtx reg, df_ref *def)
299
{
300
  df_ref single_rd = NULL, adef;
301
  unsigned regno = REGNO (reg);
302
  struct df_rd_bb_info *bb_info = DF_RD_BB_INFO (current_loop->latch);
303
 
304
  for (adef = DF_REG_DEF_CHAIN (regno); adef; adef = DF_REF_NEXT_REG (adef))
305
    {
306
      if (!bitmap_bit_p (df->blocks_to_analyze, DF_REF_BBNO (adef))
307
          || !bitmap_bit_p (&bb_info->out, DF_REF_ID (adef)))
308
        continue;
309
 
310
      /* More than one reaching definition.  */
311
      if (single_rd)
312
        return false;
313
 
314
      if (!just_once_each_iteration_p (current_loop, DF_REF_BB (adef)))
315
        return false;
316
 
317
      single_rd = adef;
318
    }
319
 
320
  *def = single_rd;
321
  return true;
322
}
323
 
324
/* Gets definition of REG reaching its use in INSN and stores it to DEF.  */
325
 
326
static enum iv_grd_result
327
iv_get_reaching_def (rtx insn, rtx reg, df_ref *def)
328
{
329
  df_ref use, adef;
330
  basic_block def_bb, use_bb;
331
  rtx def_insn;
332
  bool dom_p;
333
 
334
  *def = NULL;
335
  if (!simple_reg_p (reg))
336
    return GRD_INVALID;
337
  if (GET_CODE (reg) == SUBREG)
338
    reg = SUBREG_REG (reg);
339
  gcc_assert (REG_P (reg));
340
 
341
  use = df_find_use (insn, reg);
342
  gcc_assert (use != NULL);
343
 
344
  if (!DF_REF_CHAIN (use))
345
    return GRD_INVARIANT;
346
 
347
  /* More than one reaching def.  */
348
  if (DF_REF_CHAIN (use)->next)
349
    return GRD_INVALID;
350
 
351
  adef = DF_REF_CHAIN (use)->ref;
352
 
353
  /* We do not handle setting only part of the register.  */
354
  if (DF_REF_FLAGS (adef) & DF_REF_READ_WRITE)
355
    return GRD_INVALID;
356
 
357
  def_insn = DF_REF_INSN (adef);
358
  def_bb = DF_REF_BB (adef);
359
  use_bb = BLOCK_FOR_INSN (insn);
360
 
361
  if (use_bb == def_bb)
362
    dom_p = (DF_INSN_LUID (def_insn) < DF_INSN_LUID (insn));
363
  else
364
    dom_p = dominated_by_p (CDI_DOMINATORS, use_bb, def_bb);
365
 
366
  if (dom_p)
367
    {
368
      *def = adef;
369
      return GRD_SINGLE_DOM;
370
    }
371
 
372
  /* The definition does not dominate the use.  This is still OK if
373
     this may be a use of a biv, i.e. if the def_bb dominates loop
374
     latch.  */
375
  if (just_once_each_iteration_p (current_loop, def_bb))
376
    return GRD_MAYBE_BIV;
377
 
378
  return GRD_INVALID;
379
}
380
 
381
/* Sets IV to invariant CST in MODE.  Always returns true (just for
382
   consistency with other iv manipulation functions that may fail).  */
383
 
384
static bool
385
iv_constant (struct rtx_iv *iv, rtx cst, enum machine_mode mode)
386
{
387
  if (mode == VOIDmode)
388
    mode = GET_MODE (cst);
389
 
390
  iv->mode = mode;
391
  iv->base = cst;
392
  iv->step = const0_rtx;
393
  iv->first_special = false;
394
  iv->extend = UNKNOWN;
395
  iv->extend_mode = iv->mode;
396
  iv->delta = const0_rtx;
397
  iv->mult = const1_rtx;
398
 
399
  return true;
400
}
401
 
402
/* Evaluates application of subreg to MODE on IV.  */
403
 
404
static bool
405
iv_subreg (struct rtx_iv *iv, enum machine_mode mode)
406
{
407
  /* If iv is invariant, just calculate the new value.  */
408
  if (iv->step == const0_rtx
409
      && !iv->first_special)
410
    {
411
      rtx val = get_iv_value (iv, const0_rtx);
412
      val = lowpart_subreg (mode, val, iv->extend_mode);
413
 
414
      iv->base = val;
415
      iv->extend = UNKNOWN;
416
      iv->mode = iv->extend_mode = mode;
417
      iv->delta = const0_rtx;
418
      iv->mult = const1_rtx;
419
      return true;
420
    }
421
 
422
  if (iv->extend_mode == mode)
423
    return true;
424
 
425
  if (GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (iv->mode))
426
    return false;
427
 
428
  iv->extend = UNKNOWN;
429
  iv->mode = mode;
430
 
431
  iv->base = simplify_gen_binary (PLUS, iv->extend_mode, iv->delta,
432
                                  simplify_gen_binary (MULT, iv->extend_mode,
433
                                                       iv->base, iv->mult));
434
  iv->step = simplify_gen_binary (MULT, iv->extend_mode, iv->step, iv->mult);
435
  iv->mult = const1_rtx;
436
  iv->delta = const0_rtx;
437
  iv->first_special = false;
438
 
439
  return true;
440
}
441
 
442
/* Evaluates application of EXTEND to MODE on IV.  */
443
 
444
static bool
445
iv_extend (struct rtx_iv *iv, enum rtx_code extend, enum machine_mode mode)
446
{
447
  /* If iv is invariant, just calculate the new value.  */
448
  if (iv->step == const0_rtx
449
      && !iv->first_special)
450
    {
451
      rtx val = get_iv_value (iv, const0_rtx);
452
      val = simplify_gen_unary (extend, mode, val, iv->extend_mode);
453
 
454
      iv->base = val;
455
      iv->extend = UNKNOWN;
456
      iv->mode = iv->extend_mode = mode;
457
      iv->delta = const0_rtx;
458
      iv->mult = const1_rtx;
459
      return true;
460
    }
461
 
462
  if (mode != iv->extend_mode)
463
    return false;
464
 
465
  if (iv->extend != UNKNOWN
466
      && iv->extend != extend)
467
    return false;
468
 
469
  iv->extend = extend;
470
 
471
  return true;
472
}
473
 
474
/* Evaluates negation of IV.  */
475
 
476
static bool
477
iv_neg (struct rtx_iv *iv)
478
{
479
  if (iv->extend == UNKNOWN)
480
    {
481
      iv->base = simplify_gen_unary (NEG, iv->extend_mode,
482
                                     iv->base, iv->extend_mode);
483
      iv->step = simplify_gen_unary (NEG, iv->extend_mode,
484
                                     iv->step, iv->extend_mode);
485
    }
486
  else
487
    {
488
      iv->delta = simplify_gen_unary (NEG, iv->extend_mode,
489
                                      iv->delta, iv->extend_mode);
490
      iv->mult = simplify_gen_unary (NEG, iv->extend_mode,
491
                                     iv->mult, iv->extend_mode);
492
    }
493
 
494
  return true;
495
}
496
 
497
/* Evaluates addition or subtraction (according to OP) of IV1 to IV0.  */
498
 
499
static bool
500
iv_add (struct rtx_iv *iv0, struct rtx_iv *iv1, enum rtx_code op)
501
{
502
  enum machine_mode mode;
503
  rtx arg;
504
 
505
  /* Extend the constant to extend_mode of the other operand if necessary.  */
506
  if (iv0->extend == UNKNOWN
507
      && iv0->mode == iv0->extend_mode
508
      && iv0->step == const0_rtx
509
      && GET_MODE_SIZE (iv0->extend_mode) < GET_MODE_SIZE (iv1->extend_mode))
510
    {
511
      iv0->extend_mode = iv1->extend_mode;
512
      iv0->base = simplify_gen_unary (ZERO_EXTEND, iv0->extend_mode,
513
                                      iv0->base, iv0->mode);
514
    }
515
  if (iv1->extend == UNKNOWN
516
      && iv1->mode == iv1->extend_mode
517
      && iv1->step == const0_rtx
518
      && GET_MODE_SIZE (iv1->extend_mode) < GET_MODE_SIZE (iv0->extend_mode))
519
    {
520
      iv1->extend_mode = iv0->extend_mode;
521
      iv1->base = simplify_gen_unary (ZERO_EXTEND, iv1->extend_mode,
522
                                      iv1->base, iv1->mode);
523
    }
524
 
525
  mode = iv0->extend_mode;
526
  if (mode != iv1->extend_mode)
527
    return false;
528
 
529
  if (iv0->extend == UNKNOWN && iv1->extend == UNKNOWN)
530
    {
531
      if (iv0->mode != iv1->mode)
532
        return false;
533
 
534
      iv0->base = simplify_gen_binary (op, mode, iv0->base, iv1->base);
535
      iv0->step = simplify_gen_binary (op, mode, iv0->step, iv1->step);
536
 
537
      return true;
538
    }
539
 
540
  /* Handle addition of constant.  */
541
  if (iv1->extend == UNKNOWN
542
      && iv1->mode == mode
543
      && iv1->step == const0_rtx)
544
    {
545
      iv0->delta = simplify_gen_binary (op, mode, iv0->delta, iv1->base);
546
      return true;
547
    }
548
 
549
  if (iv0->extend == UNKNOWN
550
      && iv0->mode == mode
551
      && iv0->step == const0_rtx)
552
    {
553
      arg = iv0->base;
554
      *iv0 = *iv1;
555
      if (op == MINUS
556
          && !iv_neg (iv0))
557
        return false;
558
 
559
      iv0->delta = simplify_gen_binary (PLUS, mode, iv0->delta, arg);
560
      return true;
561
    }
562
 
563
  return false;
564
}
565
 
566
/* Evaluates multiplication of IV by constant CST.  */
567
 
568
static bool
569
iv_mult (struct rtx_iv *iv, rtx mby)
570
{
571
  enum machine_mode mode = iv->extend_mode;
572
 
573
  if (GET_MODE (mby) != VOIDmode
574
      && GET_MODE (mby) != mode)
575
    return false;
576
 
577
  if (iv->extend == UNKNOWN)
578
    {
579
      iv->base = simplify_gen_binary (MULT, mode, iv->base, mby);
580
      iv->step = simplify_gen_binary (MULT, mode, iv->step, mby);
581
    }
582
  else
583
    {
584
      iv->delta = simplify_gen_binary (MULT, mode, iv->delta, mby);
585
      iv->mult = simplify_gen_binary (MULT, mode, iv->mult, mby);
586
    }
587
 
588
  return true;
589
}
590
 
591
/* Evaluates shift of IV by constant CST.  */
592
 
593
static bool
594
iv_shift (struct rtx_iv *iv, rtx mby)
595
{
596
  enum machine_mode mode = iv->extend_mode;
597
 
598
  if (GET_MODE (mby) != VOIDmode
599
      && GET_MODE (mby) != mode)
600
    return false;
601
 
602
  if (iv->extend == UNKNOWN)
603
    {
604
      iv->base = simplify_gen_binary (ASHIFT, mode, iv->base, mby);
605
      iv->step = simplify_gen_binary (ASHIFT, mode, iv->step, mby);
606
    }
607
  else
608
    {
609
      iv->delta = simplify_gen_binary (ASHIFT, mode, iv->delta, mby);
610
      iv->mult = simplify_gen_binary (ASHIFT, mode, iv->mult, mby);
611
    }
612
 
613
  return true;
614
}
615
 
616
/* The recursive part of get_biv_step.  Gets the value of the single value
617
   defined by DEF wrto initial value of REG inside loop, in shape described
618
   at get_biv_step.  */
619
 
620
static bool
621
get_biv_step_1 (df_ref def, rtx reg,
622
                rtx *inner_step, enum machine_mode *inner_mode,
623
                enum rtx_code *extend, enum machine_mode outer_mode,
624
                rtx *outer_step)
625
{
626
  rtx set, rhs, op0 = NULL_RTX, op1 = NULL_RTX;
627
  rtx next, nextr, tmp;
628
  enum rtx_code code;
629
  rtx insn = DF_REF_INSN (def);
630
  df_ref next_def;
631
  enum iv_grd_result res;
632
 
633
  set = single_set (insn);
634
  if (!set)
635
    return false;
636
 
637
  rhs = find_reg_equal_equiv_note (insn);
638
  if (rhs)
639
    rhs = XEXP (rhs, 0);
640
  else
641
    rhs = SET_SRC (set);
642
 
643
  code = GET_CODE (rhs);
644
  switch (code)
645
    {
646
    case SUBREG:
647
    case REG:
648
      next = rhs;
649
      break;
650
 
651
    case PLUS:
652
    case MINUS:
653
      op0 = XEXP (rhs, 0);
654
      op1 = XEXP (rhs, 1);
655
 
656
      if (code == PLUS && CONSTANT_P (op0))
657
        {
658
          tmp = op0; op0 = op1; op1 = tmp;
659
        }
660
 
661
      if (!simple_reg_p (op0)
662
          || !CONSTANT_P (op1))
663
        return false;
664
 
665
      if (GET_MODE (rhs) != outer_mode)
666
        {
667
          /* ppc64 uses expressions like
668
 
669
             (set x:SI (plus:SI (subreg:SI y:DI) 1)).
670
 
671
             this is equivalent to
672
 
673
             (set x':DI (plus:DI y:DI 1))
674
             (set x:SI (subreg:SI (x':DI)).  */
675
          if (GET_CODE (op0) != SUBREG)
676
            return false;
677
          if (GET_MODE (SUBREG_REG (op0)) != outer_mode)
678
            return false;
679
        }
680
 
681
      next = op0;
682
      break;
683
 
684
    case SIGN_EXTEND:
685
    case ZERO_EXTEND:
686
      if (GET_MODE (rhs) != outer_mode)
687
        return false;
688
 
689
      op0 = XEXP (rhs, 0);
690
      if (!simple_reg_p (op0))
691
        return false;
692
 
693
      next = op0;
694
      break;
695
 
696
    default:
697
      return false;
698
    }
699
 
700
  if (GET_CODE (next) == SUBREG)
701
    {
702
      if (!subreg_lowpart_p (next))
703
        return false;
704
 
705
      nextr = SUBREG_REG (next);
706
      if (GET_MODE (nextr) != outer_mode)
707
        return false;
708
    }
709
  else
710
    nextr = next;
711
 
712
  res = iv_get_reaching_def (insn, nextr, &next_def);
713
 
714
  if (res == GRD_INVALID || res == GRD_INVARIANT)
715
    return false;
716
 
717
  if (res == GRD_MAYBE_BIV)
718
    {
719
      if (!rtx_equal_p (nextr, reg))
720
        return false;
721
 
722
      *inner_step = const0_rtx;
723
      *extend = UNKNOWN;
724
      *inner_mode = outer_mode;
725
      *outer_step = const0_rtx;
726
    }
727
  else if (!get_biv_step_1 (next_def, reg,
728
                            inner_step, inner_mode, extend, outer_mode,
729
                            outer_step))
730
    return false;
731
 
732
  if (GET_CODE (next) == SUBREG)
733
    {
734
      enum machine_mode amode = GET_MODE (next);
735
 
736
      if (GET_MODE_SIZE (amode) > GET_MODE_SIZE (*inner_mode))
737
        return false;
738
 
739
      *inner_mode = amode;
740
      *inner_step = simplify_gen_binary (PLUS, outer_mode,
741
                                         *inner_step, *outer_step);
742
      *outer_step = const0_rtx;
743
      *extend = UNKNOWN;
744
    }
745
 
746
  switch (code)
747
    {
748
    case REG:
749
    case SUBREG:
750
      break;
751
 
752
    case PLUS:
753
    case MINUS:
754
      if (*inner_mode == outer_mode
755
          /* See comment in previous switch.  */
756
          || GET_MODE (rhs) != outer_mode)
757
        *inner_step = simplify_gen_binary (code, outer_mode,
758
                                           *inner_step, op1);
759
      else
760
        *outer_step = simplify_gen_binary (code, outer_mode,
761
                                           *outer_step, op1);
762
      break;
763
 
764
    case SIGN_EXTEND:
765
    case ZERO_EXTEND:
766
      gcc_assert (GET_MODE (op0) == *inner_mode
767
                  && *extend == UNKNOWN
768
                  && *outer_step == const0_rtx);
769
 
770
      *extend = code;
771
      break;
772
 
773
    default:
774
      return false;
775
    }
776
 
777
  return true;
778
}
779
 
780
/* Gets the operation on register REG inside loop, in shape
781
 
782
   OUTER_STEP + EXTEND_{OUTER_MODE} (SUBREG_{INNER_MODE} (REG + INNER_STEP))
783
 
784
   If the operation cannot be described in this shape, return false.
785
   LAST_DEF is the definition of REG that dominates loop latch.  */
786
 
787
static bool
788
get_biv_step (df_ref last_def, rtx reg, rtx *inner_step,
789
              enum machine_mode *inner_mode, enum rtx_code *extend,
790
              enum machine_mode *outer_mode, rtx *outer_step)
791
{
792
  *outer_mode = GET_MODE (reg);
793
 
794
  if (!get_biv_step_1 (last_def, reg,
795
                       inner_step, inner_mode, extend, *outer_mode,
796
                       outer_step))
797
    return false;
798
 
799
  gcc_assert ((*inner_mode == *outer_mode) != (*extend != UNKNOWN));
800
  gcc_assert (*inner_mode != *outer_mode || *outer_step == const0_rtx);
801
 
802
  return true;
803
}
804
 
805
/* Records information that DEF is induction variable IV.  */
806
 
807
static void
808
record_iv (df_ref def, struct rtx_iv *iv)
809
{
810
  struct rtx_iv *recorded_iv = XNEW (struct rtx_iv);
811
 
812
  *recorded_iv = *iv;
813
  check_iv_ref_table_size ();
814
  DF_REF_IV_SET (def, recorded_iv);
815
}
816
 
817
/* If DEF was already analyzed for bivness, store the description of the biv to
818
   IV and return true.  Otherwise return false.  */
819
 
820
static bool
821
analyzed_for_bivness_p (rtx def, struct rtx_iv *iv)
822
{
823
  struct biv_entry *biv =
824
    (struct biv_entry *) htab_find_with_hash (bivs, def, REGNO (def));
825
 
826
  if (!biv)
827
    return false;
828
 
829
  *iv = biv->iv;
830
  return true;
831
}
832
 
833
static void
834
record_biv (rtx def, struct rtx_iv *iv)
835
{
836
  struct biv_entry *biv = XNEW (struct biv_entry);
837
  void **slot = htab_find_slot_with_hash (bivs, def, REGNO (def), INSERT);
838
 
839
  biv->regno = REGNO (def);
840
  biv->iv = *iv;
841
  gcc_assert (!*slot);
842
  *slot = biv;
843
}
844
 
845
/* Determines whether DEF is a biv and if so, stores its description
846
   to *IV.  */
847
 
848
static bool
849
iv_analyze_biv (rtx def, struct rtx_iv *iv)
850
{
851
  rtx inner_step, outer_step;
852
  enum machine_mode inner_mode, outer_mode;
853
  enum rtx_code extend;
854
  df_ref last_def;
855
 
856
  if (dump_file)
857
    {
858
      fprintf (dump_file, "Analyzing ");
859
      print_rtl (dump_file, def);
860
      fprintf (dump_file, " for bivness.\n");
861
    }
862
 
863
  if (!REG_P (def))
864
    {
865
      if (!CONSTANT_P (def))
866
        return false;
867
 
868
      return iv_constant (iv, def, VOIDmode);
869
    }
870
 
871
  if (!latch_dominating_def (def, &last_def))
872
    {
873
      if (dump_file)
874
        fprintf (dump_file, "  not simple.\n");
875
      return false;
876
    }
877
 
878
  if (!last_def)
879
    return iv_constant (iv, def, VOIDmode);
880
 
881
  if (analyzed_for_bivness_p (def, iv))
882
    {
883
      if (dump_file)
884
        fprintf (dump_file, "  already analysed.\n");
885
      return iv->base != NULL_RTX;
886
    }
887
 
888
  if (!get_biv_step (last_def, def, &inner_step, &inner_mode, &extend,
889
                     &outer_mode, &outer_step))
890
    {
891
      iv->base = NULL_RTX;
892
      goto end;
893
    }
894
 
895
  /* Loop transforms base to es (base + inner_step) + outer_step,
896
     where es means extend of subreg between inner_mode and outer_mode.
897
     The corresponding induction variable is
898
 
899
     es ((base - outer_step) + i * (inner_step + outer_step)) + outer_step  */
900
 
901
  iv->base = simplify_gen_binary (MINUS, outer_mode, def, outer_step);
902
  iv->step = simplify_gen_binary (PLUS, outer_mode, inner_step, outer_step);
903
  iv->mode = inner_mode;
904
  iv->extend_mode = outer_mode;
905
  iv->extend = extend;
906
  iv->mult = const1_rtx;
907
  iv->delta = outer_step;
908
  iv->first_special = inner_mode != outer_mode;
909
 
910
 end:
911
  if (dump_file)
912
    {
913
      fprintf (dump_file, "  ");
914
      dump_iv_info (dump_file, iv);
915
      fprintf (dump_file, "\n");
916
    }
917
 
918
  record_biv (def, iv);
919
  return iv->base != NULL_RTX;
920
}
921
 
922
/* Analyzes expression RHS used at INSN and stores the result to *IV.
923
   The mode of the induction variable is MODE.  */
924
 
925
bool
926
iv_analyze_expr (rtx insn, rtx rhs, enum machine_mode mode, struct rtx_iv *iv)
927
{
928
  rtx mby = NULL_RTX, tmp;
929
  rtx op0 = NULL_RTX, op1 = NULL_RTX;
930
  struct rtx_iv iv0, iv1;
931
  enum rtx_code code = GET_CODE (rhs);
932
  enum machine_mode omode = mode;
933
 
934
  iv->mode = VOIDmode;
935
  iv->base = NULL_RTX;
936
  iv->step = NULL_RTX;
937
 
938
  gcc_assert (GET_MODE (rhs) == mode || GET_MODE (rhs) == VOIDmode);
939
 
940
  if (CONSTANT_P (rhs)
941
      || REG_P (rhs)
942
      || code == SUBREG)
943
    {
944
      if (!iv_analyze_op (insn, rhs, iv))
945
        return false;
946
 
947
      if (iv->mode == VOIDmode)
948
        {
949
          iv->mode = mode;
950
          iv->extend_mode = mode;
951
        }
952
 
953
      return true;
954
    }
955
 
956
  switch (code)
957
    {
958
    case REG:
959
      op0 = rhs;
960
      break;
961
 
962
    case SIGN_EXTEND:
963
    case ZERO_EXTEND:
964
    case NEG:
965
      op0 = XEXP (rhs, 0);
966
      omode = GET_MODE (op0);
967
      break;
968
 
969
    case PLUS:
970
    case MINUS:
971
      op0 = XEXP (rhs, 0);
972
      op1 = XEXP (rhs, 1);
973
      break;
974
 
975
    case MULT:
976
      op0 = XEXP (rhs, 0);
977
      mby = XEXP (rhs, 1);
978
      if (!CONSTANT_P (mby))
979
        {
980
          tmp = op0;
981
          op0 = mby;
982
          mby = tmp;
983
        }
984
      if (!CONSTANT_P (mby))
985
        return false;
986
      break;
987
 
988
    case ASHIFT:
989
      op0 = XEXP (rhs, 0);
990
      mby = XEXP (rhs, 1);
991
      if (!CONSTANT_P (mby))
992
        return false;
993
      break;
994
 
995
    default:
996
      return false;
997
    }
998
 
999
  if (op0
1000
      && !iv_analyze_expr (insn, op0, omode, &iv0))
1001
    return false;
1002
 
1003
  if (op1
1004
      && !iv_analyze_expr (insn, op1, omode, &iv1))
1005
    return false;
1006
 
1007
  switch (code)
1008
    {
1009
    case SIGN_EXTEND:
1010
    case ZERO_EXTEND:
1011
      if (!iv_extend (&iv0, code, mode))
1012
        return false;
1013
      break;
1014
 
1015
    case NEG:
1016
      if (!iv_neg (&iv0))
1017
        return false;
1018
      break;
1019
 
1020
    case PLUS:
1021
    case MINUS:
1022
      if (!iv_add (&iv0, &iv1, code))
1023
        return false;
1024
      break;
1025
 
1026
    case MULT:
1027
      if (!iv_mult (&iv0, mby))
1028
        return false;
1029
      break;
1030
 
1031
    case ASHIFT:
1032
      if (!iv_shift (&iv0, mby))
1033
        return false;
1034
      break;
1035
 
1036
    default:
1037
      break;
1038
    }
1039
 
1040
  *iv = iv0;
1041
  return iv->base != NULL_RTX;
1042
}
1043
 
1044
/* Analyzes iv DEF and stores the result to *IV.  */
1045
 
1046
static bool
1047
iv_analyze_def (df_ref def, struct rtx_iv *iv)
1048
{
1049
  rtx insn = DF_REF_INSN (def);
1050
  rtx reg = DF_REF_REG (def);
1051
  rtx set, rhs;
1052
 
1053
  if (dump_file)
1054
    {
1055
      fprintf (dump_file, "Analyzing def of ");
1056
      print_rtl (dump_file, reg);
1057
      fprintf (dump_file, " in insn ");
1058
      print_rtl_single (dump_file, insn);
1059
    }
1060
 
1061
  check_iv_ref_table_size ();
1062
  if (DF_REF_IV (def))
1063
    {
1064
      if (dump_file)
1065
        fprintf (dump_file, "  already analysed.\n");
1066
      *iv = *DF_REF_IV (def);
1067
      return iv->base != NULL_RTX;
1068
    }
1069
 
1070
  iv->mode = VOIDmode;
1071
  iv->base = NULL_RTX;
1072
  iv->step = NULL_RTX;
1073
 
1074
  if (!REG_P (reg))
1075
    return false;
1076
 
1077
  set = single_set (insn);
1078
  if (!set)
1079
    return false;
1080
 
1081
  if (!REG_P (SET_DEST (set)))
1082
    return false;
1083
 
1084
  gcc_assert (SET_DEST (set) == reg);
1085
  rhs = find_reg_equal_equiv_note (insn);
1086
  if (rhs)
1087
    rhs = XEXP (rhs, 0);
1088
  else
1089
    rhs = SET_SRC (set);
1090
 
1091
  iv_analyze_expr (insn, rhs, GET_MODE (reg), iv);
1092
  record_iv (def, iv);
1093
 
1094
  if (dump_file)
1095
    {
1096
      print_rtl (dump_file, reg);
1097
      fprintf (dump_file, " in insn ");
1098
      print_rtl_single (dump_file, insn);
1099
      fprintf (dump_file, "  is ");
1100
      dump_iv_info (dump_file, iv);
1101
      fprintf (dump_file, "\n");
1102
    }
1103
 
1104
  return iv->base != NULL_RTX;
1105
}
1106
 
1107
/* Analyzes operand OP of INSN and stores the result to *IV.  */
1108
 
1109
static bool
1110
iv_analyze_op (rtx insn, rtx op, struct rtx_iv *iv)
1111
{
1112
  df_ref def = NULL;
1113
  enum iv_grd_result res;
1114
 
1115
  if (dump_file)
1116
    {
1117
      fprintf (dump_file, "Analyzing operand ");
1118
      print_rtl (dump_file, op);
1119
      fprintf (dump_file, " of insn ");
1120
      print_rtl_single (dump_file, insn);
1121
    }
1122
 
1123
  if (function_invariant_p (op))
1124
    res = GRD_INVARIANT;
1125
  else if (GET_CODE (op) == SUBREG)
1126
    {
1127
      if (!subreg_lowpart_p (op))
1128
        return false;
1129
 
1130
      if (!iv_analyze_op (insn, SUBREG_REG (op), iv))
1131
        return false;
1132
 
1133
      return iv_subreg (iv, GET_MODE (op));
1134
    }
1135
  else
1136
    {
1137
      res = iv_get_reaching_def (insn, op, &def);
1138
      if (res == GRD_INVALID)
1139
        {
1140
          if (dump_file)
1141
            fprintf (dump_file, "  not simple.\n");
1142
          return false;
1143
        }
1144
    }
1145
 
1146
  if (res == GRD_INVARIANT)
1147
    {
1148
      iv_constant (iv, op, VOIDmode);
1149
 
1150
      if (dump_file)
1151
        {
1152
          fprintf (dump_file, "  ");
1153
          dump_iv_info (dump_file, iv);
1154
          fprintf (dump_file, "\n");
1155
        }
1156
      return true;
1157
    }
1158
 
1159
  if (res == GRD_MAYBE_BIV)
1160
    return iv_analyze_biv (op, iv);
1161
 
1162
  return iv_analyze_def (def, iv);
1163
}
1164
 
1165
/* Analyzes value VAL at INSN and stores the result to *IV.  */
1166
 
1167
bool
1168
iv_analyze (rtx insn, rtx val, struct rtx_iv *iv)
1169
{
1170
  rtx reg;
1171
 
1172
  /* We must find the insn in that val is used, so that we get to UD chains.
1173
     Since the function is sometimes called on result of get_condition,
1174
     this does not necessarily have to be directly INSN; scan also the
1175
     following insns.  */
1176
  if (simple_reg_p (val))
1177
    {
1178
      if (GET_CODE (val) == SUBREG)
1179
        reg = SUBREG_REG (val);
1180
      else
1181
        reg = val;
1182
 
1183
      while (!df_find_use (insn, reg))
1184
        insn = NEXT_INSN (insn);
1185
    }
1186
 
1187
  return iv_analyze_op (insn, val, iv);
1188
}
1189
 
1190
/* Analyzes definition of DEF in INSN and stores the result to IV.  */
1191
 
1192
bool
1193
iv_analyze_result (rtx insn, rtx def, struct rtx_iv *iv)
1194
{
1195
  df_ref adef;
1196
 
1197
  adef = df_find_def (insn, def);
1198
  if (!adef)
1199
    return false;
1200
 
1201
  return iv_analyze_def (adef, iv);
1202
}
1203
 
1204
/* Checks whether definition of register REG in INSN is a basic induction
1205
   variable.  IV analysis must have been initialized (via a call to
1206
   iv_analysis_loop_init) for this function to produce a result.  */
1207
 
1208
bool
1209
biv_p (rtx insn, rtx reg)
1210
{
1211
  struct rtx_iv iv;
1212
  df_ref def, last_def;
1213
 
1214
  if (!simple_reg_p (reg))
1215
    return false;
1216
 
1217
  def = df_find_def (insn, reg);
1218
  gcc_assert (def != NULL);
1219
  if (!latch_dominating_def (reg, &last_def))
1220
    return false;
1221
  if (last_def != def)
1222
    return false;
1223
 
1224
  if (!iv_analyze_biv (reg, &iv))
1225
    return false;
1226
 
1227
  return iv.step != const0_rtx;
1228
}
1229
 
1230
/* Calculates value of IV at ITERATION-th iteration.  */
1231
 
1232
rtx
1233
get_iv_value (struct rtx_iv *iv, rtx iteration)
1234
{
1235
  rtx val;
1236
 
1237
  /* We would need to generate some if_then_else patterns, and so far
1238
     it is not needed anywhere.  */
1239
  gcc_assert (!iv->first_special);
1240
 
1241
  if (iv->step != const0_rtx && iteration != const0_rtx)
1242
    val = simplify_gen_binary (PLUS, iv->extend_mode, iv->base,
1243
                               simplify_gen_binary (MULT, iv->extend_mode,
1244
                                                    iv->step, iteration));
1245
  else
1246
    val = iv->base;
1247
 
1248
  if (iv->extend_mode == iv->mode)
1249
    return val;
1250
 
1251
  val = lowpart_subreg (iv->mode, val, iv->extend_mode);
1252
 
1253
  if (iv->extend == UNKNOWN)
1254
    return val;
1255
 
1256
  val = simplify_gen_unary (iv->extend, iv->extend_mode, val, iv->mode);
1257
  val = simplify_gen_binary (PLUS, iv->extend_mode, iv->delta,
1258
                             simplify_gen_binary (MULT, iv->extend_mode,
1259
                                                  iv->mult, val));
1260
 
1261
  return val;
1262
}
1263
 
1264
/* Free the data for an induction variable analysis.  */
1265
 
1266
void
1267
iv_analysis_done (void)
1268
{
1269
  if (!clean_slate)
1270
    {
1271
      clear_iv_info ();
1272
      clean_slate = true;
1273
      df_finish_pass (true);
1274
      htab_delete (bivs);
1275
      free (iv_ref_table);
1276
      iv_ref_table = NULL;
1277
      iv_ref_table_size = 0;
1278
      bivs = NULL;
1279
    }
1280
}
1281
 
1282
/* Computes inverse to X modulo (1 << MOD).  */
1283
 
1284
static unsigned HOST_WIDEST_INT
1285
inverse (unsigned HOST_WIDEST_INT x, int mod)
1286
{
1287
  unsigned HOST_WIDEST_INT mask =
1288
          ((unsigned HOST_WIDEST_INT) 1 << (mod - 1) << 1) - 1;
1289
  unsigned HOST_WIDEST_INT rslt = 1;
1290
  int i;
1291
 
1292
  for (i = 0; i < mod - 1; i++)
1293
    {
1294
      rslt = (rslt * x) & mask;
1295
      x = (x * x) & mask;
1296
    }
1297
 
1298
  return rslt;
1299
}
1300
 
1301
/* Checks whether register *REG is in set ALT.  Callback for for_each_rtx.  */
1302
 
1303
static int
1304
altered_reg_used (rtx *reg, void *alt)
1305
{
1306
  if (!REG_P (*reg))
1307
    return 0;
1308
 
1309
  return REGNO_REG_SET_P ((bitmap) alt, REGNO (*reg));
1310
}
1311
 
1312
/* Marks registers altered by EXPR in set ALT.  */
1313
 
1314
static void
1315
mark_altered (rtx expr, const_rtx by ATTRIBUTE_UNUSED, void *alt)
1316
{
1317
  if (GET_CODE (expr) == SUBREG)
1318
    expr = SUBREG_REG (expr);
1319
  if (!REG_P (expr))
1320
    return;
1321
 
1322
  SET_REGNO_REG_SET ((bitmap) alt, REGNO (expr));
1323
}
1324
 
1325
/* Checks whether RHS is simple enough to process.  */
1326
 
1327
static bool
1328
simple_rhs_p (rtx rhs)
1329
{
1330
  rtx op0, op1;
1331
 
1332
  if (function_invariant_p (rhs)
1333
      || (REG_P (rhs) && !HARD_REGISTER_P (rhs)))
1334
    return true;
1335
 
1336
  switch (GET_CODE (rhs))
1337
    {
1338
    case PLUS:
1339
    case MINUS:
1340
    case AND:
1341
      op0 = XEXP (rhs, 0);
1342
      op1 = XEXP (rhs, 1);
1343
      /* Allow reg OP const and reg OP reg.  */
1344
      if (!(REG_P (op0) && !HARD_REGISTER_P (op0))
1345
          && !function_invariant_p (op0))
1346
        return false;
1347
      if (!(REG_P (op1) && !HARD_REGISTER_P (op1))
1348
          && !function_invariant_p (op1))
1349
        return false;
1350
 
1351
      return true;
1352
 
1353
    case ASHIFT:
1354
    case ASHIFTRT:
1355
    case LSHIFTRT:
1356
    case MULT:
1357
      op0 = XEXP (rhs, 0);
1358
      op1 = XEXP (rhs, 1);
1359
      /* Allow reg OP const.  */
1360
      if (!(REG_P (op0) && !HARD_REGISTER_P (op0)))
1361
        return false;
1362
      if (!function_invariant_p (op1))
1363
        return false;
1364
 
1365
      return true;
1366
 
1367
    default:
1368
      return false;
1369
    }
1370
}
1371
 
1372
/* If REG has a single definition, replace it with its known value in EXPR.
1373
   Callback for for_each_rtx.  */
1374
 
1375
static int
1376
replace_single_def_regs (rtx *reg, void *expr1)
1377
{
1378
  unsigned regno;
1379
  df_ref adef;
1380
  rtx set, src;
1381
  rtx *expr = (rtx *)expr1;
1382
 
1383
  if (!REG_P (*reg))
1384
    return 0;
1385
 
1386
  regno = REGNO (*reg);
1387
  for (;;)
1388
    {
1389
      rtx note;
1390
      adef = DF_REG_DEF_CHAIN (regno);
1391
      if (adef == NULL || DF_REF_NEXT_REG (adef) != NULL
1392
            || DF_REF_IS_ARTIFICIAL (adef))
1393
        return -1;
1394
 
1395
      set = single_set (DF_REF_INSN (adef));
1396
      if (set == NULL || !REG_P (SET_DEST (set))
1397
          || REGNO (SET_DEST (set)) != regno)
1398
        return -1;
1399
 
1400
      note = find_reg_equal_equiv_note (DF_REF_INSN (adef));
1401
 
1402
      if (note && function_invariant_p (XEXP (note, 0)))
1403
        {
1404
          src = XEXP (note, 0);
1405
          break;
1406
        }
1407
      src = SET_SRC (set);
1408
 
1409
      if (REG_P (src))
1410
        {
1411
          regno = REGNO (src);
1412
          continue;
1413
        }
1414
      break;
1415
    }
1416
  if (!function_invariant_p (src))
1417
    return -1;
1418
 
1419
  *expr = simplify_replace_rtx (*expr, *reg, src);
1420
  return 1;
1421
}
1422
 
1423
/* A subroutine of simplify_using_initial_values, this function examines INSN
1424
   to see if it contains a suitable set that we can use to make a replacement.
1425
   If it is suitable, return true and set DEST and SRC to the lhs and rhs of
1426
   the set; return false otherwise.  */
1427
 
1428
static bool
1429
suitable_set_for_replacement (rtx insn, rtx *dest, rtx *src)
1430
{
1431
  rtx set = single_set (insn);
1432
  rtx lhs = NULL_RTX, rhs;
1433
 
1434
  if (!set)
1435
    return false;
1436
 
1437
  lhs = SET_DEST (set);
1438
  if (!REG_P (lhs))
1439
    return false;
1440
 
1441
  rhs = find_reg_equal_equiv_note (insn);
1442
  if (rhs)
1443
    rhs = XEXP (rhs, 0);
1444
  else
1445
    rhs = SET_SRC (set);
1446
 
1447
  if (!simple_rhs_p (rhs))
1448
    return false;
1449
 
1450
  *dest = lhs;
1451
  *src = rhs;
1452
  return true;
1453
}
1454
 
1455
/* Using the data returned by suitable_set_for_replacement, replace DEST
1456
   with SRC in *EXPR and return the new expression.  Also call
1457
   replace_single_def_regs if the replacement changed something.  */
1458
static void
1459
replace_in_expr (rtx *expr, rtx dest, rtx src)
1460
{
1461
  rtx old = *expr;
1462
  *expr = simplify_replace_rtx (*expr, dest, src);
1463
  if (old == *expr)
1464
    return;
1465
  while (for_each_rtx (expr, replace_single_def_regs, expr) != 0)
1466
    continue;
1467
}
1468
 
1469
/* Checks whether A implies B.  */
1470
 
1471
static bool
1472
implies_p (rtx a, rtx b)
1473
{
1474
  rtx op0, op1, opb0, opb1, r;
1475
  enum machine_mode mode;
1476
 
1477
  if (GET_CODE (a) == EQ)
1478
    {
1479
      op0 = XEXP (a, 0);
1480
      op1 = XEXP (a, 1);
1481
 
1482
      if (REG_P (op0))
1483
        {
1484
          r = simplify_replace_rtx (b, op0, op1);
1485
          if (r == const_true_rtx)
1486
            return true;
1487
        }
1488
 
1489
      if (REG_P (op1))
1490
        {
1491
          r = simplify_replace_rtx (b, op1, op0);
1492
          if (r == const_true_rtx)
1493
            return true;
1494
        }
1495
    }
1496
 
1497
  if (b == const_true_rtx)
1498
    return true;
1499
 
1500
  if ((GET_RTX_CLASS (GET_CODE (a)) != RTX_COMM_COMPARE
1501
       && GET_RTX_CLASS (GET_CODE (a)) != RTX_COMPARE)
1502
      || (GET_RTX_CLASS (GET_CODE (b)) != RTX_COMM_COMPARE
1503
          && GET_RTX_CLASS (GET_CODE (b)) != RTX_COMPARE))
1504
    return false;
1505
 
1506
  op0 = XEXP (a, 0);
1507
  op1 = XEXP (a, 1);
1508
  opb0 = XEXP (b, 0);
1509
  opb1 = XEXP (b, 1);
1510
 
1511
  mode = GET_MODE (op0);
1512
  if (mode != GET_MODE (opb0))
1513
    mode = VOIDmode;
1514
  else if (mode == VOIDmode)
1515
    {
1516
      mode = GET_MODE (op1);
1517
      if (mode != GET_MODE (opb1))
1518
        mode = VOIDmode;
1519
    }
1520
 
1521
  /* A < B implies A + 1 <= B.  */
1522
  if ((GET_CODE (a) == GT || GET_CODE (a) == LT)
1523
      && (GET_CODE (b) == GE || GET_CODE (b) == LE))
1524
    {
1525
 
1526
      if (GET_CODE (a) == GT)
1527
        {
1528
          r = op0;
1529
          op0 = op1;
1530
          op1 = r;
1531
        }
1532
 
1533
      if (GET_CODE (b) == GE)
1534
        {
1535
          r = opb0;
1536
          opb0 = opb1;
1537
          opb1 = r;
1538
        }
1539
 
1540
      if (SCALAR_INT_MODE_P (mode)
1541
          && rtx_equal_p (op1, opb1)
1542
          && simplify_gen_binary (MINUS, mode, opb0, op0) == const1_rtx)
1543
        return true;
1544
      return false;
1545
    }
1546
 
1547
  /* A < B or A > B imply A != B.  TODO: Likewise
1548
     A + n < B implies A != B + n if neither wraps.  */
1549
  if (GET_CODE (b) == NE
1550
      && (GET_CODE (a) == GT || GET_CODE (a) == GTU
1551
          || GET_CODE (a) == LT || GET_CODE (a) == LTU))
1552
    {
1553
      if (rtx_equal_p (op0, opb0)
1554
          && rtx_equal_p (op1, opb1))
1555
        return true;
1556
    }
1557
 
1558
  /* For unsigned comparisons, A != 0 implies A > 0 and A >= 1.  */
1559
  if (GET_CODE (a) == NE
1560
      && op1 == const0_rtx)
1561
    {
1562
      if ((GET_CODE (b) == GTU
1563
           && opb1 == const0_rtx)
1564
          || (GET_CODE (b) == GEU
1565
              && opb1 == const1_rtx))
1566
        return rtx_equal_p (op0, opb0);
1567
    }
1568
 
1569
  /* A != N is equivalent to A - (N + 1) <u -1.  */
1570
  if (GET_CODE (a) == NE
1571
      && CONST_INT_P (op1)
1572
      && GET_CODE (b) == LTU
1573
      && opb1 == constm1_rtx
1574
      && GET_CODE (opb0) == PLUS
1575
      && CONST_INT_P (XEXP (opb0, 1))
1576
      /* Avoid overflows.  */
1577
      && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (opb0, 1))
1578
          != ((unsigned HOST_WIDE_INT)1
1579
              << (HOST_BITS_PER_WIDE_INT - 1)) - 1)
1580
      && INTVAL (XEXP (opb0, 1)) + 1 == -INTVAL (op1))
1581
    return rtx_equal_p (op0, XEXP (opb0, 0));
1582
 
1583
  /* Likewise, A != N implies A - N > 0.  */
1584
  if (GET_CODE (a) == NE
1585
      && CONST_INT_P (op1))
1586
    {
1587
      if (GET_CODE (b) == GTU
1588
          && GET_CODE (opb0) == PLUS
1589
          && opb1 == const0_rtx
1590
          && CONST_INT_P (XEXP (opb0, 1))
1591
          /* Avoid overflows.  */
1592
          && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (opb0, 1))
1593
              != ((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1)))
1594
          && rtx_equal_p (XEXP (opb0, 0), op0))
1595
        return INTVAL (op1) == -INTVAL (XEXP (opb0, 1));
1596
      if (GET_CODE (b) == GEU
1597
          && GET_CODE (opb0) == PLUS
1598
          && opb1 == const1_rtx
1599
          && CONST_INT_P (XEXP (opb0, 1))
1600
          /* Avoid overflows.  */
1601
          && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (opb0, 1))
1602
              != ((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1)))
1603
          && rtx_equal_p (XEXP (opb0, 0), op0))
1604
        return INTVAL (op1) == -INTVAL (XEXP (opb0, 1));
1605
    }
1606
 
1607
  /* A >s X, where X is positive, implies A <u Y, if Y is negative.  */
1608
  if ((GET_CODE (a) == GT || GET_CODE (a) == GE)
1609
      && CONST_INT_P (op1)
1610
      && ((GET_CODE (a) == GT && op1 == constm1_rtx)
1611
          || INTVAL (op1) >= 0)
1612
      && GET_CODE (b) == LTU
1613
      && CONST_INT_P (opb1)
1614
      && rtx_equal_p (op0, opb0))
1615
    return INTVAL (opb1) < 0;
1616
 
1617
  return false;
1618
}
1619
 
1620
/* Canonicalizes COND so that
1621
 
1622
   (1) Ensure that operands are ordered according to
1623
       swap_commutative_operands_p.
1624
   (2) (LE x const) will be replaced with (LT x <const+1>) and similarly
1625
       for GE, GEU, and LEU.  */
1626
 
1627
rtx
1628
canon_condition (rtx cond)
1629
{
1630
  rtx tem;
1631
  rtx op0, op1;
1632
  enum rtx_code code;
1633
  enum machine_mode mode;
1634
 
1635
  code = GET_CODE (cond);
1636
  op0 = XEXP (cond, 0);
1637
  op1 = XEXP (cond, 1);
1638
 
1639
  if (swap_commutative_operands_p (op0, op1))
1640
    {
1641
      code = swap_condition (code);
1642
      tem = op0;
1643
      op0 = op1;
1644
      op1 = tem;
1645
    }
1646
 
1647
  mode = GET_MODE (op0);
1648
  if (mode == VOIDmode)
1649
    mode = GET_MODE (op1);
1650
  gcc_assert (mode != VOIDmode);
1651
 
1652
  if (CONST_INT_P (op1)
1653
      && GET_MODE_CLASS (mode) != MODE_CC
1654
      && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
1655
    {
1656
      HOST_WIDE_INT const_val = INTVAL (op1);
1657
      unsigned HOST_WIDE_INT uconst_val = const_val;
1658
      unsigned HOST_WIDE_INT max_val
1659
        = (unsigned HOST_WIDE_INT) GET_MODE_MASK (mode);
1660
 
1661
      switch (code)
1662
        {
1663
        case LE:
1664
          if ((unsigned HOST_WIDE_INT) const_val != max_val >> 1)
1665
            code = LT, op1 = gen_int_mode (const_val + 1, GET_MODE (op0));
1666
          break;
1667
 
1668
        /* When cross-compiling, const_val might be sign-extended from
1669
           BITS_PER_WORD to HOST_BITS_PER_WIDE_INT */
1670
        case GE:
1671
          if ((HOST_WIDE_INT) (const_val & max_val)
1672
              != (((HOST_WIDE_INT) 1
1673
                   << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
1674
            code = GT, op1 = gen_int_mode (const_val - 1, mode);
1675
          break;
1676
 
1677
        case LEU:
1678
          if (uconst_val < max_val)
1679
            code = LTU, op1 = gen_int_mode (uconst_val + 1, mode);
1680
          break;
1681
 
1682
        case GEU:
1683
          if (uconst_val != 0)
1684
            code = GTU, op1 = gen_int_mode (uconst_val - 1, mode);
1685
          break;
1686
 
1687
        default:
1688
          break;
1689
        }
1690
    }
1691
 
1692
  if (op0 != XEXP (cond, 0)
1693
      || op1 != XEXP (cond, 1)
1694
      || code != GET_CODE (cond)
1695
      || GET_MODE (cond) != SImode)
1696
    cond = gen_rtx_fmt_ee (code, SImode, op0, op1);
1697
 
1698
  return cond;
1699
}
1700
 
1701
/* Tries to use the fact that COND holds to simplify EXPR.  ALTERED is the
1702
   set of altered regs.  */
1703
 
1704
void
1705
simplify_using_condition (rtx cond, rtx *expr, regset altered)
1706
{
1707
  rtx rev, reve, exp = *expr;
1708
 
1709
  /* If some register gets altered later, we do not really speak about its
1710
     value at the time of comparison.  */
1711
  if (altered
1712
      && for_each_rtx (&cond, altered_reg_used, altered))
1713
    return;
1714
 
1715
  if (GET_CODE (cond) == EQ
1716
      && REG_P (XEXP (cond, 0)) && CONSTANT_P (XEXP (cond, 1)))
1717
    {
1718
      *expr = simplify_replace_rtx (*expr, XEXP (cond, 0), XEXP (cond, 1));
1719
      return;
1720
    }
1721
 
1722
  if (!COMPARISON_P (exp))
1723
    return;
1724
 
1725
  rev = reversed_condition (cond);
1726
  reve = reversed_condition (exp);
1727
 
1728
  cond = canon_condition (cond);
1729
  exp = canon_condition (exp);
1730
  if (rev)
1731
    rev = canon_condition (rev);
1732
  if (reve)
1733
    reve = canon_condition (reve);
1734
 
1735
  if (rtx_equal_p (exp, cond))
1736
    {
1737
      *expr = const_true_rtx;
1738
      return;
1739
    }
1740
 
1741
  if (rev && rtx_equal_p (exp, rev))
1742
    {
1743
      *expr = const0_rtx;
1744
      return;
1745
    }
1746
 
1747
  if (implies_p (cond, exp))
1748
    {
1749
      *expr = const_true_rtx;
1750
      return;
1751
    }
1752
 
1753
  if (reve && implies_p (cond, reve))
1754
    {
1755
      *expr = const0_rtx;
1756
      return;
1757
    }
1758
 
1759
  /* A proof by contradiction.  If *EXPR implies (not cond), *EXPR must
1760
     be false.  */
1761
  if (rev && implies_p (exp, rev))
1762
    {
1763
      *expr = const0_rtx;
1764
      return;
1765
    }
1766
 
1767
  /* Similarly, If (not *EXPR) implies (not cond), *EXPR must be true.  */
1768
  if (rev && reve && implies_p (reve, rev))
1769
    {
1770
      *expr = const_true_rtx;
1771
      return;
1772
    }
1773
 
1774
  /* We would like to have some other tests here.  TODO.  */
1775
 
1776
  return;
1777
}
1778
 
1779
/* Use relationship between A and *B to eventually eliminate *B.
1780
   OP is the operation we consider.  */
1781
 
1782
static void
1783
eliminate_implied_condition (enum rtx_code op, rtx a, rtx *b)
1784
{
1785
  switch (op)
1786
    {
1787
    case AND:
1788
      /* If A implies *B, we may replace *B by true.  */
1789
      if (implies_p (a, *b))
1790
        *b = const_true_rtx;
1791
      break;
1792
 
1793
    case IOR:
1794
      /* If *B implies A, we may replace *B by false.  */
1795
      if (implies_p (*b, a))
1796
        *b = const0_rtx;
1797
      break;
1798
 
1799
    default:
1800
      gcc_unreachable ();
1801
    }
1802
}
1803
 
1804
/* Eliminates the conditions in TAIL that are implied by HEAD.  OP is the
1805
   operation we consider.  */
1806
 
1807
static void
1808
eliminate_implied_conditions (enum rtx_code op, rtx *head, rtx tail)
1809
{
1810
  rtx elt;
1811
 
1812
  for (elt = tail; elt; elt = XEXP (elt, 1))
1813
    eliminate_implied_condition (op, *head, &XEXP (elt, 0));
1814
  for (elt = tail; elt; elt = XEXP (elt, 1))
1815
    eliminate_implied_condition (op, XEXP (elt, 0), head);
1816
}
1817
 
1818
/* Simplifies *EXPR using initial values at the start of the LOOP.  If *EXPR
1819
   is a list, its elements are assumed to be combined using OP.  */
1820
 
1821
static void
1822
simplify_using_initial_values (struct loop *loop, enum rtx_code op, rtx *expr)
1823
{
1824
  bool expression_valid;
1825
  rtx head, tail, insn, cond_list, last_valid_expr;
1826
  rtx neutral, aggr;
1827
  regset altered, this_altered;
1828
  edge e;
1829
 
1830
  if (!*expr)
1831
    return;
1832
 
1833
  if (CONSTANT_P (*expr))
1834
    return;
1835
 
1836
  if (GET_CODE (*expr) == EXPR_LIST)
1837
    {
1838
      head = XEXP (*expr, 0);
1839
      tail = XEXP (*expr, 1);
1840
 
1841
      eliminate_implied_conditions (op, &head, tail);
1842
 
1843
      switch (op)
1844
        {
1845
        case AND:
1846
          neutral = const_true_rtx;
1847
          aggr = const0_rtx;
1848
          break;
1849
 
1850
        case IOR:
1851
          neutral = const0_rtx;
1852
          aggr = const_true_rtx;
1853
          break;
1854
 
1855
        default:
1856
          gcc_unreachable ();
1857
        }
1858
 
1859
      simplify_using_initial_values (loop, UNKNOWN, &head);
1860
      if (head == aggr)
1861
        {
1862
          XEXP (*expr, 0) = aggr;
1863
          XEXP (*expr, 1) = NULL_RTX;
1864
          return;
1865
        }
1866
      else if (head == neutral)
1867
        {
1868
          *expr = tail;
1869
          simplify_using_initial_values (loop, op, expr);
1870
          return;
1871
        }
1872
      simplify_using_initial_values (loop, op, &tail);
1873
 
1874
      if (tail && XEXP (tail, 0) == aggr)
1875
        {
1876
          *expr = tail;
1877
          return;
1878
        }
1879
 
1880
      XEXP (*expr, 0) = head;
1881
      XEXP (*expr, 1) = tail;
1882
      return;
1883
    }
1884
 
1885
  gcc_assert (op == UNKNOWN);
1886
 
1887
  for (;;)
1888
    if (for_each_rtx (expr, replace_single_def_regs, expr) == 0)
1889
      break;
1890
  if (CONSTANT_P (*expr))
1891
    return;
1892
 
1893
  e = loop_preheader_edge (loop);
1894
  if (e->src == ENTRY_BLOCK_PTR)
1895
    return;
1896
 
1897
  altered = ALLOC_REG_SET (&reg_obstack);
1898
  this_altered = ALLOC_REG_SET (&reg_obstack);
1899
 
1900
  expression_valid = true;
1901
  last_valid_expr = *expr;
1902
  cond_list = NULL_RTX;
1903
  while (1)
1904
    {
1905
      insn = BB_END (e->src);
1906
      if (any_condjump_p (insn))
1907
        {
1908
          rtx cond = get_condition (BB_END (e->src), NULL, false, true);
1909
 
1910
          if (cond && (e->flags & EDGE_FALLTHRU))
1911
            cond = reversed_condition (cond);
1912
          if (cond)
1913
            {
1914
              rtx old = *expr;
1915
              simplify_using_condition (cond, expr, altered);
1916
              if (old != *expr)
1917
                {
1918
                  rtx note;
1919
                  if (CONSTANT_P (*expr))
1920
                    goto out;
1921
                  for (note = cond_list; note; note = XEXP (note, 1))
1922
                    {
1923
                      simplify_using_condition (XEXP (note, 0), expr, altered);
1924
                      if (CONSTANT_P (*expr))
1925
                        goto out;
1926
                    }
1927
                }
1928
              cond_list = alloc_EXPR_LIST (0, cond, cond_list);
1929
            }
1930
        }
1931
 
1932
      FOR_BB_INSNS_REVERSE (e->src, insn)
1933
        {
1934
          rtx src, dest;
1935
          rtx old = *expr;
1936
 
1937
          if (!INSN_P (insn))
1938
            continue;
1939
 
1940
          CLEAR_REG_SET (this_altered);
1941
          note_stores (PATTERN (insn), mark_altered, this_altered);
1942
          if (CALL_P (insn))
1943
            {
1944
              int i;
1945
 
1946
              /* Kill all call clobbered registers.  */
1947
              for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1948
                if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
1949
                  SET_REGNO_REG_SET (this_altered, i);
1950
            }
1951
 
1952
          if (suitable_set_for_replacement (insn, &dest, &src))
1953
            {
1954
              rtx *pnote, *pnote_next;
1955
 
1956
              replace_in_expr (expr, dest, src);
1957
              if (CONSTANT_P (*expr))
1958
                goto out;
1959
 
1960
              for (pnote = &cond_list; *pnote; pnote = pnote_next)
1961
                {
1962
                  rtx note = *pnote;
1963
                  rtx old_cond = XEXP (note, 0);
1964
 
1965
                  pnote_next = &XEXP (note, 1);
1966
                  replace_in_expr (&XEXP (note, 0), dest, src);
1967
 
1968
                  /* We can no longer use a condition that has been simplified
1969
                     to a constant, and simplify_using_condition will abort if
1970
                     we try.  */
1971
                  if (CONSTANT_P (XEXP (note, 0)))
1972
                    {
1973
                      *pnote = *pnote_next;
1974
                      pnote_next = pnote;
1975
                      free_EXPR_LIST_node (note);
1976
                    }
1977
                  /* Retry simplifications with this condition if either the
1978
                     expression or the condition changed.  */
1979
                  else if (old_cond != XEXP (note, 0) || old != *expr)
1980
                    simplify_using_condition (XEXP (note, 0), expr, altered);
1981
                }
1982
            }
1983
          else
1984
            /* If we did not use this insn to make a replacement, any overlap
1985
               between stores in this insn and our expression will cause the
1986
               expression to become invalid.  */
1987
            if (for_each_rtx (expr, altered_reg_used, this_altered))
1988
              goto out;
1989
 
1990
          if (CONSTANT_P (*expr))
1991
            goto out;
1992
 
1993
          IOR_REG_SET (altered, this_altered);
1994
 
1995
          /* If the expression now contains regs that have been altered, we
1996
             can't return it to the caller.  However, it is still valid for
1997
             further simplification, so keep searching to see if we can
1998
             eventually turn it into a constant.  */
1999
          if (for_each_rtx (expr, altered_reg_used, altered))
2000
            expression_valid = false;
2001
          if (expression_valid)
2002
            last_valid_expr = *expr;
2003
        }
2004
 
2005
      if (!single_pred_p (e->src)
2006
          || single_pred (e->src) == ENTRY_BLOCK_PTR)
2007
        break;
2008
      e = single_pred_edge (e->src);
2009
    }
2010
 
2011
 out:
2012
  free_EXPR_LIST_list (&cond_list);
2013
  if (!CONSTANT_P (*expr))
2014
    *expr = last_valid_expr;
2015
  FREE_REG_SET (altered);
2016
  FREE_REG_SET (this_altered);
2017
}
2018
 
2019
/* Transforms invariant IV into MODE.  Adds assumptions based on the fact
2020
   that IV occurs as left operands of comparison COND and its signedness
2021
   is SIGNED_P to DESC.  */
2022
 
2023
static void
2024
shorten_into_mode (struct rtx_iv *iv, enum machine_mode mode,
2025
                   enum rtx_code cond, bool signed_p, struct niter_desc *desc)
2026
{
2027
  rtx mmin, mmax, cond_over, cond_under;
2028
 
2029
  get_mode_bounds (mode, signed_p, iv->extend_mode, &mmin, &mmax);
2030
  cond_under = simplify_gen_relational (LT, SImode, iv->extend_mode,
2031
                                        iv->base, mmin);
2032
  cond_over = simplify_gen_relational (GT, SImode, iv->extend_mode,
2033
                                       iv->base, mmax);
2034
 
2035
  switch (cond)
2036
    {
2037
      case LE:
2038
      case LT:
2039
      case LEU:
2040
      case LTU:
2041
        if (cond_under != const0_rtx)
2042
          desc->infinite =
2043
                  alloc_EXPR_LIST (0, cond_under, desc->infinite);
2044
        if (cond_over != const0_rtx)
2045
          desc->noloop_assumptions =
2046
                  alloc_EXPR_LIST (0, cond_over, desc->noloop_assumptions);
2047
        break;
2048
 
2049
      case GE:
2050
      case GT:
2051
      case GEU:
2052
      case GTU:
2053
        if (cond_over != const0_rtx)
2054
          desc->infinite =
2055
                  alloc_EXPR_LIST (0, cond_over, desc->infinite);
2056
        if (cond_under != const0_rtx)
2057
          desc->noloop_assumptions =
2058
                  alloc_EXPR_LIST (0, cond_under, desc->noloop_assumptions);
2059
        break;
2060
 
2061
      case NE:
2062
        if (cond_over != const0_rtx)
2063
          desc->infinite =
2064
                  alloc_EXPR_LIST (0, cond_over, desc->infinite);
2065
        if (cond_under != const0_rtx)
2066
          desc->infinite =
2067
                  alloc_EXPR_LIST (0, cond_under, desc->infinite);
2068
        break;
2069
 
2070
      default:
2071
        gcc_unreachable ();
2072
    }
2073
 
2074
  iv->mode = mode;
2075
  iv->extend = signed_p ? SIGN_EXTEND : ZERO_EXTEND;
2076
}
2077
 
2078
/* Transforms IV0 and IV1 compared by COND so that they are both compared as
2079
   subregs of the same mode if possible (sometimes it is necessary to add
2080
   some assumptions to DESC).  */
2081
 
2082
static bool
2083
canonicalize_iv_subregs (struct rtx_iv *iv0, struct rtx_iv *iv1,
2084
                         enum rtx_code cond, struct niter_desc *desc)
2085
{
2086
  enum machine_mode comp_mode;
2087
  bool signed_p;
2088
 
2089
  /* If the ivs behave specially in the first iteration, or are
2090
     added/multiplied after extending, we ignore them.  */
2091
  if (iv0->first_special || iv0->mult != const1_rtx || iv0->delta != const0_rtx)
2092
    return false;
2093
  if (iv1->first_special || iv1->mult != const1_rtx || iv1->delta != const0_rtx)
2094
    return false;
2095
 
2096
  /* If there is some extend, it must match signedness of the comparison.  */
2097
  switch (cond)
2098
    {
2099
      case LE:
2100
      case LT:
2101
        if (iv0->extend == ZERO_EXTEND
2102
            || iv1->extend == ZERO_EXTEND)
2103
          return false;
2104
        signed_p = true;
2105
        break;
2106
 
2107
      case LEU:
2108
      case LTU:
2109
        if (iv0->extend == SIGN_EXTEND
2110
            || iv1->extend == SIGN_EXTEND)
2111
          return false;
2112
        signed_p = false;
2113
        break;
2114
 
2115
      case NE:
2116
        if (iv0->extend != UNKNOWN
2117
            && iv1->extend != UNKNOWN
2118
            && iv0->extend != iv1->extend)
2119
          return false;
2120
 
2121
        signed_p = false;
2122
        if (iv0->extend != UNKNOWN)
2123
          signed_p = iv0->extend == SIGN_EXTEND;
2124
        if (iv1->extend != UNKNOWN)
2125
          signed_p = iv1->extend == SIGN_EXTEND;
2126
        break;
2127
 
2128
      default:
2129
        gcc_unreachable ();
2130
    }
2131
 
2132
  /* Values of both variables should be computed in the same mode.  These
2133
     might indeed be different, if we have comparison like
2134
 
2135
     (compare (subreg:SI (iv0)) (subreg:SI (iv1)))
2136
 
2137
     and iv0 and iv1 are both ivs iterating in SI mode, but calculated
2138
     in different modes.  This does not seem impossible to handle, but
2139
     it hardly ever occurs in practice.
2140
 
2141
     The only exception is the case when one of operands is invariant.
2142
     For example pentium 3 generates comparisons like
2143
     (lt (subreg:HI (reg:SI)) 100).  Here we assign HImode to 100, but we
2144
     definitely do not want this prevent the optimization.  */
2145
  comp_mode = iv0->extend_mode;
2146
  if (GET_MODE_BITSIZE (comp_mode) < GET_MODE_BITSIZE (iv1->extend_mode))
2147
    comp_mode = iv1->extend_mode;
2148
 
2149
  if (iv0->extend_mode != comp_mode)
2150
    {
2151
      if (iv0->mode != iv0->extend_mode
2152
          || iv0->step != const0_rtx)
2153
        return false;
2154
 
2155
      iv0->base = simplify_gen_unary (signed_p ? SIGN_EXTEND : ZERO_EXTEND,
2156
                                      comp_mode, iv0->base, iv0->mode);
2157
      iv0->extend_mode = comp_mode;
2158
    }
2159
 
2160
  if (iv1->extend_mode != comp_mode)
2161
    {
2162
      if (iv1->mode != iv1->extend_mode
2163
          || iv1->step != const0_rtx)
2164
        return false;
2165
 
2166
      iv1->base = simplify_gen_unary (signed_p ? SIGN_EXTEND : ZERO_EXTEND,
2167
                                      comp_mode, iv1->base, iv1->mode);
2168
      iv1->extend_mode = comp_mode;
2169
    }
2170
 
2171
  /* Check that both ivs belong to a range of a single mode.  If one of the
2172
     operands is an invariant, we may need to shorten it into the common
2173
     mode.  */
2174
  if (iv0->mode == iv0->extend_mode
2175
      && iv0->step == const0_rtx
2176
      && iv0->mode != iv1->mode)
2177
    shorten_into_mode (iv0, iv1->mode, cond, signed_p, desc);
2178
 
2179
  if (iv1->mode == iv1->extend_mode
2180
      && iv1->step == const0_rtx
2181
      && iv0->mode != iv1->mode)
2182
    shorten_into_mode (iv1, iv0->mode, swap_condition (cond), signed_p, desc);
2183
 
2184
  if (iv0->mode != iv1->mode)
2185
    return false;
2186
 
2187
  desc->mode = iv0->mode;
2188
  desc->signed_p = signed_p;
2189
 
2190
  return true;
2191
}
2192
 
2193
/* Tries to estimate the maximum number of iterations in LOOP, and store the
2194
   result in DESC.  This function is called from iv_number_of_iterations with
2195
   a number of fields in DESC already filled in.  OLD_NITER is the original
2196
   expression for the number of iterations, before we tried to simplify it.  */
2197
 
2198
static unsigned HOST_WIDEST_INT
2199
determine_max_iter (struct loop *loop, struct niter_desc *desc, rtx old_niter)
2200
{
2201
  rtx niter = desc->niter_expr;
2202
  rtx mmin, mmax, cmp;
2203
  unsigned HOST_WIDEST_INT nmax, inc;
2204
 
2205
  if (GET_CODE (niter) == AND
2206
      && CONST_INT_P (XEXP (niter, 0)))
2207
    {
2208
      nmax = INTVAL (XEXP (niter, 0));
2209
      if (!(nmax & (nmax + 1)))
2210
        {
2211
          desc->niter_max = nmax;
2212
          return nmax;
2213
        }
2214
    }
2215
 
2216
  get_mode_bounds (desc->mode, desc->signed_p, desc->mode, &mmin, &mmax);
2217
  nmax = INTVAL (mmax) - INTVAL (mmin);
2218
 
2219
  if (GET_CODE (niter) == UDIV)
2220
    {
2221
      if (!CONST_INT_P (XEXP (niter, 1)))
2222
        {
2223
          desc->niter_max = nmax;
2224
          return nmax;
2225
        }
2226
      inc = INTVAL (XEXP (niter, 1));
2227
      niter = XEXP (niter, 0);
2228
    }
2229
  else
2230
    inc = 1;
2231
 
2232
  /* We could use a binary search here, but for now improving the upper
2233
     bound by just one eliminates one important corner case.  */
2234
  cmp = simplify_gen_relational (desc->signed_p ? LT : LTU, VOIDmode,
2235
                                 desc->mode, old_niter, mmax);
2236
  simplify_using_initial_values (loop, UNKNOWN, &cmp);
2237
  if (cmp == const_true_rtx)
2238
    {
2239
      nmax--;
2240
 
2241
      if (dump_file)
2242
        fprintf (dump_file, ";; improved upper bound by one.\n");
2243
    }
2244
  desc->niter_max = nmax / inc;
2245
  return nmax / inc;
2246
}
2247
 
2248
/* Computes number of iterations of the CONDITION in INSN in LOOP and stores
2249
   the result into DESC.  Very similar to determine_number_of_iterations
2250
   (basically its rtl version), complicated by things like subregs.  */
2251
 
2252
static void
2253
iv_number_of_iterations (struct loop *loop, rtx insn, rtx condition,
2254
                         struct niter_desc *desc)
2255
{
2256
  rtx op0, op1, delta, step, bound, may_xform, tmp, tmp0, tmp1;
2257
  struct rtx_iv iv0, iv1, tmp_iv;
2258
  rtx assumption, may_not_xform;
2259
  enum rtx_code cond;
2260
  enum machine_mode mode, comp_mode;
2261
  rtx mmin, mmax, mode_mmin, mode_mmax;
2262
  unsigned HOST_WIDEST_INT s, size, d, inv;
2263
  HOST_WIDEST_INT up, down, inc, step_val;
2264
  int was_sharp = false;
2265
  rtx old_niter;
2266
  bool step_is_pow2;
2267
 
2268
  /* The meaning of these assumptions is this:
2269
     if !assumptions
2270
       then the rest of information does not have to be valid
2271
     if noloop_assumptions then the loop does not roll
2272
     if infinite then this exit is never used */
2273
 
2274
  desc->assumptions = NULL_RTX;
2275
  desc->noloop_assumptions = NULL_RTX;
2276
  desc->infinite = NULL_RTX;
2277
  desc->simple_p = true;
2278
 
2279
  desc->const_iter = false;
2280
  desc->niter_expr = NULL_RTX;
2281
  desc->niter_max = 0;
2282
 
2283
  cond = GET_CODE (condition);
2284
  gcc_assert (COMPARISON_P (condition));
2285
 
2286
  mode = GET_MODE (XEXP (condition, 0));
2287
  if (mode == VOIDmode)
2288
    mode = GET_MODE (XEXP (condition, 1));
2289
  /* The constant comparisons should be folded.  */
2290
  gcc_assert (mode != VOIDmode);
2291
 
2292
  /* We only handle integers or pointers.  */
2293
  if (GET_MODE_CLASS (mode) != MODE_INT
2294
      && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
2295
    goto fail;
2296
 
2297
  op0 = XEXP (condition, 0);
2298
  if (!iv_analyze (insn, op0, &iv0))
2299
    goto fail;
2300
  if (iv0.extend_mode == VOIDmode)
2301
    iv0.mode = iv0.extend_mode = mode;
2302
 
2303
  op1 = XEXP (condition, 1);
2304
  if (!iv_analyze (insn, op1, &iv1))
2305
    goto fail;
2306
  if (iv1.extend_mode == VOIDmode)
2307
    iv1.mode = iv1.extend_mode = mode;
2308
 
2309
  if (GET_MODE_BITSIZE (iv0.extend_mode) > HOST_BITS_PER_WIDE_INT
2310
      || GET_MODE_BITSIZE (iv1.extend_mode) > HOST_BITS_PER_WIDE_INT)
2311
    goto fail;
2312
 
2313
  /* Check condition and normalize it.  */
2314
 
2315
  switch (cond)
2316
    {
2317
      case GE:
2318
      case GT:
2319
      case GEU:
2320
      case GTU:
2321
        tmp_iv = iv0; iv0 = iv1; iv1 = tmp_iv;
2322
        cond = swap_condition (cond);
2323
        break;
2324
      case NE:
2325
      case LE:
2326
      case LEU:
2327
      case LT:
2328
      case LTU:
2329
        break;
2330
      default:
2331
        goto fail;
2332
    }
2333
 
2334
  /* Handle extends.  This is relatively nontrivial, so we only try in some
2335
     easy cases, when we can canonicalize the ivs (possibly by adding some
2336
     assumptions) to shape subreg (base + i * step).  This function also fills
2337
     in desc->mode and desc->signed_p.  */
2338
 
2339
  if (!canonicalize_iv_subregs (&iv0, &iv1, cond, desc))
2340
    goto fail;
2341
 
2342
  comp_mode = iv0.extend_mode;
2343
  mode = iv0.mode;
2344
  size = GET_MODE_BITSIZE (mode);
2345
  get_mode_bounds (mode, (cond == LE || cond == LT), comp_mode, &mmin, &mmax);
2346
  mode_mmin = lowpart_subreg (mode, mmin, comp_mode);
2347
  mode_mmax = lowpart_subreg (mode, mmax, comp_mode);
2348
 
2349
  if (!CONST_INT_P (iv0.step) || !CONST_INT_P (iv1.step))
2350
    goto fail;
2351
 
2352
  /* We can take care of the case of two induction variables chasing each other
2353
     if the test is NE. I have never seen a loop using it, but still it is
2354
     cool.  */
2355
  if (iv0.step != const0_rtx && iv1.step != const0_rtx)
2356
    {
2357
      if (cond != NE)
2358
        goto fail;
2359
 
2360
      iv0.step = simplify_gen_binary (MINUS, comp_mode, iv0.step, iv1.step);
2361
      iv1.step = const0_rtx;
2362
    }
2363
 
2364
  /* This is either infinite loop or the one that ends immediately, depending
2365
     on initial values.  Unswitching should remove this kind of conditions.  */
2366
  if (iv0.step == const0_rtx && iv1.step == const0_rtx)
2367
    goto fail;
2368
 
2369
  if (cond != NE)
2370
    {
2371
      if (iv0.step == const0_rtx)
2372
        step_val = -INTVAL (iv1.step);
2373
      else
2374
        step_val = INTVAL (iv0.step);
2375
 
2376
      /* Ignore loops of while (i-- < 10) type.  */
2377
      if (step_val < 0)
2378
        goto fail;
2379
 
2380
      step_is_pow2 = !(step_val & (step_val - 1));
2381
    }
2382
  else
2383
    {
2384
      /* We do not care about whether the step is power of two in this
2385
         case.  */
2386
      step_is_pow2 = false;
2387
      step_val = 0;
2388
    }
2389
 
2390
  /* Some more condition normalization.  We must record some assumptions
2391
     due to overflows.  */
2392
  switch (cond)
2393
    {
2394
      case LT:
2395
      case LTU:
2396
        /* We want to take care only of non-sharp relationals; this is easy,
2397
           as in cases the overflow would make the transformation unsafe
2398
           the loop does not roll.  Seemingly it would make more sense to want
2399
           to take care of sharp relationals instead, as NE is more similar to
2400
           them, but the problem is that here the transformation would be more
2401
           difficult due to possibly infinite loops.  */
2402
        if (iv0.step == const0_rtx)
2403
          {
2404
            tmp = lowpart_subreg (mode, iv0.base, comp_mode);
2405
            assumption = simplify_gen_relational (EQ, SImode, mode, tmp,
2406
                                                  mode_mmax);
2407
            if (assumption == const_true_rtx)
2408
              goto zero_iter_simplify;
2409
            iv0.base = simplify_gen_binary (PLUS, comp_mode,
2410
                                            iv0.base, const1_rtx);
2411
          }
2412
        else
2413
          {
2414
            tmp = lowpart_subreg (mode, iv1.base, comp_mode);
2415
            assumption = simplify_gen_relational (EQ, SImode, mode, tmp,
2416
                                                  mode_mmin);
2417
            if (assumption == const_true_rtx)
2418
              goto zero_iter_simplify;
2419
            iv1.base = simplify_gen_binary (PLUS, comp_mode,
2420
                                            iv1.base, constm1_rtx);
2421
          }
2422
 
2423
        if (assumption != const0_rtx)
2424
          desc->noloop_assumptions =
2425
                  alloc_EXPR_LIST (0, assumption, desc->noloop_assumptions);
2426
        cond = (cond == LT) ? LE : LEU;
2427
 
2428
        /* It will be useful to be able to tell the difference once more in
2429
           LE -> NE reduction.  */
2430
        was_sharp = true;
2431
        break;
2432
      default: ;
2433
    }
2434
 
2435
  /* Take care of trivially infinite loops.  */
2436
  if (cond != NE)
2437
    {
2438
      if (iv0.step == const0_rtx)
2439
        {
2440
          tmp = lowpart_subreg (mode, iv0.base, comp_mode);
2441
          if (rtx_equal_p (tmp, mode_mmin))
2442
            {
2443
              desc->infinite =
2444
                      alloc_EXPR_LIST (0, const_true_rtx, NULL_RTX);
2445
              /* Fill in the remaining fields somehow.  */
2446
              goto zero_iter_simplify;
2447
            }
2448
        }
2449
      else
2450
        {
2451
          tmp = lowpart_subreg (mode, iv1.base, comp_mode);
2452
          if (rtx_equal_p (tmp, mode_mmax))
2453
            {
2454
              desc->infinite =
2455
                      alloc_EXPR_LIST (0, const_true_rtx, NULL_RTX);
2456
              /* Fill in the remaining fields somehow.  */
2457
              goto zero_iter_simplify;
2458
            }
2459
        }
2460
    }
2461
 
2462
  /* If we can we want to take care of NE conditions instead of size
2463
     comparisons, as they are much more friendly (most importantly
2464
     this takes care of special handling of loops with step 1).  We can
2465
     do it if we first check that upper bound is greater or equal to
2466
     lower bound, their difference is constant c modulo step and that
2467
     there is not an overflow.  */
2468
  if (cond != NE)
2469
    {
2470
      if (iv0.step == const0_rtx)
2471
        step = simplify_gen_unary (NEG, comp_mode, iv1.step, comp_mode);
2472
      else
2473
        step = iv0.step;
2474
      delta = simplify_gen_binary (MINUS, comp_mode, iv1.base, iv0.base);
2475
      delta = lowpart_subreg (mode, delta, comp_mode);
2476
      delta = simplify_gen_binary (UMOD, mode, delta, step);
2477
      may_xform = const0_rtx;
2478
      may_not_xform = const_true_rtx;
2479
 
2480
      if (CONST_INT_P (delta))
2481
        {
2482
          if (was_sharp && INTVAL (delta) == INTVAL (step) - 1)
2483
            {
2484
              /* A special case.  We have transformed condition of type
2485
                 for (i = 0; i < 4; i += 4)
2486
                 into
2487
                 for (i = 0; i <= 3; i += 4)
2488
                 obviously if the test for overflow during that transformation
2489
                 passed, we cannot overflow here.  Most importantly any
2490
                 loop with sharp end condition and step 1 falls into this
2491
                 category, so handling this case specially is definitely
2492
                 worth the troubles.  */
2493
              may_xform = const_true_rtx;
2494
            }
2495
          else if (iv0.step == const0_rtx)
2496
            {
2497
              bound = simplify_gen_binary (PLUS, comp_mode, mmin, step);
2498
              bound = simplify_gen_binary (MINUS, comp_mode, bound, delta);
2499
              bound = lowpart_subreg (mode, bound, comp_mode);
2500
              tmp = lowpart_subreg (mode, iv0.base, comp_mode);
2501
              may_xform = simplify_gen_relational (cond, SImode, mode,
2502
                                                   bound, tmp);
2503
              may_not_xform = simplify_gen_relational (reverse_condition (cond),
2504
                                                       SImode, mode,
2505
                                                       bound, tmp);
2506
            }
2507
          else
2508
            {
2509
              bound = simplify_gen_binary (MINUS, comp_mode, mmax, step);
2510
              bound = simplify_gen_binary (PLUS, comp_mode, bound, delta);
2511
              bound = lowpart_subreg (mode, bound, comp_mode);
2512
              tmp = lowpart_subreg (mode, iv1.base, comp_mode);
2513
              may_xform = simplify_gen_relational (cond, SImode, mode,
2514
                                                   tmp, bound);
2515
              may_not_xform = simplify_gen_relational (reverse_condition (cond),
2516
                                                       SImode, mode,
2517
                                                       tmp, bound);
2518
            }
2519
        }
2520
 
2521
      if (may_xform != const0_rtx)
2522
        {
2523
          /* We perform the transformation always provided that it is not
2524
             completely senseless.  This is OK, as we would need this assumption
2525
             to determine the number of iterations anyway.  */
2526
          if (may_xform != const_true_rtx)
2527
            {
2528
              /* If the step is a power of two and the final value we have
2529
                 computed overflows, the cycle is infinite.  Otherwise it
2530
                 is nontrivial to compute the number of iterations.  */
2531
              if (step_is_pow2)
2532
                desc->infinite = alloc_EXPR_LIST (0, may_not_xform,
2533
                                                  desc->infinite);
2534
              else
2535
                desc->assumptions = alloc_EXPR_LIST (0, may_xform,
2536
                                                     desc->assumptions);
2537
            }
2538
 
2539
          /* We are going to lose some information about upper bound on
2540
             number of iterations in this step, so record the information
2541
             here.  */
2542
          inc = INTVAL (iv0.step) - INTVAL (iv1.step);
2543
          if (CONST_INT_P (iv1.base))
2544
            up = INTVAL (iv1.base);
2545
          else
2546
            up = INTVAL (mode_mmax) - inc;
2547
          down = INTVAL (CONST_INT_P (iv0.base)
2548
                         ? iv0.base
2549
                         : mode_mmin);
2550
          desc->niter_max = (up - down) / inc + 1;
2551
 
2552
          if (iv0.step == const0_rtx)
2553
            {
2554
              iv0.base = simplify_gen_binary (PLUS, comp_mode, iv0.base, delta);
2555
              iv0.base = simplify_gen_binary (MINUS, comp_mode, iv0.base, step);
2556
            }
2557
          else
2558
            {
2559
              iv1.base = simplify_gen_binary (MINUS, comp_mode, iv1.base, delta);
2560
              iv1.base = simplify_gen_binary (PLUS, comp_mode, iv1.base, step);
2561
            }
2562
 
2563
          tmp0 = lowpart_subreg (mode, iv0.base, comp_mode);
2564
          tmp1 = lowpart_subreg (mode, iv1.base, comp_mode);
2565
          assumption = simplify_gen_relational (reverse_condition (cond),
2566
                                                SImode, mode, tmp0, tmp1);
2567
          if (assumption == const_true_rtx)
2568
            goto zero_iter_simplify;
2569
          else if (assumption != const0_rtx)
2570
            desc->noloop_assumptions =
2571
                    alloc_EXPR_LIST (0, assumption, desc->noloop_assumptions);
2572
          cond = NE;
2573
        }
2574
    }
2575
 
2576
  /* Count the number of iterations.  */
2577
  if (cond == NE)
2578
    {
2579
      /* Everything we do here is just arithmetics modulo size of mode.  This
2580
         makes us able to do more involved computations of number of iterations
2581
         than in other cases.  First transform the condition into shape
2582
         s * i <> c, with s positive.  */
2583
      iv1.base = simplify_gen_binary (MINUS, comp_mode, iv1.base, iv0.base);
2584
      iv0.base = const0_rtx;
2585
      iv0.step = simplify_gen_binary (MINUS, comp_mode, iv0.step, iv1.step);
2586
      iv1.step = const0_rtx;
2587
      if (INTVAL (iv0.step) < 0)
2588
        {
2589
          iv0.step = simplify_gen_unary (NEG, comp_mode, iv0.step, mode);
2590
          iv1.base = simplify_gen_unary (NEG, comp_mode, iv1.base, mode);
2591
        }
2592
      iv0.step = lowpart_subreg (mode, iv0.step, comp_mode);
2593
 
2594
      /* Let nsd (s, size of mode) = d.  If d does not divide c, the loop
2595
         is infinite.  Otherwise, the number of iterations is
2596
         (inverse(s/d) * (c/d)) mod (size of mode/d).  */
2597
      s = INTVAL (iv0.step); d = 1;
2598
      while (s % 2 != 1)
2599
        {
2600
          s /= 2;
2601
          d *= 2;
2602
          size--;
2603
        }
2604
      bound = GEN_INT (((unsigned HOST_WIDEST_INT) 1 << (size - 1 ) << 1) - 1);
2605
 
2606
      tmp1 = lowpart_subreg (mode, iv1.base, comp_mode);
2607
      tmp = simplify_gen_binary (UMOD, mode, tmp1, GEN_INT (d));
2608
      assumption = simplify_gen_relational (NE, SImode, mode, tmp, const0_rtx);
2609
      desc->infinite = alloc_EXPR_LIST (0, assumption, desc->infinite);
2610
 
2611
      tmp = simplify_gen_binary (UDIV, mode, tmp1, GEN_INT (d));
2612
      inv = inverse (s, size);
2613
      tmp = simplify_gen_binary (MULT, mode, tmp, gen_int_mode (inv, mode));
2614
      desc->niter_expr = simplify_gen_binary (AND, mode, tmp, bound);
2615
    }
2616
  else
2617
    {
2618
      if (iv1.step == const0_rtx)
2619
        /* Condition in shape a + s * i <= b
2620
           We must know that b + s does not overflow and a <= b + s and then we
2621
           can compute number of iterations as (b + s - a) / s.  (It might
2622
           seem that we in fact could be more clever about testing the b + s
2623
           overflow condition using some information about b - a mod s,
2624
           but it was already taken into account during LE -> NE transform).  */
2625
        {
2626
          step = iv0.step;
2627
          tmp0 = lowpart_subreg (mode, iv0.base, comp_mode);
2628
          tmp1 = lowpart_subreg (mode, iv1.base, comp_mode);
2629
 
2630
          bound = simplify_gen_binary (MINUS, mode, mode_mmax,
2631
                                       lowpart_subreg (mode, step,
2632
                                                       comp_mode));
2633
          if (step_is_pow2)
2634
            {
2635
              rtx t0, t1;
2636
 
2637
              /* If s is power of 2, we know that the loop is infinite if
2638
                 a % s <= b % s and b + s overflows.  */
2639
              assumption = simplify_gen_relational (reverse_condition (cond),
2640
                                                    SImode, mode,
2641
                                                    tmp1, bound);
2642
 
2643
              t0 = simplify_gen_binary (UMOD, mode, copy_rtx (tmp0), step);
2644
              t1 = simplify_gen_binary (UMOD, mode, copy_rtx (tmp1), step);
2645
              tmp = simplify_gen_relational (cond, SImode, mode, t0, t1);
2646
              assumption = simplify_gen_binary (AND, SImode, assumption, tmp);
2647
              desc->infinite =
2648
                      alloc_EXPR_LIST (0, assumption, desc->infinite);
2649
            }
2650
          else
2651
            {
2652
              assumption = simplify_gen_relational (cond, SImode, mode,
2653
                                                    tmp1, bound);
2654
              desc->assumptions =
2655
                      alloc_EXPR_LIST (0, assumption, desc->assumptions);
2656
            }
2657
 
2658
          tmp = simplify_gen_binary (PLUS, comp_mode, iv1.base, iv0.step);
2659
          tmp = lowpart_subreg (mode, tmp, comp_mode);
2660
          assumption = simplify_gen_relational (reverse_condition (cond),
2661
                                                SImode, mode, tmp0, tmp);
2662
 
2663
          delta = simplify_gen_binary (PLUS, mode, tmp1, step);
2664
          delta = simplify_gen_binary (MINUS, mode, delta, tmp0);
2665
        }
2666
      else
2667
        {
2668
          /* Condition in shape a <= b - s * i
2669
             We must know that a - s does not overflow and a - s <= b and then
2670
             we can again compute number of iterations as (b - (a - s)) / s.  */
2671
          step = simplify_gen_unary (NEG, mode, iv1.step, mode);
2672
          tmp0 = lowpart_subreg (mode, iv0.base, comp_mode);
2673
          tmp1 = lowpart_subreg (mode, iv1.base, comp_mode);
2674
 
2675
          bound = simplify_gen_binary (PLUS, mode, mode_mmin,
2676
                                       lowpart_subreg (mode, step, comp_mode));
2677
          if (step_is_pow2)
2678
            {
2679
              rtx t0, t1;
2680
 
2681
              /* If s is power of 2, we know that the loop is infinite if
2682
                 a % s <= b % s and a - s overflows.  */
2683
              assumption = simplify_gen_relational (reverse_condition (cond),
2684
                                                    SImode, mode,
2685
                                                    bound, tmp0);
2686
 
2687
              t0 = simplify_gen_binary (UMOD, mode, copy_rtx (tmp0), step);
2688
              t1 = simplify_gen_binary (UMOD, mode, copy_rtx (tmp1), step);
2689
              tmp = simplify_gen_relational (cond, SImode, mode, t0, t1);
2690
              assumption = simplify_gen_binary (AND, SImode, assumption, tmp);
2691
              desc->infinite =
2692
                      alloc_EXPR_LIST (0, assumption, desc->infinite);
2693
            }
2694
          else
2695
            {
2696
              assumption = simplify_gen_relational (cond, SImode, mode,
2697
                                                    bound, tmp0);
2698
              desc->assumptions =
2699
                      alloc_EXPR_LIST (0, assumption, desc->assumptions);
2700
            }
2701
 
2702
          tmp = simplify_gen_binary (PLUS, comp_mode, iv0.base, iv1.step);
2703
          tmp = lowpart_subreg (mode, tmp, comp_mode);
2704
          assumption = simplify_gen_relational (reverse_condition (cond),
2705
                                                SImode, mode,
2706
                                                tmp, tmp1);
2707
          delta = simplify_gen_binary (MINUS, mode, tmp0, step);
2708
          delta = simplify_gen_binary (MINUS, mode, tmp1, delta);
2709
        }
2710
      if (assumption == const_true_rtx)
2711
        goto zero_iter_simplify;
2712
      else if (assumption != const0_rtx)
2713
        desc->noloop_assumptions =
2714
                alloc_EXPR_LIST (0, assumption, desc->noloop_assumptions);
2715
      delta = simplify_gen_binary (UDIV, mode, delta, step);
2716
      desc->niter_expr = delta;
2717
    }
2718
 
2719
  old_niter = desc->niter_expr;
2720
 
2721
  simplify_using_initial_values (loop, AND, &desc->assumptions);
2722
  if (desc->assumptions
2723
      && XEXP (desc->assumptions, 0) == const0_rtx)
2724
    goto fail;
2725
  simplify_using_initial_values (loop, IOR, &desc->noloop_assumptions);
2726
  simplify_using_initial_values (loop, IOR, &desc->infinite);
2727
  simplify_using_initial_values (loop, UNKNOWN, &desc->niter_expr);
2728
 
2729
  /* Rerun the simplification.  Consider code (created by copying loop headers)
2730
 
2731
     i = 0;
2732
 
2733
     if (0 < n)
2734
       {
2735
         do
2736
           {
2737
             i++;
2738
           } while (i < n);
2739
       }
2740
 
2741
    The first pass determines that i = 0, the second pass uses it to eliminate
2742
    noloop assumption.  */
2743
 
2744
  simplify_using_initial_values (loop, AND, &desc->assumptions);
2745
  if (desc->assumptions
2746
      && XEXP (desc->assumptions, 0) == const0_rtx)
2747
    goto fail;
2748
  simplify_using_initial_values (loop, IOR, &desc->noloop_assumptions);
2749
  simplify_using_initial_values (loop, IOR, &desc->infinite);
2750
  simplify_using_initial_values (loop, UNKNOWN, &desc->niter_expr);
2751
 
2752
  if (desc->noloop_assumptions
2753
      && XEXP (desc->noloop_assumptions, 0) == const_true_rtx)
2754
    goto zero_iter;
2755
 
2756
  if (CONST_INT_P (desc->niter_expr))
2757
    {
2758
      unsigned HOST_WIDEST_INT val = INTVAL (desc->niter_expr);
2759
 
2760
      desc->const_iter = true;
2761
      desc->niter_max = desc->niter = val & GET_MODE_MASK (desc->mode);
2762
    }
2763
  else
2764
    {
2765
      if (!desc->niter_max)
2766
        desc->niter_max = determine_max_iter (loop, desc, old_niter);
2767
 
2768
      /* simplify_using_initial_values does a copy propagation on the registers
2769
         in the expression for the number of iterations.  This prolongs life
2770
         ranges of registers and increases register pressure, and usually
2771
         brings no gain (and if it happens to do, the cse pass will take care
2772
         of it anyway).  So prevent this behavior, unless it enabled us to
2773
         derive that the number of iterations is a constant.  */
2774
      desc->niter_expr = old_niter;
2775
    }
2776
 
2777
  return;
2778
 
2779
zero_iter_simplify:
2780
  /* Simplify the assumptions.  */
2781
  simplify_using_initial_values (loop, AND, &desc->assumptions);
2782
  if (desc->assumptions
2783
      && XEXP (desc->assumptions, 0) == const0_rtx)
2784
    goto fail;
2785
  simplify_using_initial_values (loop, IOR, &desc->infinite);
2786
 
2787
  /* Fallthru.  */
2788
zero_iter:
2789
  desc->const_iter = true;
2790
  desc->niter = 0;
2791
  desc->niter_max = 0;
2792
  desc->noloop_assumptions = NULL_RTX;
2793
  desc->niter_expr = const0_rtx;
2794
  return;
2795
 
2796
fail:
2797
  desc->simple_p = false;
2798
  return;
2799
}
2800
 
2801
/* Checks whether E is a simple exit from LOOP and stores its description
2802
   into DESC.  */
2803
 
2804
static void
2805
check_simple_exit (struct loop *loop, edge e, struct niter_desc *desc)
2806
{
2807
  basic_block exit_bb;
2808
  rtx condition, at;
2809
  edge ein;
2810
 
2811
  exit_bb = e->src;
2812
  desc->simple_p = false;
2813
 
2814
  /* It must belong directly to the loop.  */
2815
  if (exit_bb->loop_father != loop)
2816
    return;
2817
 
2818
  /* It must be tested (at least) once during any iteration.  */
2819
  if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit_bb))
2820
    return;
2821
 
2822
  /* It must end in a simple conditional jump.  */
2823
  if (!any_condjump_p (BB_END (exit_bb)))
2824
    return;
2825
 
2826
  ein = EDGE_SUCC (exit_bb, 0);
2827
  if (ein == e)
2828
    ein = EDGE_SUCC (exit_bb, 1);
2829
 
2830
  desc->out_edge = e;
2831
  desc->in_edge = ein;
2832
 
2833
  /* Test whether the condition is suitable.  */
2834
  if (!(condition = get_condition (BB_END (ein->src), &at, false, false)))
2835
    return;
2836
 
2837
  if (ein->flags & EDGE_FALLTHRU)
2838
    {
2839
      condition = reversed_condition (condition);
2840
      if (!condition)
2841
        return;
2842
    }
2843
 
2844
  /* Check that we are able to determine number of iterations and fill
2845
     in information about it.  */
2846
  iv_number_of_iterations (loop, at, condition, desc);
2847
}
2848
 
2849
/* Finds a simple exit of LOOP and stores its description into DESC.  */
2850
 
2851
void
2852
find_simple_exit (struct loop *loop, struct niter_desc *desc)
2853
{
2854
  unsigned i;
2855
  basic_block *body;
2856
  edge e;
2857
  struct niter_desc act;
2858
  bool any = false;
2859
  edge_iterator ei;
2860
 
2861
  desc->simple_p = false;
2862
  body = get_loop_body (loop);
2863
 
2864
  for (i = 0; i < loop->num_nodes; i++)
2865
    {
2866
      FOR_EACH_EDGE (e, ei, body[i]->succs)
2867
        {
2868
          if (flow_bb_inside_loop_p (loop, e->dest))
2869
            continue;
2870
 
2871
          check_simple_exit (loop, e, &act);
2872
          if (!act.simple_p)
2873
            continue;
2874
 
2875
          if (!any)
2876
            any = true;
2877
          else
2878
            {
2879
              /* Prefer constant iterations; the less the better.  */
2880
              if (!act.const_iter
2881
                  || (desc->const_iter && act.niter >= desc->niter))
2882
                continue;
2883
 
2884
              /* Also if the actual exit may be infinite, while the old one
2885
                 not, prefer the old one.  */
2886
              if (act.infinite && !desc->infinite)
2887
                continue;
2888
            }
2889
 
2890
          *desc = act;
2891
        }
2892
    }
2893
 
2894
  if (dump_file)
2895
    {
2896
      if (desc->simple_p)
2897
        {
2898
          fprintf (dump_file, "Loop %d is simple:\n", loop->num);
2899
          fprintf (dump_file, "  simple exit %d -> %d\n",
2900
                   desc->out_edge->src->index,
2901
                   desc->out_edge->dest->index);
2902
          if (desc->assumptions)
2903
            {
2904
              fprintf (dump_file, "  assumptions: ");
2905
              print_rtl (dump_file, desc->assumptions);
2906
              fprintf (dump_file, "\n");
2907
            }
2908
          if (desc->noloop_assumptions)
2909
            {
2910
              fprintf (dump_file, "  does not roll if: ");
2911
              print_rtl (dump_file, desc->noloop_assumptions);
2912
              fprintf (dump_file, "\n");
2913
            }
2914
          if (desc->infinite)
2915
            {
2916
              fprintf (dump_file, "  infinite if: ");
2917
              print_rtl (dump_file, desc->infinite);
2918
              fprintf (dump_file, "\n");
2919
            }
2920
 
2921
          fprintf (dump_file, "  number of iterations: ");
2922
          print_rtl (dump_file, desc->niter_expr);
2923
          fprintf (dump_file, "\n");
2924
 
2925
          fprintf (dump_file, "  upper bound: ");
2926
          fprintf (dump_file, HOST_WIDEST_INT_PRINT_DEC, desc->niter_max);
2927
          fprintf (dump_file, "\n");
2928
        }
2929
      else
2930
        fprintf (dump_file, "Loop %d is not simple.\n", loop->num);
2931
    }
2932
 
2933
  free (body);
2934
}
2935
 
2936
/* Creates a simple loop description of LOOP if it was not computed
2937
   already.  */
2938
 
2939
struct niter_desc *
2940
get_simple_loop_desc (struct loop *loop)
2941
{
2942
  struct niter_desc *desc = simple_loop_desc (loop);
2943
 
2944
  if (desc)
2945
    return desc;
2946
 
2947
  /* At least desc->infinite is not always initialized by
2948
     find_simple_loop_exit.  */
2949
  desc = XCNEW (struct niter_desc);
2950
  iv_analysis_loop_init (loop);
2951
  find_simple_exit (loop, desc);
2952
  loop->aux = desc;
2953
 
2954
  if (desc->simple_p && (desc->assumptions || desc->infinite))
2955
    {
2956
      const char *wording;
2957
 
2958
      /* Assume that no overflow happens and that the loop is finite.
2959
         We already warned at the tree level if we ran optimizations there.  */
2960
      if (!flag_tree_loop_optimize && warn_unsafe_loop_optimizations)
2961
        {
2962
          if (desc->infinite)
2963
            {
2964
              wording =
2965
                flag_unsafe_loop_optimizations
2966
                ? N_("assuming that the loop is not infinite")
2967
                : N_("cannot optimize possibly infinite loops");
2968
              warning (OPT_Wunsafe_loop_optimizations, "%s",
2969
                       gettext (wording));
2970
            }
2971
          if (desc->assumptions)
2972
            {
2973
              wording =
2974
                flag_unsafe_loop_optimizations
2975
                ? N_("assuming that the loop counter does not overflow")
2976
                : N_("cannot optimize loop, the loop counter may overflow");
2977
              warning (OPT_Wunsafe_loop_optimizations, "%s",
2978
                       gettext (wording));
2979
            }
2980
        }
2981
 
2982
      if (flag_unsafe_loop_optimizations)
2983
        {
2984
          desc->assumptions = NULL_RTX;
2985
          desc->infinite = NULL_RTX;
2986
        }
2987
    }
2988
 
2989
  return desc;
2990
}
2991
 
2992
/* Releases simple loop description for LOOP.  */
2993
 
2994
void
2995
free_simple_loop_desc (struct loop *loop)
2996
{
2997
  struct niter_desc *desc = simple_loop_desc (loop);
2998
 
2999
  if (!desc)
3000
    return;
3001
 
3002
  free (desc);
3003
  loop->aux = NULL;
3004
}

powered by: WebSVN 2.1.0

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