]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ira.c (check_allocation): Correctly handle the case where an allocno with two objects...
authorBernd Schmidt <bernds@codesourcery.com>
Thu, 22 Jul 2010 22:34:11 +0000 (22:34 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Thu, 22 Jul 2010 22:34:11 +0000 (22:34 +0000)
* ira.c (check_allocation): Correctly handle the case where an allocno
with two objects was allocated to a single reg.

From-SVN: r162432

gcc/ChangeLog
gcc/ira.c

index c1a496977b86a75674978c42bd384412f8ae1dea..4c71bb5b0ba164a0e94e4b279ba6a85a06faf280 100644 (file)
@@ -1,3 +1,8 @@
+2010-07-22  Bernd Schmidt  <bernds@codesourcery.com>
+
+       * ira.c (check_allocation): Correctly handle the case where an allocno
+       with two objects was allocated to a single reg.
+
 2010-07-22  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * tree-ssa-math-opts.c (is_widening_mult_rhs_p): New function.
index 8aaaf0e8d4f95d13e3e058314066e72e8ef1b853..a6b77cdd3df92033d2c429a6e15dfbaee7464ab4 100644 (file)
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -1624,11 +1624,14 @@ check_allocation (void)
          || (hard_regno = ALLOCNO_HARD_REGNO (a)) < 0)
        continue;
       nregs = hard_regno_nregs[hard_regno][ALLOCNO_MODE (a)];
-      if (n > 1)
-       {
-         gcc_assert (n == nregs);
-         nregs = 1;
-       }
+      if (nregs == 1)
+       /* We allocated a single hard register.  */
+       n = 1;
+      else if (n > 1)
+       /* We allocated multiple hard registers, and we will test
+          conflicts in a granularity of single hard regs.  */
+       nregs = 1;
+
       for (i = 0; i < n; i++)
        {
          ira_object_t obj = ALLOCNO_OBJECT (a, i);
@@ -1648,7 +1651,13 @@ check_allocation (void)
              int conflict_hard_regno = ALLOCNO_HARD_REGNO (conflict_a);
              if (conflict_hard_regno < 0)
                continue;
-             if (ALLOCNO_NUM_OBJECTS (conflict_a) > 1)
+
+             conflict_nregs
+               = (hard_regno_nregs
+                  [conflict_hard_regno][ALLOCNO_MODE (conflict_a)]);
+
+             if (ALLOCNO_NUM_OBJECTS (conflict_a) > 1
+                 && conflict_nregs == ALLOCNO_NUM_OBJECTS (conflict_a))
                {
                  if (WORDS_BIG_ENDIAN)
                    conflict_hard_regno += (ALLOCNO_NUM_OBJECTS (conflict_a)
@@ -1657,10 +1666,6 @@ check_allocation (void)
                    conflict_hard_regno += OBJECT_SUBWORD (conflict_obj);
                  conflict_nregs = 1;
                }
-             else
-               conflict_nregs
-                 = (hard_regno_nregs
-                    [conflict_hard_regno][ALLOCNO_MODE (conflict_a)]);
 
              if ((conflict_hard_regno <= this_regno
                 && this_regno < conflict_hard_regno + conflict_nregs)