aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaz Kojima <kkojima@gcc.gnu.org>2014-12-19 04:36:54 +0000
committerKaz Kojima <kkojima@gcc.gnu.org>2014-12-19 04:36:54 +0000
commit70712859a1068dfd0683199fe6fa669280ecfec4 (patch)
tree6dd63a10a345d428e8fa62b0b61cd20f1a97835c
parent47b6f9825f7867fcd91e3150ce6f95676ee3985d (diff)
downloadgcc-70712859a1068dfd0683199fe6fa669280ecfec4.zip
gcc-70712859a1068dfd0683199fe6fa669280ecfec4.tar.gz
gcc-70712859a1068dfd0683199fe6fa669280ecfec4.tar.bz2
lra-constraints.c (process_address_1): Swap base_term and index_term if INDEX_REG_CLASS is assigned to base_term...
* lra-constraints.c (process_address_1): Swap base_term and index_term if INDEX_REG_CLASS is assigned to base_term already when INDEX_REG_CLASS is a single register class. From-SVN: r218885
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/lra-constraints.c14
2 files changed, 20 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 72e8dfd..4d83cad 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2014-12-19 Kaz Kojima <kkojima@gcc.gnu.org>
+
+ * lra-constraints.c (process_address_1): Swap base_term and
+ index_term if INDEX_REG_CLASS is assigned to base_term already
+ when INDEX_REG_CLASS is a single register class.
+
2014-12-18 Vladimir Makarov <vmakarov@redhat.com>
* lra-constraints.c (lra-constraints.c): Exchange places of sclass
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 23fd44d..8fc2cb7 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -2834,6 +2834,20 @@ process_address_1 (int nop, bool check_only_p,
decompose_mem_address (&ad, SUBREG_REG (op));
else
return false;
+ /* If INDEX_REG_CLASS is assigned to base_term already and isn't to
+ index_term, swap them so to avoid assigning INDEX_REG_CLASS to both
+ when INDEX_REG_CLASS is a single register class. */
+ if (ad.base_term != NULL
+ && ad.index_term != NULL
+ && ira_class_hard_regs_num[INDEX_REG_CLASS] == 1
+ && REG_P (*ad.base_term)
+ && REG_P (*ad.index_term)
+ && in_class_p (*ad.base_term, INDEX_REG_CLASS, NULL)
+ && ! in_class_p (*ad.index_term, INDEX_REG_CLASS, NULL))
+ {
+ std::swap (ad.base, ad.index);
+ std::swap (ad.base_term, ad.index_term);
+ }
if (! check_only_p)
change_p = equiv_address_substitution (&ad);
if (ad.base_term != NULL