(find_reg): Store divide results in temporary variables.
authorJim Wilson <wilson@gcc.gnu.org>
Tue, 19 Jul 1994 02:02:32 +0000 (19:02 -0700)
committerJim Wilson <wilson@gcc.gnu.org>
Tue, 19 Jul 1994 02:02:32 +0000 (19:02 -0700)
From-SVN: r7778

gcc/global.c

index 297e930..3f15cbe 100644 (file)
@@ -1096,28 +1096,36 @@ find_reg (allocno, losers, alt_regs_p, accept_call_clobbered, retrying)
          if (local_reg_n_refs[regno] != 0
              /* Don't use a reg no good for this pseudo.  */
              && ! TEST_HARD_REG_BIT (used2, regno)
-             && HARD_REGNO_MODE_OK (regno, mode)
-             && (((double) local_reg_n_refs[regno]
-                  / local_reg_live_length[regno])
-                 < ((double) allocno_n_refs[allocno]
-                    / allocno_live_length[allocno])))
+             && HARD_REGNO_MODE_OK (regno, mode))
            {
-             /* Hard reg REGNO was used less in total by local regs
-                than it would be used by this one allocno!  */
-             int k;
-             for (k = 0; k < max_regno; k++)
-               if (reg_renumber[k] >= 0)
-                 {
-                   int r = reg_renumber[k];
-                   int endregno
-                     = r + HARD_REGNO_NREGS (r, PSEUDO_REGNO_MODE (k));
+             /* We explicitly evaluate the divide results into temporary
+                variables so as to avoid excess precision problems that occur
+                on a i386-unknown-sysv4.2 (unixware) host.  */
+                
+             double tmp1 = ((double) local_reg_n_refs[regno]
+                           / local_reg_live_length[regno]);
+             double tmp2 = ((double) allocno_n_refs[allocno]
+                            / allocno_live_length[allocno]);
+
+             if (tmp1 < tmp2)
+               {
+                 /* Hard reg REGNO was used less in total by local regs
+                    than it would be used by this one allocno!  */
+                 int k;
+                 for (k = 0; k < max_regno; k++)
+                   if (reg_renumber[k] >= 0)
+                     {
+                       int r = reg_renumber[k];
+                       int endregno
+                         = r + HARD_REGNO_NREGS (r, PSEUDO_REGNO_MODE (k));
 
-                   if (regno >= r && regno < endregno)
-                     reg_renumber[k] = -1;
-                 }
+                       if (regno >= r && regno < endregno)
+                         reg_renumber[k] = -1;
+                     }
 
-             best_reg = regno;
-             break;
+                 best_reg = regno;
+                 break;
+               }
            }
        }
     }