dotgnu-pnet-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dotgnu-pnet-commits] libjit ./ChangeLog jit/jit-reg-alloc.c


From: Aleksey Demakov
Subject: [dotgnu-pnet-commits] libjit ./ChangeLog jit/jit-reg-alloc.c
Date: Thu, 25 May 2006 16:01:02 +0000

CVSROOT:        /sources/dotgnu-pnet
Module name:    libjit
Branch:         
Changes by:     Aleksey Demakov <address@hidden>        06/05/25 16:01:02

Modified files:
        .              : ChangeLog 
        jit            : jit-reg-alloc.c 

Log message:
        fix spill cost calcualtion for global registers

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/libjit/ChangeLog.diff?tr1=1.230&tr2=1.231&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/libjit/jit/jit-reg-alloc.c.diff?tr1=1.30&tr2=1.31&r1=text&r2=text

Patches:
Index: libjit/ChangeLog
diff -u libjit/ChangeLog:1.230 libjit/ChangeLog:1.231
--- libjit/ChangeLog:1.230      Wed May 24 18:56:32 2006
+++ libjit/ChangeLog    Thu May 25 16:01:02 2006
@@ -1,6 +1,13 @@
 2006-05-25  Aleksey Demakov  <address@hidden>
 
        * jit/jit-reg-alloc.c (use_cheapest_register): fix cost calculation
+       again for 'spill_before' rules. The last patch did not work for
+       values stored in global registers. Now both global and non-global
+       values should be copied to EAX.
+
+2006-05-25  Aleksey Demakov  <address@hidden>
+
+       * jit/jit-reg-alloc.c (use_cheapest_register): fix cost calculation
        that sometimes caused overlooking free registers. This was a serious
        problem as there are some 'spill_before' rules that assume that the
        allocator will always choose EAX as the first free register.
Index: libjit/jit/jit-reg-alloc.c
diff -u libjit/jit/jit-reg-alloc.c:1.30 libjit/jit/jit-reg-alloc.c:1.31
--- libjit/jit/jit-reg-alloc.c:1.30     Wed May 24 18:56:32 2006
+++ libjit/jit/jit-reg-alloc.c  Thu May 25 16:01:02 2006
@@ -2391,7 +2391,7 @@
        int suitable_reg;
        int suitable_cost;
        int suitable_age;
-       int cost;
+       int move, cost;
 
        if(index >= 0)
        {
@@ -2426,94 +2426,131 @@
                        continue;
                }
 
-               if(need_pair)
-               {
-                       other_reg = OTHER_REG(reg);
-               }
-               else
-               {
-                       other_reg = -1;
-               }
-
                if(!jit_reg_is_used(regset, reg)
                   || jit_reg_is_used(gen->inhibit, reg)
                   || jit_reg_is_used(regs->assigned, reg))
                {
                        continue;
                }
-               if(other_reg >= 0)
+
+               if(!desc)
                {
-                       if(jit_reg_is_used(gen->inhibit, other_reg)
-                          || jit_reg_is_used(regs->assigned, other_reg))
+                       if(jit_reg_is_used(gen->permanent, reg))
+                       {
+                               continue;
+                       }
+                       else if(thrashes_register(gen, regs, desc, reg, -1))
                        {
                                continue;
                        }
+                       move = 0;
+                       cost = compute_spill_cost(gen, regs, reg, -1);
                }
-
-               if(jit_reg_is_used(gen->permanent, reg))
+               else if(desc->value->has_global_register)
                {
-                       /* We can use a global register only if it is the 
register
-                          that contains the value itself and it is not 
clobbered. */
-                       if(desc
-                          && desc->value->has_global_register
-                          && desc->value->global_reg == reg
-                          && !clobbers_register(gen, regs, index, reg, 
other_reg))
+                       if(reg == desc->value->global_reg)
                        {
-                               if(output || desc->value->in_global_register)
+                               if(clobbers_register(gen, regs, index, reg, -1))
                                {
-                                       cost = 0;
+                                       continue;
+                               }
+                               move = ((output | 
desc->value->in_global_register) == 0);
+                               cost = 0;
+                       }
+                       else if(jit_reg_is_used(gen->permanent, reg))
+                       {
+                               continue;
+                       }
+                       else if(thrashes_register(gen, regs, desc, reg, -1))
+                       {
+                               continue;
+                       }
+                       else if(desc->value->in_register && reg == 
desc->value->reg)
+                       {
+                               move = ((output | 
desc->value->in_global_register) != 0);
+                               if(clobbers_register(gen, regs, index, reg, -1))
+                               {
+                                       cost = compute_spill_cost(gen, regs, 
reg, -1);
                                }
                                else
                                {
-                                       cost = 1;
+                                       cost = 0;
                                }
                        }
                        else
                        {
-                               cost = COST_TOO_MUCH;
+                               move = 1;
+                               cost = compute_spill_cost(gen, regs, reg, -1);
                        }
                }
-               else if(other_reg >= 0 && jit_reg_is_used(gen->permanent, 
other_reg))
-               {
-                       cost = COST_TOO_MUCH;
-               }
-               else if(thrashes_register(gen, regs, desc, reg, other_reg))
-               {
-                       cost = COST_TOO_MUCH;
-               }
-               else if(desc && desc->value->in_register)
+               else
                {
-                       if(reg == desc->value->reg)
+                       if(jit_reg_is_used(gen->permanent, reg))
+                       {
+                               continue;
+                       }
+
+                       if(need_pair)
                        {
-                               if(clobbers_register(gen, regs, index, reg, 
other_reg)
-                                  && !(jit_reg_is_used(regs->clobber, reg)
-                                       || (other_reg >= 0
-                                           && jit_reg_is_used(regs->clobber, 
other_reg))))
+                               other_reg = OTHER_REG(reg);
+
+                               if(jit_reg_is_used(gen->inhibit, other_reg)
+                                  || jit_reg_is_used(regs->assigned, 
other_reg))
                                {
-                                       cost = compute_spill_cost(gen, regs, 
reg, other_reg);
+                                       continue;
+                               }
+                               if(jit_reg_is_used(gen->permanent, other_reg))
+                               {
+                                       continue;
+                               }
+                       }
+                       else
+                       {
+                               other_reg = -1;
+                       }
+
+                       if(thrashes_register(gen, regs, desc, reg, other_reg))
+                       {
+                               continue;
+                       }
+                       if(desc->value->in_register)
+                       {
+                               if(reg == desc->value->reg)
+                               {
+                                       if(clobbers_register(gen, regs, index, 
reg, other_reg)
+                                          && !(jit_reg_is_used(regs->clobber, 
reg)
+                                               || (other_reg >= 0
+                                                   && 
jit_reg_is_used(regs->clobber, other_reg))))
+                                       {
+                                               move = 0;
+                                               cost = compute_spill_cost(gen, 
regs, reg, other_reg);
+                                       }
+                                       else
+                                       {
+                                               move = 0;
+                                               cost = 0;
+                                       }
                                }
                                else
                                {
-                                       cost = 0;
+                                       move = 1;
+                                       cost = compute_spill_cost(gen, regs, 
reg, other_reg);
                                }
                        }
                        else
                        {
-                               cost = 1 + compute_spill_cost(gen, regs, reg, 
other_reg);
+                               move = 0;
+                               cost = compute_spill_cost(gen, regs, reg, 
other_reg);
                        }
                }
-               else
-               {
-                       cost = compute_spill_cost(gen, regs, reg, other_reg);
-               }
 
-               if(cost < suitable_cost
-                  || (cost > 0 && cost == suitable_cost
+               if((move + cost) < suitable_cost
+                  || (cost > 0 && (move + cost) == suitable_cost
                       && gen->contents[reg].age < suitable_age))
                {
                        /* This is the oldest suitable register of this type */
                        suitable_reg = reg;
-                       suitable_cost = cost;
+                       suitable_cost = move + cost;
                        suitable_age = gen->contents[reg].age;
                }
        }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]