aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2011-12-20 21:29:36 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2011-12-20 21:29:36 +0000
commit9d19c7329c6da0b59df04b32bca26f7d2c1ce20a (patch)
tree84a9907be731914d6a5e2d06a3ddeca3eab7ae65 /gcc
parent6904889880ad58684c6eeaf366ab4af6167cd5b0 (diff)
downloadgcc-9d19c7329c6da0b59df04b32bca26f7d2c1ce20a.zip
gcc-9d19c7329c6da0b59df04b32bca26f7d2c1ce20a.tar.gz
gcc-9d19c7329c6da0b59df04b32bca26f7d2c1ce20a.tar.bz2
re PR target/49865 (Unnecessary reload causes small bloat)
2011-12-20 Vladimir Makarov <vmakarov@redhat.com> PR target/49865 * ira-costs.c (find_costs_and_classes): Prefer registers even if the memory cost is the same. From-SVN: r182553
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ira-costs.c9
2 files changed, 14 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ad53a03..9bbfbcb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2011-12-20 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR target/49865
+ * ira-costs.c (find_costs_and_classes): Prefer registers even
+ if the memory cost is the same.
+
2011-12-20 Joseph Myers <joseph@codesourcery.com>
* c-decl.c (diagnose_mismatched_decls, grokdeclarator, grokfield)
diff --git a/gcc/ira-costs.c b/gcc/ira-costs.c
index 4fa12a2..4f2f841 100644
--- a/gcc/ira-costs.c
+++ b/gcc/ira-costs.c
@@ -1693,7 +1693,14 @@ find_costs_and_classes (FILE *dump_file)
else if (i_costs[k] == best_cost)
best = ira_reg_class_subunion[best][rclass];
if (pass == flag_expensive_optimizations
- && i_costs[k] < i_mem_cost
+ /* We still prefer registers to memory even at this
+ stage if their costs are the same. We will make
+ a final decision during assigning hard registers
+ when we have all info including more accurate
+ costs which might be affected by assigning hard
+ registers to other pseudos because the pseudos
+ involved in moves can be coalesced. */
+ && i_costs[k] <= i_mem_cost
&& (reg_class_size[reg_class_subunion[alt_class][rclass]]
> reg_class_size[alt_class]))
alt_class = reg_class_subunion[alt_class][rclass];