diff options
author | Kaz Kojima <kkojima@gcc.gnu.org> | 2014-12-19 04:36:54 +0000 |
---|---|---|
committer | Kaz Kojima <kkojima@gcc.gnu.org> | 2014-12-19 04:36:54 +0000 |
commit | 70712859a1068dfd0683199fe6fa669280ecfec4 (patch) | |
tree | 6dd63a10a345d428e8fa62b0b61cd20f1a97835c /gcc/lra-constraints.c | |
parent | 47b6f9825f7867fcd91e3150ce6f95676ee3985d (diff) | |
download | gcc-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
Diffstat (limited to 'gcc/lra-constraints.c')
-rw-r--r-- | gcc/lra-constraints.c | 14 |
1 files changed, 14 insertions, 0 deletions
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 |