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

Subversion Repositories openrisc

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

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

Line No. Rev Author Line
1 684 jeremybenn
/* RTL-level loop invariant motion.
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 implements the loop invariant motion pass.  It is very simple
22
   (no calls, no loads/stores, etc.).  This should be sufficient to cleanup
23
   things like address arithmetics -- other more complicated invariants should
24
   be eliminated on GIMPLE either in tree-ssa-loop-im.c or in tree-ssa-pre.c.
25
 
26
   We proceed loop by loop -- it is simpler than trying to handle things
27
   globally and should not lose much.  First we inspect all sets inside loop
28
   and create a dependency graph on insns (saying "to move this insn, you must
29
   also move the following insns").
30
 
31
   We then need to determine what to move.  We estimate the number of registers
32
   used and move as many invariants as possible while we still have enough free
33
   registers.  We prefer the expensive invariants.
34
 
35
   Then we move the selected invariants out of the loop, creating a new
36
   temporaries for them if necessary.  */
37
 
38
#include "config.h"
39
#include "system.h"
40
#include "coretypes.h"
41
#include "tm.h"
42
#include "hard-reg-set.h"
43
#include "rtl.h"
44
#include "tm_p.h"
45
#include "obstack.h"
46
#include "basic-block.h"
47
#include "cfgloop.h"
48
#include "expr.h"
49
#include "recog.h"
50
#include "output.h"
51
#include "function.h"
52
#include "flags.h"
53
#include "df.h"
54
#include "hashtab.h"
55
#include "except.h"
56
#include "params.h"
57
#include "regs.h"
58
#include "ira.h"
59
 
60
/* The data stored for the loop.  */
61
 
62
struct loop_data
63
{
64
  struct loop *outermost_exit;  /* The outermost exit of the loop.  */
65
  bool has_call;                /* True if the loop contains a call.  */
66
  /* Maximal register pressure inside loop for given register class
67
     (defined only for the pressure classes).  */
68
  int max_reg_pressure[N_REG_CLASSES];
69
  /* Loop regs referenced and live pseudo-registers.  */
70
  bitmap_head regs_ref;
71
  bitmap_head regs_live;
72
};
73
 
74
#define LOOP_DATA(LOOP) ((struct loop_data *) (LOOP)->aux)
75
 
76
/* The description of an use.  */
77
 
78
struct use
79
{
80
  rtx *pos;                     /* Position of the use.  */
81
  rtx insn;                     /* The insn in that the use occurs.  */
82
  unsigned addr_use_p;          /* Whether the use occurs in an address.  */
83
  struct use *next;             /* Next use in the list.  */
84
};
85
 
86
/* The description of a def.  */
87
 
88
struct def
89
{
90
  struct use *uses;             /* The list of uses that are uniquely reached
91
                                   by it.  */
92
  unsigned n_uses;              /* Number of such uses.  */
93
  unsigned n_addr_uses;         /* Number of uses in addresses.  */
94
  unsigned invno;               /* The corresponding invariant.  */
95
};
96
 
97
/* The data stored for each invariant.  */
98
 
99
struct invariant
100
{
101
  /* The number of the invariant.  */
102
  unsigned invno;
103
 
104
  /* The number of the invariant with the same value.  */
105
  unsigned eqto;
106
 
107
  /* If we moved the invariant out of the loop, the register that contains its
108
     value.  */
109
  rtx reg;
110
 
111
  /* If we moved the invariant out of the loop, the original regno
112
     that contained its value.  */
113
  int orig_regno;
114
 
115
  /* The definition of the invariant.  */
116
  struct def *def;
117
 
118
  /* The insn in that it is defined.  */
119
  rtx insn;
120
 
121
  /* Whether it is always executed.  */
122
  bool always_executed;
123
 
124
  /* Whether to move the invariant.  */
125
  bool move;
126
 
127
  /* Whether the invariant is cheap when used as an address.  */
128
  bool cheap_address;
129
 
130
  /* Cost of the invariant.  */
131
  unsigned cost;
132
 
133
  /* The invariants it depends on.  */
134
  bitmap depends_on;
135
 
136
  /* Used for detecting already visited invariants during determining
137
     costs of movements.  */
138
  unsigned stamp;
139
};
140
 
141
/* Currently processed loop.  */
142
static struct loop *curr_loop;
143
 
144
/* Table of invariants indexed by the df_ref uid field.  */
145
 
146
static unsigned int invariant_table_size = 0;
147
static struct invariant ** invariant_table;
148
 
149
/* Entry for hash table of invariant expressions.  */
150
 
151
struct invariant_expr_entry
152
{
153
  /* The invariant.  */
154
  struct invariant *inv;
155
 
156
  /* Its value.  */
157
  rtx expr;
158
 
159
  /* Its mode.  */
160
  enum machine_mode mode;
161
 
162
  /* Its hash.  */
163
  hashval_t hash;
164
};
165
 
166
/* The actual stamp for marking already visited invariants during determining
167
   costs of movements.  */
168
 
169
static unsigned actual_stamp;
170
 
171
typedef struct invariant *invariant_p;
172
 
173
DEF_VEC_P(invariant_p);
174
DEF_VEC_ALLOC_P(invariant_p, heap);
175
 
176
/* The invariants.  */
177
 
178
static VEC(invariant_p,heap) *invariants;
179
 
180
/* Check the size of the invariant table and realloc if necessary.  */
181
 
182
static void
183
check_invariant_table_size (void)
184
{
185
  if (invariant_table_size < DF_DEFS_TABLE_SIZE())
186
    {
187
      unsigned int new_size = DF_DEFS_TABLE_SIZE () + (DF_DEFS_TABLE_SIZE () / 4);
188
      invariant_table = XRESIZEVEC (struct invariant *, invariant_table, new_size);
189
      memset (&invariant_table[invariant_table_size], 0,
190
              (new_size - invariant_table_size) * sizeof (struct rtx_iv *));
191
      invariant_table_size = new_size;
192
    }
193
}
194
 
195
/* Test for possibility of invariantness of X.  */
196
 
197
static bool
198
check_maybe_invariant (rtx x)
199
{
200
  enum rtx_code code = GET_CODE (x);
201
  int i, j;
202
  const char *fmt;
203
 
204
  switch (code)
205
    {
206
    case CONST_INT:
207
    case CONST_DOUBLE:
208
    case CONST_FIXED:
209
    case SYMBOL_REF:
210
    case CONST:
211
    case LABEL_REF:
212
      return true;
213
 
214
    case PC:
215
    case CC0:
216
    case UNSPEC_VOLATILE:
217
    case CALL:
218
      return false;
219
 
220
    case REG:
221
      return true;
222
 
223
    case MEM:
224
      /* Load/store motion is done elsewhere.  ??? Perhaps also add it here?
225
         It should not be hard, and might be faster than "elsewhere".  */
226
 
227
      /* Just handle the most trivial case where we load from an unchanging
228
         location (most importantly, pic tables).  */
229
      if (MEM_READONLY_P (x) && !MEM_VOLATILE_P (x))
230
        break;
231
 
232
      return false;
233
 
234
    case ASM_OPERANDS:
235
      /* Don't mess with insns declared volatile.  */
236
      if (MEM_VOLATILE_P (x))
237
        return false;
238
      break;
239
 
240
    default:
241
      break;
242
    }
243
 
244
  fmt = GET_RTX_FORMAT (code);
245
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
246
    {
247
      if (fmt[i] == 'e')
248
        {
249
          if (!check_maybe_invariant (XEXP (x, i)))
250
            return false;
251
        }
252
      else if (fmt[i] == 'E')
253
        {
254
          for (j = 0; j < XVECLEN (x, i); j++)
255
            if (!check_maybe_invariant (XVECEXP (x, i, j)))
256
              return false;
257
        }
258
    }
259
 
260
  return true;
261
}
262
 
263
/* Returns the invariant definition for USE, or NULL if USE is not
264
   invariant.  */
265
 
266
static struct invariant *
267
invariant_for_use (df_ref use)
268
{
269
  struct df_link *defs;
270
  df_ref def;
271
  basic_block bb = DF_REF_BB (use), def_bb;
272
 
273
  if (DF_REF_FLAGS (use) & DF_REF_READ_WRITE)
274
    return NULL;
275
 
276
  defs = DF_REF_CHAIN (use);
277
  if (!defs || defs->next)
278
    return NULL;
279
  def = defs->ref;
280
  check_invariant_table_size ();
281
  if (!invariant_table[DF_REF_ID(def)])
282
    return NULL;
283
 
284
  def_bb = DF_REF_BB (def);
285
  if (!dominated_by_p (CDI_DOMINATORS, bb, def_bb))
286
    return NULL;
287
  return invariant_table[DF_REF_ID(def)];
288
}
289
 
290
/* Computes hash value for invariant expression X in INSN.  */
291
 
292
static hashval_t
293
hash_invariant_expr_1 (rtx insn, rtx x)
294
{
295
  enum rtx_code code = GET_CODE (x);
296
  int i, j;
297
  const char *fmt;
298
  hashval_t val = code;
299
  int do_not_record_p;
300
  df_ref use;
301
  struct invariant *inv;
302
 
303
  switch (code)
304
    {
305
    case CONST_INT:
306
    case CONST_DOUBLE:
307
    case CONST_FIXED:
308
    case SYMBOL_REF:
309
    case CONST:
310
    case LABEL_REF:
311
      return hash_rtx (x, GET_MODE (x), &do_not_record_p, NULL, false);
312
 
313
    case REG:
314
      use = df_find_use (insn, x);
315
      if (!use)
316
        return hash_rtx (x, GET_MODE (x), &do_not_record_p, NULL, false);
317
      inv = invariant_for_use (use);
318
      if (!inv)
319
        return hash_rtx (x, GET_MODE (x), &do_not_record_p, NULL, false);
320
 
321
      gcc_assert (inv->eqto != ~0u);
322
      return inv->eqto;
323
 
324
    default:
325
      break;
326
    }
327
 
328
  fmt = GET_RTX_FORMAT (code);
329
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
330
    {
331
      if (fmt[i] == 'e')
332
        val ^= hash_invariant_expr_1 (insn, XEXP (x, i));
333
      else if (fmt[i] == 'E')
334
        {
335
          for (j = 0; j < XVECLEN (x, i); j++)
336
            val ^= hash_invariant_expr_1 (insn, XVECEXP (x, i, j));
337
        }
338
      else if (fmt[i] == 'i' || fmt[i] == 'n')
339
        val ^= XINT (x, i);
340
    }
341
 
342
  return val;
343
}
344
 
345
/* Returns true if the invariant expressions E1 and E2 used in insns INSN1
346
   and INSN2 have always the same value.  */
347
 
348
static bool
349
invariant_expr_equal_p (rtx insn1, rtx e1, rtx insn2, rtx e2)
350
{
351
  enum rtx_code code = GET_CODE (e1);
352
  int i, j;
353
  const char *fmt;
354
  df_ref use1, use2;
355
  struct invariant *inv1 = NULL, *inv2 = NULL;
356
  rtx sub1, sub2;
357
 
358
  /* If mode of only one of the operands is VOIDmode, it is not equivalent to
359
     the other one.  If both are VOIDmode, we rely on the caller of this
360
     function to verify that their modes are the same.  */
361
  if (code != GET_CODE (e2) || GET_MODE (e1) != GET_MODE (e2))
362
    return false;
363
 
364
  switch (code)
365
    {
366
    case CONST_INT:
367
    case CONST_DOUBLE:
368
    case CONST_FIXED:
369
    case SYMBOL_REF:
370
    case CONST:
371
    case LABEL_REF:
372
      return rtx_equal_p (e1, e2);
373
 
374
    case REG:
375
      use1 = df_find_use (insn1, e1);
376
      use2 = df_find_use (insn2, e2);
377
      if (use1)
378
        inv1 = invariant_for_use (use1);
379
      if (use2)
380
        inv2 = invariant_for_use (use2);
381
 
382
      if (!inv1 && !inv2)
383
        return rtx_equal_p (e1, e2);
384
 
385
      if (!inv1 || !inv2)
386
        return false;
387
 
388
      gcc_assert (inv1->eqto != ~0u);
389
      gcc_assert (inv2->eqto != ~0u);
390
      return inv1->eqto == inv2->eqto;
391
 
392
    default:
393
      break;
394
    }
395
 
396
  fmt = GET_RTX_FORMAT (code);
397
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
398
    {
399
      if (fmt[i] == 'e')
400
        {
401
          sub1 = XEXP (e1, i);
402
          sub2 = XEXP (e2, i);
403
 
404
          if (!invariant_expr_equal_p (insn1, sub1, insn2, sub2))
405
            return false;
406
        }
407
 
408
      else if (fmt[i] == 'E')
409
        {
410
          if (XVECLEN (e1, i) != XVECLEN (e2, i))
411
            return false;
412
 
413
          for (j = 0; j < XVECLEN (e1, i); j++)
414
            {
415
              sub1 = XVECEXP (e1, i, j);
416
              sub2 = XVECEXP (e2, i, j);
417
 
418
              if (!invariant_expr_equal_p (insn1, sub1, insn2, sub2))
419
                return false;
420
            }
421
        }
422
      else if (fmt[i] == 'i' || fmt[i] == 'n')
423
        {
424
          if (XINT (e1, i) != XINT (e2, i))
425
            return false;
426
        }
427
      /* Unhandled type of subexpression, we fail conservatively.  */
428
      else
429
        return false;
430
    }
431
 
432
  return true;
433
}
434
 
435
/* Returns hash value for invariant expression entry E.  */
436
 
437
static hashval_t
438
hash_invariant_expr (const void *e)
439
{
440
  const struct invariant_expr_entry *const entry =
441
    (const struct invariant_expr_entry *) e;
442
 
443
  return entry->hash;
444
}
445
 
446
/* Compares invariant expression entries E1 and E2.  */
447
 
448
static int
449
eq_invariant_expr (const void *e1, const void *e2)
450
{
451
  const struct invariant_expr_entry *const entry1 =
452
    (const struct invariant_expr_entry *) e1;
453
  const struct invariant_expr_entry *const entry2 =
454
    (const struct invariant_expr_entry *) e2;
455
 
456
  if (entry1->mode != entry2->mode)
457
    return 0;
458
 
459
  return invariant_expr_equal_p (entry1->inv->insn, entry1->expr,
460
                                 entry2->inv->insn, entry2->expr);
461
}
462
 
463
/* Checks whether invariant with value EXPR in machine mode MODE is
464
   recorded in EQ.  If this is the case, return the invariant.  Otherwise
465
   insert INV to the table for this expression and return INV.  */
466
 
467
static struct invariant *
468
find_or_insert_inv (htab_t eq, rtx expr, enum machine_mode mode,
469
                    struct invariant *inv)
470
{
471
  hashval_t hash = hash_invariant_expr_1 (inv->insn, expr);
472
  struct invariant_expr_entry *entry;
473
  struct invariant_expr_entry pentry;
474
  PTR *slot;
475
 
476
  pentry.expr = expr;
477
  pentry.inv = inv;
478
  pentry.mode = mode;
479
  slot = htab_find_slot_with_hash (eq, &pentry, hash, INSERT);
480
  entry = (struct invariant_expr_entry *) *slot;
481
 
482
  if (entry)
483
    return entry->inv;
484
 
485
  entry = XNEW (struct invariant_expr_entry);
486
  entry->inv = inv;
487
  entry->expr = expr;
488
  entry->mode = mode;
489
  entry->hash = hash;
490
  *slot = entry;
491
 
492
  return inv;
493
}
494
 
495
/* Finds invariants identical to INV and records the equivalence.  EQ is the
496
   hash table of the invariants.  */
497
 
498
static void
499
find_identical_invariants (htab_t eq, struct invariant *inv)
500
{
501
  unsigned depno;
502
  bitmap_iterator bi;
503
  struct invariant *dep;
504
  rtx expr, set;
505
  enum machine_mode mode;
506
 
507
  if (inv->eqto != ~0u)
508
    return;
509
 
510
  EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, depno, bi)
511
    {
512
      dep = VEC_index (invariant_p, invariants, depno);
513
      find_identical_invariants (eq, dep);
514
    }
515
 
516
  set = single_set (inv->insn);
517
  expr = SET_SRC (set);
518
  mode = GET_MODE (expr);
519
  if (mode == VOIDmode)
520
    mode = GET_MODE (SET_DEST (set));
521
  inv->eqto = find_or_insert_inv (eq, expr, mode, inv)->invno;
522
 
523
  if (dump_file && inv->eqto != inv->invno)
524
    fprintf (dump_file,
525
             "Invariant %d is equivalent to invariant %d.\n",
526
             inv->invno, inv->eqto);
527
}
528
 
529
/* Find invariants with the same value and record the equivalences.  */
530
 
531
static void
532
merge_identical_invariants (void)
533
{
534
  unsigned i;
535
  struct invariant *inv;
536
  htab_t eq = htab_create (VEC_length (invariant_p, invariants),
537
                           hash_invariant_expr, eq_invariant_expr, free);
538
 
539
  FOR_EACH_VEC_ELT (invariant_p, invariants, i, inv)
540
    find_identical_invariants (eq, inv);
541
 
542
  htab_delete (eq);
543
}
544
 
545
/* Determines the basic blocks inside LOOP that are always executed and
546
   stores their bitmap to ALWAYS_REACHED.  MAY_EXIT is a bitmap of
547
   basic blocks that may either exit the loop, or contain the call that
548
   does not have to return.  BODY is body of the loop obtained by
549
   get_loop_body_in_dom_order.  */
550
 
551
static void
552
compute_always_reached (struct loop *loop, basic_block *body,
553
                        bitmap may_exit, bitmap always_reached)
554
{
555
  unsigned i;
556
 
557
  for (i = 0; i < loop->num_nodes; i++)
558
    {
559
      if (dominated_by_p (CDI_DOMINATORS, loop->latch, body[i]))
560
        bitmap_set_bit (always_reached, i);
561
 
562
      if (bitmap_bit_p (may_exit, i))
563
        return;
564
    }
565
}
566
 
567
/* Finds exits out of the LOOP with body BODY.  Marks blocks in that we may
568
   exit the loop by cfg edge to HAS_EXIT and MAY_EXIT.  In MAY_EXIT
569
   additionally mark blocks that may exit due to a call.  */
570
 
571
static void
572
find_exits (struct loop *loop, basic_block *body,
573
            bitmap may_exit, bitmap has_exit)
574
{
575
  unsigned i;
576
  edge_iterator ei;
577
  edge e;
578
  struct loop *outermost_exit = loop, *aexit;
579
  bool has_call = false;
580
  rtx insn;
581
 
582
  for (i = 0; i < loop->num_nodes; i++)
583
    {
584
      if (body[i]->loop_father == loop)
585
        {
586
          FOR_BB_INSNS (body[i], insn)
587
            {
588
              if (CALL_P (insn)
589
                  && (RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)
590
                      || !RTL_CONST_OR_PURE_CALL_P (insn)))
591
                {
592
                  has_call = true;
593
                  bitmap_set_bit (may_exit, i);
594
                  break;
595
                }
596
            }
597
 
598
          FOR_EACH_EDGE (e, ei, body[i]->succs)
599
            {
600
              if (flow_bb_inside_loop_p (loop, e->dest))
601
                continue;
602
 
603
              bitmap_set_bit (may_exit, i);
604
              bitmap_set_bit (has_exit, i);
605
              outermost_exit = find_common_loop (outermost_exit,
606
                                                 e->dest->loop_father);
607
            }
608
          continue;
609
        }
610
 
611
      /* Use the data stored for the subloop to decide whether we may exit
612
         through it.  It is sufficient to do this for header of the loop,
613
         as other basic blocks inside it must be dominated by it.  */
614
      if (body[i]->loop_father->header != body[i])
615
        continue;
616
 
617
      if (LOOP_DATA (body[i]->loop_father)->has_call)
618
        {
619
          has_call = true;
620
          bitmap_set_bit (may_exit, i);
621
        }
622
      aexit = LOOP_DATA (body[i]->loop_father)->outermost_exit;
623
      if (aexit != loop)
624
        {
625
          bitmap_set_bit (may_exit, i);
626
          bitmap_set_bit (has_exit, i);
627
 
628
          if (flow_loop_nested_p (aexit, outermost_exit))
629
            outermost_exit = aexit;
630
        }
631
    }
632
 
633
  if (loop->aux == NULL)
634
    {
635
      loop->aux = xcalloc (1, sizeof (struct loop_data));
636
      bitmap_initialize (&LOOP_DATA (loop)->regs_ref, &reg_obstack);
637
      bitmap_initialize (&LOOP_DATA (loop)->regs_live, &reg_obstack);
638
    }
639
  LOOP_DATA (loop)->outermost_exit = outermost_exit;
640
  LOOP_DATA (loop)->has_call = has_call;
641
}
642
 
643
/* Check whether we may assign a value to X from a register.  */
644
 
645
static bool
646
may_assign_reg_p (rtx x)
647
{
648
  return (GET_MODE (x) != VOIDmode
649
          && GET_MODE (x) != BLKmode
650
          && can_copy_p (GET_MODE (x))
651
          && (!REG_P (x)
652
              || !HARD_REGISTER_P (x)
653
              || REGNO_REG_CLASS (REGNO (x)) != NO_REGS));
654
}
655
 
656
/* Finds definitions that may correspond to invariants in LOOP with body
657
   BODY.  */
658
 
659
static void
660
find_defs (struct loop *loop, basic_block *body)
661
{
662
  unsigned i;
663
  bitmap blocks = BITMAP_ALLOC (NULL);
664
 
665
  for (i = 0; i < loop->num_nodes; i++)
666
    bitmap_set_bit (blocks, body[i]->index);
667
 
668
  df_remove_problem (df_chain);
669
  df_process_deferred_rescans ();
670
  df_chain_add_problem (DF_UD_CHAIN);
671
  df_set_blocks (blocks);
672
  df_analyze ();
673
 
674
  if (dump_file)
675
    {
676
      df_dump_region (dump_file);
677
      fprintf (dump_file, "*****starting processing of loop  ******\n");
678
      print_rtl_with_bb (dump_file, get_insns ());
679
      fprintf (dump_file, "*****ending processing of loop  ******\n");
680
    }
681
  check_invariant_table_size ();
682
 
683
  BITMAP_FREE (blocks);
684
}
685
 
686
/* Creates a new invariant for definition DEF in INSN, depending on invariants
687
   in DEPENDS_ON.  ALWAYS_EXECUTED is true if the insn is always executed,
688
   unless the program ends due to a function call.  The newly created invariant
689
   is returned.  */
690
 
691
static struct invariant *
692
create_new_invariant (struct def *def, rtx insn, bitmap depends_on,
693
                      bool always_executed)
694
{
695
  struct invariant *inv = XNEW (struct invariant);
696
  rtx set = single_set (insn);
697
  bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn));
698
 
699
  inv->def = def;
700
  inv->always_executed = always_executed;
701
  inv->depends_on = depends_on;
702
 
703
  /* If the set is simple, usually by moving it we move the whole store out of
704
     the loop.  Otherwise we save only cost of the computation.  */
705
  if (def)
706
    {
707
      inv->cost = set_rtx_cost (set, speed);
708
      /* ??? Try to determine cheapness of address computation.  Unfortunately
709
         the address cost is only a relative measure, we can't really compare
710
         it with any absolute number, but only with other address costs.
711
         But here we don't have any other addresses, so compare with a magic
712
         number anyway.  It has to be large enough to not regress PR33928
713
         (by avoiding to move reg+8,reg+16,reg+24 invariants), but small
714
         enough to not regress 410.bwaves either (by still moving reg+reg
715
         invariants).
716
         See http://gcc.gnu.org/ml/gcc-patches/2009-10/msg01210.html .  */
717
      inv->cheap_address = address_cost (SET_SRC (set), word_mode,
718
                                         ADDR_SPACE_GENERIC, speed) < 3;
719
    }
720
  else
721
    {
722
      inv->cost = set_src_cost (SET_SRC (set), speed);
723
      inv->cheap_address = false;
724
    }
725
 
726
  inv->move = false;
727
  inv->reg = NULL_RTX;
728
  inv->orig_regno = -1;
729
  inv->stamp = 0;
730
  inv->insn = insn;
731
 
732
  inv->invno = VEC_length (invariant_p, invariants);
733
  inv->eqto = ~0u;
734
  if (def)
735
    def->invno = inv->invno;
736
  VEC_safe_push (invariant_p, heap, invariants, inv);
737
 
738
  if (dump_file)
739
    {
740
      fprintf (dump_file,
741
               "Set in insn %d is invariant (%d), cost %d, depends on ",
742
               INSN_UID (insn), inv->invno, inv->cost);
743
      dump_bitmap (dump_file, inv->depends_on);
744
    }
745
 
746
  return inv;
747
}
748
 
749
/* Record USE at DEF.  */
750
 
751
static void
752
record_use (struct def *def, df_ref use)
753
{
754
  struct use *u = XNEW (struct use);
755
 
756
  u->pos = DF_REF_REAL_LOC (use);
757
  u->insn = DF_REF_INSN (use);
758
  u->addr_use_p = (DF_REF_TYPE (use) == DF_REF_REG_MEM_LOAD
759
                   || DF_REF_TYPE (use) == DF_REF_REG_MEM_STORE);
760
  u->next = def->uses;
761
  def->uses = u;
762
  def->n_uses++;
763
  if (u->addr_use_p)
764
    def->n_addr_uses++;
765
}
766
 
767
/* Finds the invariants USE depends on and store them to the DEPENDS_ON
768
   bitmap.  Returns true if all dependencies of USE are known to be
769
   loop invariants, false otherwise.  */
770
 
771
static bool
772
check_dependency (basic_block bb, df_ref use, bitmap depends_on)
773
{
774
  df_ref def;
775
  basic_block def_bb;
776
  struct df_link *defs;
777
  struct def *def_data;
778
  struct invariant *inv;
779
 
780
  if (DF_REF_FLAGS (use) & DF_REF_READ_WRITE)
781
    return false;
782
 
783
  defs = DF_REF_CHAIN (use);
784
  if (!defs)
785
    return true;
786
 
787
  if (defs->next)
788
    return false;
789
 
790
  def = defs->ref;
791
  check_invariant_table_size ();
792
  inv = invariant_table[DF_REF_ID(def)];
793
  if (!inv)
794
    return false;
795
 
796
  def_data = inv->def;
797
  gcc_assert (def_data != NULL);
798
 
799
  def_bb = DF_REF_BB (def);
800
  /* Note that in case bb == def_bb, we know that the definition
801
     dominates insn, because def has invariant_table[DF_REF_ID(def)]
802
     defined and we process the insns in the basic block bb
803
     sequentially.  */
804
  if (!dominated_by_p (CDI_DOMINATORS, bb, def_bb))
805
    return false;
806
 
807
  bitmap_set_bit (depends_on, def_data->invno);
808
  return true;
809
}
810
 
811
 
812
/* Finds the invariants INSN depends on and store them to the DEPENDS_ON
813
   bitmap.  Returns true if all dependencies of INSN are known to be
814
   loop invariants, false otherwise.  */
815
 
816
static bool
817
check_dependencies (rtx insn, bitmap depends_on)
818
{
819
  struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
820
  df_ref *use_rec;
821
  basic_block bb = BLOCK_FOR_INSN (insn);
822
 
823
  for (use_rec = DF_INSN_INFO_USES (insn_info); *use_rec; use_rec++)
824
    if (!check_dependency (bb, *use_rec, depends_on))
825
      return false;
826
  for (use_rec = DF_INSN_INFO_EQ_USES (insn_info); *use_rec; use_rec++)
827
    if (!check_dependency (bb, *use_rec, depends_on))
828
      return false;
829
 
830
  return true;
831
}
832
 
833
/* Finds invariant in INSN.  ALWAYS_REACHED is true if the insn is always
834
   executed.  ALWAYS_EXECUTED is true if the insn is always executed,
835
   unless the program ends due to a function call.  */
836
 
837
static void
838
find_invariant_insn (rtx insn, bool always_reached, bool always_executed)
839
{
840
  df_ref ref;
841
  struct def *def;
842
  bitmap depends_on;
843
  rtx set, dest;
844
  bool simple = true;
845
  struct invariant *inv;
846
 
847
#ifdef HAVE_cc0
848
  /* We can't move a CC0 setter without the user.  */
849
  if (sets_cc0_p (insn))
850
    return;
851
#endif
852
 
853
  set = single_set (insn);
854
  if (!set)
855
    return;
856
  dest = SET_DEST (set);
857
 
858
  if (!REG_P (dest)
859
      || HARD_REGISTER_P (dest))
860
    simple = false;
861
 
862
  if (!may_assign_reg_p (SET_DEST (set))
863
      || !check_maybe_invariant (SET_SRC (set)))
864
    return;
865
 
866
  /* If the insn can throw exception, we cannot move it at all without changing
867
     cfg.  */
868
  if (can_throw_internal (insn))
869
    return;
870
 
871
  /* We cannot make trapping insn executed, unless it was executed before.  */
872
  if (may_trap_or_fault_p (PATTERN (insn)) && !always_reached)
873
    return;
874
 
875
  depends_on = BITMAP_ALLOC (NULL);
876
  if (!check_dependencies (insn, depends_on))
877
    {
878
      BITMAP_FREE (depends_on);
879
      return;
880
    }
881
 
882
  if (simple)
883
    def = XCNEW (struct def);
884
  else
885
    def = NULL;
886
 
887
  inv = create_new_invariant (def, insn, depends_on, always_executed);
888
 
889
  if (simple)
890
    {
891
      ref = df_find_def (insn, dest);
892
      check_invariant_table_size ();
893
      invariant_table[DF_REF_ID(ref)] = inv;
894
    }
895
}
896
 
897
/* Record registers used in INSN that have a unique invariant definition.  */
898
 
899
static void
900
record_uses (rtx insn)
901
{
902
  struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
903
  df_ref *use_rec;
904
  struct invariant *inv;
905
 
906
  for (use_rec = DF_INSN_INFO_USES (insn_info); *use_rec; use_rec++)
907
    {
908
      df_ref use = *use_rec;
909
      inv = invariant_for_use (use);
910
      if (inv)
911
        record_use (inv->def, use);
912
    }
913
  for (use_rec = DF_INSN_INFO_EQ_USES (insn_info); *use_rec; use_rec++)
914
    {
915
      df_ref use = *use_rec;
916
      inv = invariant_for_use (use);
917
      if (inv)
918
        record_use (inv->def, use);
919
    }
920
}
921
 
922
/* Finds invariants in INSN.  ALWAYS_REACHED is true if the insn is always
923
   executed.  ALWAYS_EXECUTED is true if the insn is always executed,
924
   unless the program ends due to a function call.  */
925
 
926
static void
927
find_invariants_insn (rtx insn, bool always_reached, bool always_executed)
928
{
929
  find_invariant_insn (insn, always_reached, always_executed);
930
  record_uses (insn);
931
}
932
 
933
/* Finds invariants in basic block BB.  ALWAYS_REACHED is true if the
934
   basic block is always executed.  ALWAYS_EXECUTED is true if the basic
935
   block is always executed, unless the program ends due to a function
936
   call.  */
937
 
938
static void
939
find_invariants_bb (basic_block bb, bool always_reached, bool always_executed)
940
{
941
  rtx insn;
942
 
943
  FOR_BB_INSNS (bb, insn)
944
    {
945
      if (!NONDEBUG_INSN_P (insn))
946
        continue;
947
 
948
      find_invariants_insn (insn, always_reached, always_executed);
949
 
950
      if (always_reached
951
          && CALL_P (insn)
952
          && (RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)
953
              || ! RTL_CONST_OR_PURE_CALL_P (insn)))
954
        always_reached = false;
955
    }
956
}
957
 
958
/* Finds invariants in LOOP with body BODY.  ALWAYS_REACHED is the bitmap of
959
   basic blocks in BODY that are always executed.  ALWAYS_EXECUTED is the
960
   bitmap of basic blocks in BODY that are always executed unless the program
961
   ends due to a function call.  */
962
 
963
static void
964
find_invariants_body (struct loop *loop, basic_block *body,
965
                      bitmap always_reached, bitmap always_executed)
966
{
967
  unsigned i;
968
 
969
  for (i = 0; i < loop->num_nodes; i++)
970
    find_invariants_bb (body[i],
971
                        bitmap_bit_p (always_reached, i),
972
                        bitmap_bit_p (always_executed, i));
973
}
974
 
975
/* Finds invariants in LOOP.  */
976
 
977
static void
978
find_invariants (struct loop *loop)
979
{
980
  bitmap may_exit = BITMAP_ALLOC (NULL);
981
  bitmap always_reached = BITMAP_ALLOC (NULL);
982
  bitmap has_exit = BITMAP_ALLOC (NULL);
983
  bitmap always_executed = BITMAP_ALLOC (NULL);
984
  basic_block *body = get_loop_body_in_dom_order (loop);
985
 
986
  find_exits (loop, body, may_exit, has_exit);
987
  compute_always_reached (loop, body, may_exit, always_reached);
988
  compute_always_reached (loop, body, has_exit, always_executed);
989
 
990
  find_defs (loop, body);
991
  find_invariants_body (loop, body, always_reached, always_executed);
992
  merge_identical_invariants ();
993
 
994
  BITMAP_FREE (always_reached);
995
  BITMAP_FREE (always_executed);
996
  BITMAP_FREE (may_exit);
997
  BITMAP_FREE (has_exit);
998
  free (body);
999
}
1000
 
1001
/* Frees a list of uses USE.  */
1002
 
1003
static void
1004
free_use_list (struct use *use)
1005
{
1006
  struct use *next;
1007
 
1008
  for (; use; use = next)
1009
    {
1010
      next = use->next;
1011
      free (use);
1012
    }
1013
}
1014
 
1015
/* Return pressure class and number of hard registers (through *NREGS)
1016
   for destination of INSN. */
1017
static enum reg_class
1018
get_pressure_class_and_nregs (rtx insn, int *nregs)
1019
{
1020
  rtx reg;
1021
  enum reg_class pressure_class;
1022
  rtx set = single_set (insn);
1023
 
1024
  /* Considered invariant insns have only one set.  */
1025
  gcc_assert (set != NULL_RTX);
1026
  reg = SET_DEST (set);
1027
  if (GET_CODE (reg) == SUBREG)
1028
    reg = SUBREG_REG (reg);
1029
  if (MEM_P (reg))
1030
    {
1031
      *nregs = 0;
1032
      pressure_class = NO_REGS;
1033
    }
1034
  else
1035
    {
1036
      if (! REG_P (reg))
1037
        reg = NULL_RTX;
1038
      if (reg == NULL_RTX)
1039
        pressure_class = GENERAL_REGS;
1040
      else
1041
        {
1042
          pressure_class = reg_allocno_class (REGNO (reg));
1043
          pressure_class = ira_pressure_class_translate[pressure_class];
1044
        }
1045
      *nregs
1046
        = ira_reg_class_max_nregs[pressure_class][GET_MODE (SET_SRC (set))];
1047
    }
1048
  return pressure_class;
1049
}
1050
 
1051
/* Calculates cost and number of registers needed for moving invariant INV
1052
   out of the loop and stores them to *COST and *REGS_NEEDED.  */
1053
 
1054
static void
1055
get_inv_cost (struct invariant *inv, int *comp_cost, unsigned *regs_needed)
1056
{
1057
  int i, acomp_cost;
1058
  unsigned aregs_needed[N_REG_CLASSES];
1059
  unsigned depno;
1060
  struct invariant *dep;
1061
  bitmap_iterator bi;
1062
 
1063
  /* Find the representative of the class of the equivalent invariants.  */
1064
  inv = VEC_index (invariant_p, invariants, inv->eqto);
1065
 
1066
  *comp_cost = 0;
1067
  if (! flag_ira_loop_pressure)
1068
    regs_needed[0] = 0;
1069
  else
1070
    {
1071
      for (i = 0; i < ira_pressure_classes_num; i++)
1072
        regs_needed[ira_pressure_classes[i]] = 0;
1073
    }
1074
 
1075
  if (inv->move
1076
      || inv->stamp == actual_stamp)
1077
    return;
1078
  inv->stamp = actual_stamp;
1079
 
1080
  if (! flag_ira_loop_pressure)
1081
    regs_needed[0]++;
1082
  else
1083
    {
1084
      int nregs;
1085
      enum reg_class pressure_class;
1086
 
1087
      pressure_class = get_pressure_class_and_nregs (inv->insn, &nregs);
1088
      regs_needed[pressure_class] += nregs;
1089
    }
1090
 
1091
  if (!inv->cheap_address
1092
      || inv->def->n_addr_uses < inv->def->n_uses)
1093
    (*comp_cost) += inv->cost;
1094
 
1095
#ifdef STACK_REGS
1096
  {
1097
    /* Hoisting constant pool constants into stack regs may cost more than
1098
       just single register.  On x87, the balance is affected both by the
1099
       small number of FP registers, and by its register stack organization,
1100
       that forces us to add compensation code in and around the loop to
1101
       shuffle the operands to the top of stack before use, and pop them
1102
       from the stack after the loop finishes.
1103
 
1104
       To model this effect, we increase the number of registers needed for
1105
       stack registers by two: one register push, and one register pop.
1106
       This usually has the effect that FP constant loads from the constant
1107
       pool are not moved out of the loop.
1108
 
1109
       Note that this also means that dependent invariants can not be moved.
1110
       However, the primary purpose of this pass is to move loop invariant
1111
       address arithmetic out of loops, and address arithmetic that depends
1112
       on floating point constants is unlikely to ever occur.  */
1113
    rtx set = single_set (inv->insn);
1114
    if (set
1115
        && IS_STACK_MODE (GET_MODE (SET_SRC (set)))
1116
        && constant_pool_constant_p (SET_SRC (set)))
1117
      {
1118
        if (flag_ira_loop_pressure)
1119
          regs_needed[ira_stack_reg_pressure_class] += 2;
1120
        else
1121
          regs_needed[0] += 2;
1122
      }
1123
  }
1124
#endif
1125
 
1126
  EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, depno, bi)
1127
    {
1128
      bool check_p;
1129
 
1130
      dep = VEC_index (invariant_p, invariants, depno);
1131
 
1132
      get_inv_cost (dep, &acomp_cost, aregs_needed);
1133
 
1134
      if (! flag_ira_loop_pressure)
1135
        check_p = aregs_needed[0] != 0;
1136
      else
1137
        {
1138
          for (i = 0; i < ira_pressure_classes_num; i++)
1139
            if (aregs_needed[ira_pressure_classes[i]] != 0)
1140
              break;
1141
          check_p = i < ira_pressure_classes_num;
1142
        }
1143
      if (check_p
1144
          /* We need to check always_executed, since if the original value of
1145
             the invariant may be preserved, we may need to keep it in a
1146
             separate register.  TODO check whether the register has an
1147
             use outside of the loop.  */
1148
          && dep->always_executed
1149
          && !dep->def->uses->next)
1150
        {
1151
          /* If this is a single use, after moving the dependency we will not
1152
             need a new register.  */
1153
          if (! flag_ira_loop_pressure)
1154
            aregs_needed[0]--;
1155
          else
1156
            {
1157
              int nregs;
1158
              enum reg_class pressure_class;
1159
 
1160
              pressure_class = get_pressure_class_and_nregs (inv->insn, &nregs);
1161
              aregs_needed[pressure_class] -= nregs;
1162
            }
1163
        }
1164
 
1165
      if (! flag_ira_loop_pressure)
1166
        regs_needed[0] += aregs_needed[0];
1167
      else
1168
        {
1169
          for (i = 0; i < ira_pressure_classes_num; i++)
1170
            regs_needed[ira_pressure_classes[i]]
1171
              += aregs_needed[ira_pressure_classes[i]];
1172
        }
1173
      (*comp_cost) += acomp_cost;
1174
    }
1175
}
1176
 
1177
/* Calculates gain for eliminating invariant INV.  REGS_USED is the number
1178
   of registers used in the loop, NEW_REGS is the number of new variables
1179
   already added due to the invariant motion.  The number of registers needed
1180
   for it is stored in *REGS_NEEDED.  SPEED and CALL_P are flags passed
1181
   through to estimate_reg_pressure_cost. */
1182
 
1183
static int
1184
gain_for_invariant (struct invariant *inv, unsigned *regs_needed,
1185
                    unsigned *new_regs, unsigned regs_used,
1186
                    bool speed, bool call_p)
1187
{
1188
  int comp_cost, size_cost;
1189
 
1190
  actual_stamp++;
1191
 
1192
  get_inv_cost (inv, &comp_cost, regs_needed);
1193
 
1194
  if (! flag_ira_loop_pressure)
1195
    {
1196
      size_cost = (estimate_reg_pressure_cost (new_regs[0] + regs_needed[0],
1197
                                               regs_used, speed, call_p)
1198
                   - estimate_reg_pressure_cost (new_regs[0],
1199
                                                 regs_used, speed, call_p));
1200
    }
1201
  else
1202
    {
1203
      int i;
1204
      enum reg_class pressure_class;
1205
 
1206
      for (i = 0; i < ira_pressure_classes_num; i++)
1207
        {
1208
          pressure_class = ira_pressure_classes[i];
1209
          if ((int) new_regs[pressure_class]
1210
              + (int) regs_needed[pressure_class]
1211
              + LOOP_DATA (curr_loop)->max_reg_pressure[pressure_class]
1212
              + IRA_LOOP_RESERVED_REGS
1213
              > ira_available_class_regs[pressure_class])
1214
            break;
1215
        }
1216
      if (i < ira_pressure_classes_num)
1217
        /* There will be register pressure excess and we want not to
1218
           make this loop invariant motion.  All loop invariants with
1219
           non-positive gains will be rejected in function
1220
           find_invariants_to_move.  Therefore we return the negative
1221
           number here.
1222
 
1223
           One could think that this rejects also expensive loop
1224
           invariant motions and this will hurt code performance.
1225
           However numerous experiments with different heuristics
1226
           taking invariant cost into account did not confirm this
1227
           assumption.  There are possible explanations for this
1228
           result:
1229
           o probably all expensive invariants were already moved out
1230
             of the loop by PRE and gimple invariant motion pass.
1231
           o expensive invariant execution will be hidden by insn
1232
             scheduling or OOO processor hardware because usually such
1233
             invariants have a lot of freedom to be executed
1234
             out-of-order.
1235
           Another reason for ignoring invariant cost vs spilling cost
1236
           heuristics is also in difficulties to evaluate accurately
1237
           spill cost at this stage.  */
1238
        return -1;
1239
      else
1240
        size_cost = 0;
1241
    }
1242
 
1243
  return comp_cost - size_cost;
1244
}
1245
 
1246
/* Finds invariant with best gain for moving.  Returns the gain, stores
1247
   the invariant in *BEST and number of registers needed for it to
1248
   *REGS_NEEDED.  REGS_USED is the number of registers used in the loop.
1249
   NEW_REGS is the number of new variables already added due to invariant
1250
   motion.  */
1251
 
1252
static int
1253
best_gain_for_invariant (struct invariant **best, unsigned *regs_needed,
1254
                         unsigned *new_regs, unsigned regs_used,
1255
                         bool speed, bool call_p)
1256
{
1257
  struct invariant *inv;
1258
  int i, gain = 0, again;
1259
  unsigned aregs_needed[N_REG_CLASSES], invno;
1260
 
1261
  FOR_EACH_VEC_ELT (invariant_p, invariants, invno, inv)
1262
    {
1263
      if (inv->move)
1264
        continue;
1265
 
1266
      /* Only consider the "representatives" of equivalent invariants.  */
1267
      if (inv->eqto != inv->invno)
1268
        continue;
1269
 
1270
      again = gain_for_invariant (inv, aregs_needed, new_regs, regs_used,
1271
                                  speed, call_p);
1272
      if (again > gain)
1273
        {
1274
          gain = again;
1275
          *best = inv;
1276
          if (! flag_ira_loop_pressure)
1277
            regs_needed[0] = aregs_needed[0];
1278
          else
1279
            {
1280
              for (i = 0; i < ira_pressure_classes_num; i++)
1281
                regs_needed[ira_pressure_classes[i]]
1282
                  = aregs_needed[ira_pressure_classes[i]];
1283
            }
1284
        }
1285
    }
1286
 
1287
  return gain;
1288
}
1289
 
1290
/* Marks invariant INVNO and all its dependencies for moving.  */
1291
 
1292
static void
1293
set_move_mark (unsigned invno, int gain)
1294
{
1295
  struct invariant *inv = VEC_index (invariant_p, invariants, invno);
1296
  bitmap_iterator bi;
1297
 
1298
  /* Find the representative of the class of the equivalent invariants.  */
1299
  inv = VEC_index (invariant_p, invariants, inv->eqto);
1300
 
1301
  if (inv->move)
1302
    return;
1303
  inv->move = true;
1304
 
1305
  if (dump_file)
1306
    {
1307
      if (gain >= 0)
1308
        fprintf (dump_file, "Decided to move invariant %d -- gain %d\n",
1309
                 invno, gain);
1310
      else
1311
        fprintf (dump_file, "Decided to move dependent invariant %d\n",
1312
                 invno);
1313
    };
1314
 
1315
  EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, invno, bi)
1316
    {
1317
      set_move_mark (invno, -1);
1318
    }
1319
}
1320
 
1321
/* Determines which invariants to move.  */
1322
 
1323
static void
1324
find_invariants_to_move (bool speed, bool call_p)
1325
{
1326
  int gain;
1327
  unsigned i, regs_used, regs_needed[N_REG_CLASSES], new_regs[N_REG_CLASSES];
1328
  struct invariant *inv = NULL;
1329
 
1330
  if (!VEC_length (invariant_p, invariants))
1331
    return;
1332
 
1333
  if (flag_ira_loop_pressure)
1334
    /* REGS_USED is actually never used when the flag is on.  */
1335
    regs_used = 0;
1336
  else
1337
    /* We do not really do a good job in estimating number of
1338
       registers used; we put some initial bound here to stand for
1339
       induction variables etc.  that we do not detect.  */
1340
    {
1341
      unsigned int n_regs = DF_REG_SIZE (df);
1342
 
1343
      regs_used = 2;
1344
 
1345
      for (i = 0; i < n_regs; i++)
1346
        {
1347
          if (!DF_REGNO_FIRST_DEF (i) && DF_REGNO_LAST_USE (i))
1348
            {
1349
              /* This is a value that is used but not changed inside loop.  */
1350
              regs_used++;
1351
            }
1352
        }
1353
    }
1354
 
1355
  if (! flag_ira_loop_pressure)
1356
    new_regs[0] = regs_needed[0] = 0;
1357
  else
1358
    {
1359
      for (i = 0; (int) i < ira_pressure_classes_num; i++)
1360
        new_regs[ira_pressure_classes[i]] = 0;
1361
    }
1362
  while ((gain = best_gain_for_invariant (&inv, regs_needed,
1363
                                          new_regs, regs_used,
1364
                                          speed, call_p)) > 0)
1365
    {
1366
      set_move_mark (inv->invno, gain);
1367
      if (! flag_ira_loop_pressure)
1368
        new_regs[0] += regs_needed[0];
1369
      else
1370
        {
1371
          for (i = 0; (int) i < ira_pressure_classes_num; i++)
1372
            new_regs[ira_pressure_classes[i]]
1373
              += regs_needed[ira_pressure_classes[i]];
1374
        }
1375
    }
1376
}
1377
 
1378
/* Replace the uses, reached by the definition of invariant INV, by REG.
1379
 
1380
   IN_GROUP is nonzero if this is part of a group of changes that must be
1381
   performed as a group.  In that case, the changes will be stored.  The
1382
   function `apply_change_group' will validate and apply the changes.  */
1383
 
1384
static int
1385
replace_uses (struct invariant *inv, rtx reg, bool in_group)
1386
{
1387
  /* Replace the uses we know to be dominated.  It saves work for copy
1388
     propagation, and also it is necessary so that dependent invariants
1389
     are computed right.  */
1390
  if (inv->def)
1391
    {
1392
      struct use *use;
1393
      for (use = inv->def->uses; use; use = use->next)
1394
        validate_change (use->insn, use->pos, reg, true);
1395
 
1396
      /* If we aren't part of a larger group, apply the changes now.  */
1397
      if (!in_group)
1398
        return apply_change_group ();
1399
    }
1400
 
1401
  return 1;
1402
}
1403
 
1404
/* Move invariant INVNO out of the LOOP.  Returns true if this succeeds, false
1405
   otherwise.  */
1406
 
1407
static bool
1408
move_invariant_reg (struct loop *loop, unsigned invno)
1409
{
1410
  struct invariant *inv = VEC_index (invariant_p, invariants, invno);
1411
  struct invariant *repr = VEC_index (invariant_p, invariants, inv->eqto);
1412
  unsigned i;
1413
  basic_block preheader = loop_preheader_edge (loop)->src;
1414
  rtx reg, set, dest, note;
1415
  bitmap_iterator bi;
1416
  int regno = -1;
1417
 
1418
  if (inv->reg)
1419
    return true;
1420
  if (!repr->move)
1421
    return false;
1422
 
1423
  /* If this is a representative of the class of equivalent invariants,
1424
     really move the invariant.  Otherwise just replace its use with
1425
     the register used for the representative.  */
1426
  if (inv == repr)
1427
    {
1428
      if (inv->depends_on)
1429
        {
1430
          EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, i, bi)
1431
            {
1432
              if (!move_invariant_reg (loop, i))
1433
                goto fail;
1434
            }
1435
        }
1436
 
1437
      /* Move the set out of the loop.  If the set is always executed (we could
1438
         omit this condition if we know that the register is unused outside of
1439
         the loop, but it does not seem worth finding out) and it has no uses
1440
         that would not be dominated by it, we may just move it (TODO).
1441
         Otherwise we need to create a temporary register.  */
1442
      set = single_set (inv->insn);
1443
      reg = dest = SET_DEST (set);
1444
      if (GET_CODE (reg) == SUBREG)
1445
        reg = SUBREG_REG (reg);
1446
      if (REG_P (reg))
1447
        regno = REGNO (reg);
1448
 
1449
      reg = gen_reg_rtx_and_attrs (dest);
1450
 
1451
      /* Try replacing the destination by a new pseudoregister.  */
1452
      validate_change (inv->insn, &SET_DEST (set), reg, true);
1453
 
1454
      /* As well as all the dominated uses.  */
1455
      replace_uses (inv, reg, true);
1456
 
1457
      /* And validate all the changes.  */
1458
      if (!apply_change_group ())
1459
        goto fail;
1460
 
1461
      emit_insn_after (gen_move_insn (dest, reg), inv->insn);
1462
      reorder_insns (inv->insn, inv->insn, BB_END (preheader));
1463
 
1464
      /* If there is a REG_EQUAL note on the insn we just moved, and the
1465
         insn is in a basic block that is not always executed or the note
1466
         contains something for which we don't know the invariant status,
1467
         the note may no longer be valid after we move the insn.  Note that
1468
         uses in REG_EQUAL notes are taken into account in the computation
1469
         of invariants, so it is safe to retain the note even if it contains
1470
         register references for which we know the invariant status.  */
1471
      if ((note = find_reg_note (inv->insn, REG_EQUAL, NULL_RTX))
1472
          && (!inv->always_executed
1473
              || !check_maybe_invariant (XEXP (note, 0))))
1474
        remove_note (inv->insn, note);
1475
    }
1476
  else
1477
    {
1478
      if (!move_invariant_reg (loop, repr->invno))
1479
        goto fail;
1480
      reg = repr->reg;
1481
      regno = repr->orig_regno;
1482
      if (!replace_uses (inv, reg, false))
1483
        goto fail;
1484
      set = single_set (inv->insn);
1485
      emit_insn_after (gen_move_insn (SET_DEST (set), reg), inv->insn);
1486
      delete_insn (inv->insn);
1487
    }
1488
 
1489
  inv->reg = reg;
1490
  inv->orig_regno = regno;
1491
 
1492
  return true;
1493
 
1494
fail:
1495
  /* If we failed, clear move flag, so that we do not try to move inv
1496
     again.  */
1497
  if (dump_file)
1498
    fprintf (dump_file, "Failed to move invariant %d\n", invno);
1499
  inv->move = false;
1500
  inv->reg = NULL_RTX;
1501
  inv->orig_regno = -1;
1502
 
1503
  return false;
1504
}
1505
 
1506
/* Move selected invariant out of the LOOP.  Newly created regs are marked
1507
   in TEMPORARY_REGS.  */
1508
 
1509
static void
1510
move_invariants (struct loop *loop)
1511
{
1512
  struct invariant *inv;
1513
  unsigned i;
1514
 
1515
  FOR_EACH_VEC_ELT (invariant_p, invariants, i, inv)
1516
    move_invariant_reg (loop, i);
1517
  if (flag_ira_loop_pressure && resize_reg_info ())
1518
    {
1519
      FOR_EACH_VEC_ELT (invariant_p, invariants, i, inv)
1520
        if (inv->reg != NULL_RTX)
1521
          {
1522
            if (inv->orig_regno >= 0)
1523
              setup_reg_classes (REGNO (inv->reg),
1524
                                 reg_preferred_class (inv->orig_regno),
1525
                                 reg_alternate_class (inv->orig_regno),
1526
                                 reg_allocno_class (inv->orig_regno));
1527
            else
1528
              setup_reg_classes (REGNO (inv->reg),
1529
                                 GENERAL_REGS, NO_REGS, GENERAL_REGS);
1530
          }
1531
    }
1532
}
1533
 
1534
/* Initializes invariant motion data.  */
1535
 
1536
static void
1537
init_inv_motion_data (void)
1538
{
1539
  actual_stamp = 1;
1540
 
1541
  invariants = VEC_alloc (invariant_p, heap, 100);
1542
}
1543
 
1544
/* Frees the data allocated by invariant motion.  */
1545
 
1546
static void
1547
free_inv_motion_data (void)
1548
{
1549
  unsigned i;
1550
  struct def *def;
1551
  struct invariant *inv;
1552
 
1553
  check_invariant_table_size ();
1554
  for (i = 0; i < DF_DEFS_TABLE_SIZE (); i++)
1555
    {
1556
      inv = invariant_table[i];
1557
      if (inv)
1558
        {
1559
          def = inv->def;
1560
          gcc_assert (def != NULL);
1561
 
1562
          free_use_list (def->uses);
1563
          free (def);
1564
          invariant_table[i] = NULL;
1565
        }
1566
    }
1567
 
1568
  FOR_EACH_VEC_ELT (invariant_p, invariants, i, inv)
1569
    {
1570
      BITMAP_FREE (inv->depends_on);
1571
      free (inv);
1572
    }
1573
  VEC_free (invariant_p, heap, invariants);
1574
}
1575
 
1576
/* Move the invariants out of the LOOP.  */
1577
 
1578
static void
1579
move_single_loop_invariants (struct loop *loop)
1580
{
1581
  init_inv_motion_data ();
1582
 
1583
  find_invariants (loop);
1584
  find_invariants_to_move (optimize_loop_for_speed_p (loop),
1585
                           LOOP_DATA (loop)->has_call);
1586
  move_invariants (loop);
1587
 
1588
  free_inv_motion_data ();
1589
}
1590
 
1591
/* Releases the auxiliary data for LOOP.  */
1592
 
1593
static void
1594
free_loop_data (struct loop *loop)
1595
{
1596
  struct loop_data *data = LOOP_DATA (loop);
1597
  if (!data)
1598
    return;
1599
 
1600
  bitmap_clear (&LOOP_DATA (loop)->regs_ref);
1601
  bitmap_clear (&LOOP_DATA (loop)->regs_live);
1602
  free (data);
1603
  loop->aux = NULL;
1604
}
1605
 
1606
 
1607
 
1608
/* Registers currently living.  */
1609
static bitmap_head curr_regs_live;
1610
 
1611
/* Current reg pressure for each pressure class.  */
1612
static int curr_reg_pressure[N_REG_CLASSES];
1613
 
1614
/* Record all regs that are set in any one insn.  Communication from
1615
   mark_reg_{store,clobber} and global_conflicts.  Asm can refer to
1616
   all hard-registers.  */
1617
static rtx regs_set[(FIRST_PSEUDO_REGISTER > MAX_RECOG_OPERANDS
1618
                     ? FIRST_PSEUDO_REGISTER : MAX_RECOG_OPERANDS) * 2];
1619
/* Number of regs stored in the previous array.  */
1620
static int n_regs_set;
1621
 
1622
/* Return pressure class and number of needed hard registers (through
1623
   *NREGS) of register REGNO.  */
1624
static enum reg_class
1625
get_regno_pressure_class (int regno, int *nregs)
1626
{
1627
  if (regno >= FIRST_PSEUDO_REGISTER)
1628
    {
1629
      enum reg_class pressure_class;
1630
 
1631
      pressure_class = reg_allocno_class (regno);
1632
      pressure_class = ira_pressure_class_translate[pressure_class];
1633
      *nregs
1634
        = ira_reg_class_max_nregs[pressure_class][PSEUDO_REGNO_MODE (regno)];
1635
      return pressure_class;
1636
    }
1637
  else if (! TEST_HARD_REG_BIT (ira_no_alloc_regs, regno)
1638
           && ! TEST_HARD_REG_BIT (eliminable_regset, regno))
1639
    {
1640
      *nregs = 1;
1641
      return ira_pressure_class_translate[REGNO_REG_CLASS (regno)];
1642
    }
1643
  else
1644
    {
1645
      *nregs = 0;
1646
      return NO_REGS;
1647
    }
1648
}
1649
 
1650
/* Increase (if INCR_P) or decrease current register pressure for
1651
   register REGNO.  */
1652
static void
1653
change_pressure (int regno, bool incr_p)
1654
{
1655
  int nregs;
1656
  enum reg_class pressure_class;
1657
 
1658
  pressure_class = get_regno_pressure_class (regno, &nregs);
1659
  if (! incr_p)
1660
    curr_reg_pressure[pressure_class] -= nregs;
1661
  else
1662
    {
1663
      curr_reg_pressure[pressure_class] += nregs;
1664
      if (LOOP_DATA (curr_loop)->max_reg_pressure[pressure_class]
1665
          < curr_reg_pressure[pressure_class])
1666
        LOOP_DATA (curr_loop)->max_reg_pressure[pressure_class]
1667
          = curr_reg_pressure[pressure_class];
1668
    }
1669
}
1670
 
1671
/* Mark REGNO birth.  */
1672
static void
1673
mark_regno_live (int regno)
1674
{
1675
  struct loop *loop;
1676
 
1677
  for (loop = curr_loop;
1678
       loop != current_loops->tree_root;
1679
       loop = loop_outer (loop))
1680
    bitmap_set_bit (&LOOP_DATA (loop)->regs_live, regno);
1681
  if (!bitmap_set_bit (&curr_regs_live, regno))
1682
    return;
1683
  change_pressure (regno, true);
1684
}
1685
 
1686
/* Mark REGNO death.  */
1687
static void
1688
mark_regno_death (int regno)
1689
{
1690
  if (! bitmap_clear_bit (&curr_regs_live, regno))
1691
    return;
1692
  change_pressure (regno, false);
1693
}
1694
 
1695
/* Mark setting register REG.  */
1696
static void
1697
mark_reg_store (rtx reg, const_rtx setter ATTRIBUTE_UNUSED,
1698
                void *data ATTRIBUTE_UNUSED)
1699
{
1700
  int regno;
1701
 
1702
  if (GET_CODE (reg) == SUBREG)
1703
    reg = SUBREG_REG (reg);
1704
 
1705
  if (! REG_P (reg))
1706
    return;
1707
 
1708
  regs_set[n_regs_set++] = reg;
1709
 
1710
  regno = REGNO (reg);
1711
 
1712
  if (regno >= FIRST_PSEUDO_REGISTER)
1713
    mark_regno_live (regno);
1714
  else
1715
    {
1716
      int last = regno + hard_regno_nregs[regno][GET_MODE (reg)];
1717
 
1718
      while (regno < last)
1719
        {
1720
          mark_regno_live (regno);
1721
          regno++;
1722
        }
1723
    }
1724
}
1725
 
1726
/* Mark clobbering register REG.  */
1727
static void
1728
mark_reg_clobber (rtx reg, const_rtx setter, void *data)
1729
{
1730
  if (GET_CODE (setter) == CLOBBER)
1731
    mark_reg_store (reg, setter, data);
1732
}
1733
 
1734
/* Mark register REG death.  */
1735
static void
1736
mark_reg_death (rtx reg)
1737
{
1738
  int regno = REGNO (reg);
1739
 
1740
  if (regno >= FIRST_PSEUDO_REGISTER)
1741
    mark_regno_death (regno);
1742
  else
1743
    {
1744
      int last = regno + hard_regno_nregs[regno][GET_MODE (reg)];
1745
 
1746
      while (regno < last)
1747
        {
1748
          mark_regno_death (regno);
1749
          regno++;
1750
        }
1751
    }
1752
}
1753
 
1754
/* Mark occurrence of registers in X for the current loop.  */
1755
static void
1756
mark_ref_regs (rtx x)
1757
{
1758
  RTX_CODE code;
1759
  int i;
1760
  const char *fmt;
1761
 
1762
  if (!x)
1763
    return;
1764
 
1765
  code = GET_CODE (x);
1766
  if (code == REG)
1767
    {
1768
      struct loop *loop;
1769
 
1770
      for (loop = curr_loop;
1771
           loop != current_loops->tree_root;
1772
           loop = loop_outer (loop))
1773
        bitmap_set_bit (&LOOP_DATA (loop)->regs_ref, REGNO (x));
1774
      return;
1775
    }
1776
 
1777
  fmt = GET_RTX_FORMAT (code);
1778
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1779
    if (fmt[i] == 'e')
1780
      mark_ref_regs (XEXP (x, i));
1781
    else if (fmt[i] == 'E')
1782
      {
1783
        int j;
1784
 
1785
        for (j = 0; j < XVECLEN (x, i); j++)
1786
          mark_ref_regs (XVECEXP (x, i, j));
1787
      }
1788
}
1789
 
1790
/* Calculate register pressure in the loops.  */
1791
static void
1792
calculate_loop_reg_pressure (void)
1793
{
1794
  int i;
1795
  unsigned int j;
1796
  bitmap_iterator bi;
1797
  basic_block bb;
1798
  rtx insn, link;
1799
  struct loop *loop, *parent;
1800
  loop_iterator li;
1801
 
1802
  FOR_EACH_LOOP (li, loop, 0)
1803
    if (loop->aux == NULL)
1804
      {
1805
        loop->aux = xcalloc (1, sizeof (struct loop_data));
1806
        bitmap_initialize (&LOOP_DATA (loop)->regs_ref, &reg_obstack);
1807
        bitmap_initialize (&LOOP_DATA (loop)->regs_live, &reg_obstack);
1808
      }
1809
  ira_setup_eliminable_regset ();
1810
  bitmap_initialize (&curr_regs_live, &reg_obstack);
1811
  FOR_EACH_BB (bb)
1812
    {
1813
      curr_loop = bb->loop_father;
1814
      if (curr_loop == current_loops->tree_root)
1815
        continue;
1816
 
1817
      for (loop = curr_loop;
1818
           loop != current_loops->tree_root;
1819
           loop = loop_outer (loop))
1820
        bitmap_ior_into (&LOOP_DATA (loop)->regs_live, DF_LR_IN (bb));
1821
 
1822
      bitmap_copy (&curr_regs_live, DF_LR_IN (bb));
1823
      for (i = 0; i < ira_pressure_classes_num; i++)
1824
        curr_reg_pressure[ira_pressure_classes[i]] = 0;
1825
      EXECUTE_IF_SET_IN_BITMAP (&curr_regs_live, 0, j, bi)
1826
        change_pressure (j, true);
1827
 
1828
      FOR_BB_INSNS (bb, insn)
1829
        {
1830
          if (! NONDEBUG_INSN_P (insn))
1831
            continue;
1832
 
1833
          mark_ref_regs (PATTERN (insn));
1834
          n_regs_set = 0;
1835
          note_stores (PATTERN (insn), mark_reg_clobber, NULL);
1836
 
1837
          /* Mark any registers dead after INSN as dead now.  */
1838
 
1839
          for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1840
            if (REG_NOTE_KIND (link) == REG_DEAD)
1841
              mark_reg_death (XEXP (link, 0));
1842
 
1843
          /* Mark any registers set in INSN as live,
1844
             and mark them as conflicting with all other live regs.
1845
             Clobbers are processed again, so they conflict with
1846
             the registers that are set.  */
1847
 
1848
          note_stores (PATTERN (insn), mark_reg_store, NULL);
1849
 
1850
#ifdef AUTO_INC_DEC
1851
          for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1852
            if (REG_NOTE_KIND (link) == REG_INC)
1853
              mark_reg_store (XEXP (link, 0), NULL_RTX, NULL);
1854
#endif
1855
          while (n_regs_set-- > 0)
1856
            {
1857
              rtx note = find_regno_note (insn, REG_UNUSED,
1858
                                          REGNO (regs_set[n_regs_set]));
1859
              if (! note)
1860
                continue;
1861
 
1862
              mark_reg_death (XEXP (note, 0));
1863
            }
1864
        }
1865
    }
1866
  bitmap_clear (&curr_regs_live);
1867
  if (flag_ira_region == IRA_REGION_MIXED
1868
      || flag_ira_region == IRA_REGION_ALL)
1869
    FOR_EACH_LOOP (li, loop, 0)
1870
      {
1871
        EXECUTE_IF_SET_IN_BITMAP (&LOOP_DATA (loop)->regs_live, 0, j, bi)
1872
          if (! bitmap_bit_p (&LOOP_DATA (loop)->regs_ref, j))
1873
            {
1874
              enum reg_class pressure_class;
1875
              int nregs;
1876
 
1877
              pressure_class = get_regno_pressure_class (j, &nregs);
1878
              LOOP_DATA (loop)->max_reg_pressure[pressure_class] -= nregs;
1879
            }
1880
      }
1881
  if (dump_file == NULL)
1882
    return;
1883
  FOR_EACH_LOOP (li, loop, 0)
1884
    {
1885
      parent = loop_outer (loop);
1886
      fprintf (dump_file, "\n  Loop %d (parent %d, header bb%d, depth %d)\n",
1887
               loop->num, (parent == NULL ? -1 : parent->num),
1888
               loop->header->index, loop_depth (loop));
1889
      fprintf (dump_file, "\n    ref. regnos:");
1890
      EXECUTE_IF_SET_IN_BITMAP (&LOOP_DATA (loop)->regs_ref, 0, j, bi)
1891
        fprintf (dump_file, " %d", j);
1892
      fprintf (dump_file, "\n    live regnos:");
1893
      EXECUTE_IF_SET_IN_BITMAP (&LOOP_DATA (loop)->regs_live, 0, j, bi)
1894
        fprintf (dump_file, " %d", j);
1895
      fprintf (dump_file, "\n    Pressure:");
1896
      for (i = 0; (int) i < ira_pressure_classes_num; i++)
1897
        {
1898
          enum reg_class pressure_class;
1899
 
1900
          pressure_class = ira_pressure_classes[i];
1901
          if (LOOP_DATA (loop)->max_reg_pressure[pressure_class] == 0)
1902
            continue;
1903
          fprintf (dump_file, " %s=%d", reg_class_names[pressure_class],
1904
                   LOOP_DATA (loop)->max_reg_pressure[pressure_class]);
1905
        }
1906
      fprintf (dump_file, "\n");
1907
    }
1908
}
1909
 
1910
 
1911
 
1912
/* Move the invariants out of the loops.  */
1913
 
1914
void
1915
move_loop_invariants (void)
1916
{
1917
  struct loop *loop;
1918
  loop_iterator li;
1919
 
1920
  if (flag_ira_loop_pressure)
1921
    {
1922
      df_analyze ();
1923
      regstat_init_n_sets_and_refs ();
1924
      ira_set_pseudo_classes (dump_file);
1925
      calculate_loop_reg_pressure ();
1926
      regstat_free_n_sets_and_refs ();
1927
    }
1928
  df_set_flags (DF_EQ_NOTES + DF_DEFER_INSN_RESCAN);
1929
  /* Process the loops, innermost first.  */
1930
  FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
1931
    {
1932
      curr_loop = loop;
1933
      /* move_single_loop_invariants for very large loops
1934
         is time consuming and might need a lot of memory.  */
1935
      if (loop->num_nodes <= (unsigned) LOOP_INVARIANT_MAX_BBS_IN_LOOP)
1936
        move_single_loop_invariants (loop);
1937
    }
1938
 
1939
  FOR_EACH_LOOP (li, loop, 0)
1940
    {
1941
      free_loop_data (loop);
1942
    }
1943
 
1944
  if (flag_ira_loop_pressure)
1945
    /* There is no sense to keep this info because it was most
1946
       probably outdated by subsequent passes.  */
1947
    free_reg_info ();
1948
  free (invariant_table);
1949
  invariant_table = NULL;
1950
  invariant_table_size = 0;
1951
 
1952
#ifdef ENABLE_CHECKING
1953
  verify_flow_info ();
1954
#endif
1955
}

powered by: WebSVN 2.1.0

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