regclass.c (max_set_parallel): New variable.
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>
Fri, 19 Jan 2001 18:09:17 +0000 (18:09 +0000)
committerRichard Kenner <kenner@gcc.gnu.org>
Fri, 19 Jan 2001 18:09:17 +0000 (13:09 -0500)
* regclass.c (max_set_parallel): New variable.
(reg_scan): Take it into account in computation of max_parallel.
(reg_scan_mark_refs, case SET): Compute it.

From-SVN: r39140

gcc/ChangeLog
gcc/regclass.c

index c288232b92f14a0ed0b52e1eaf94ab0968584ca5..6b5271f5195a26a79d95e006eee8531645a268b1 100644 (file)
@@ -1,5 +1,9 @@
 Fri Jan 19 13:02:56 2001  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
+       * regclass.c (max_set_parallel): New variable.
+       (reg_scan): Take it into account in computation of max_parallel.
+       (reg_scan_mark_refs, case SET): Compute it.
+
        * alias.c (rtx_equal_for_memref_p, case ADDRESSOF): Don't assume
        args are REG.
        * expr.c (store_constructor): Don't look at MEM_ALIAS_SET unless MEM.
index ca4cbd6907a0b852157e2831a27cbf69f329a4e1..610de28f1b4dd4033470360c25da04b68bcdd179 100644 (file)
@@ -2188,10 +2188,17 @@ free_reg_info ()
 
 /* Maximum number of parallel sets and clobbers in any insn in this fn.
    Always at least 3, since the combiner could put that many together
-   and we want this to remain correct for all the remaining passes.  */
+   and we want this to remain correct for all the remaining passes.
+   This corresponds to the maximum number of times note_stores will call
+   a function for any insn.  */
 
 int max_parallel;
 
+/* Used as a temporary to record the largest number of registers in 
+   PARALLEL in a SET_DEST.  This is added to max_parallel.  */
+
+static int max_set_parallel;
+
 void
 reg_scan (f, nregs, repeat)
      rtx f;
@@ -2202,6 +2209,7 @@ reg_scan (f, nregs, repeat)
 
   allocate_reg_info (nregs, TRUE, FALSE);
   max_parallel = 3;
+  max_set_parallel = 0;
 
   for (insn = f; insn; insn = NEXT_INSN (insn))
     if (GET_CODE (insn) == INSN
@@ -2216,6 +2224,8 @@ reg_scan (f, nregs, repeat)
        if (REG_NOTES (insn))
          reg_scan_mark_refs (REG_NOTES (insn), insn, 1, 0);
       }
+
+  max_parallel += max_set_parallel;
 }
 
 /* Update 'regscan' information by looking at the insns
@@ -2313,6 +2323,11 @@ reg_scan_mark_refs (x, insn, note_flag, min_regno)
           dest = XEXP (dest, 0))
        ;
 
+      /* For a PARALLEL, record the number of things (less the usual one for a
+        SET) that are set.  */
+      if (GET_CODE (dest) == PARALLEL)
+       max_set_parallel = MAX (max_set_parallel, XVECLEN (dest, 0) - 1);
+
       if (GET_CODE (dest) == REG
          && REGNO (dest) >= min_regno)
        REG_N_SETS (REGNO (dest))++;