gcc/
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 26 Jul 2014 09:48:24 +0000 (09:48 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 26 Jul 2014 09:48:24 +0000 (09:48 +0000)
* ira-costs.c (find_costs_and_classes): For -O0, use the best class
as the allocation class if it isn't likely to be spilled.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@213078 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/ira-costs.c

index 6cf5364..1750691 100644 (file)
@@ -1,5 +1,10 @@
 2014-07-26  Richard Sandiford  <rdsandiford@googlemail.com>
 
+       * ira-costs.c (find_costs_and_classes): For -O0, use the best class
+       as the allocation class if it isn't likely to be spilled.
+
+2014-07-26  Richard Sandiford  <rdsandiford@googlemail.com>
+
        * rtl.h (tls_referenced_p): Declare.
        * rtlanal.c (tls_referenced_p_1, tls_referenced_p): New functions.
        * config/mips/mips.c (mips_tls_symbol_ref_1): Delete.
index a83e1df..13bbf07 100644 (file)
@@ -1753,6 +1753,20 @@ find_costs_and_classes (FILE *dump_file)
          alt_class = ira_allocno_class_translate[alt_class];
          if (best_cost > i_mem_cost)
            regno_aclass[i] = NO_REGS;
+         else if (!optimize && !targetm.class_likely_spilled_p (best))
+           /* Registers in the alternative class are likely to need
+              longer or slower sequences than registers in the best class.
+              When optimizing we make some effort to use the best class
+              over the alternative class where possible, but at -O0 we
+              effectively give the alternative class equal weight.
+              We then run the risk of using slower alternative registers
+              when plenty of registers from the best class are still free.
+              This is especially true because live ranges tend to be very
+              short in -O0 code and so register pressure tends to be low.
+
+              Avoid that by ignoring the alternative class if the best
+              class has plenty of registers.  */
+           regno_aclass[i] = best;
          else
            {
              /* Make the common class the biggest class of best and