diff options
author | David Sherwood <david.sherwood@arm.com> | 2014-09-30 08:04:32 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2014-09-30 08:04:32 +0000 |
commit | d1bb282efbf9ef9c4217119896d5d594eca627a5 (patch) | |
tree | f4c9f1d2c838c3e2c542cc98b20aed91a2457ea4 /gcc/ira-conflicts.c | |
parent | 4176084b61c55045e4ac47c1b8794292f61b44e1 (diff) | |
download | gcc-d1bb282efbf9ef9c4217119896d5d594eca627a5.zip gcc-d1bb282efbf9ef9c4217119896d5d594eca627a5.tar.gz gcc-d1bb282efbf9ef9c4217119896d5d594eca627a5.tar.bz2 |
ira-int.h (ira_allocno): Add "wmode" field.
gcc/
2014-09-26 David Sherwood <david.sherwood@arm.com>
* ira-int.h (ira_allocno): Add "wmode" field.
* ira-build.c (create_insn_allocnos): Add new "parent" function
parameter.
* ira-conflicts.c (ira_build_conflicts): Add conflicts for registers
that cannot be accessed in wmode.
From-SVN: r215707
Diffstat (limited to 'gcc/ira-conflicts.c')
-rw-r--r-- | gcc/ira-conflicts.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/gcc/ira-conflicts.c b/gcc/ira-conflicts.c index 6b1bfad..15ed08b 100644 --- a/gcc/ira-conflicts.c +++ b/gcc/ira-conflicts.c @@ -774,6 +774,27 @@ ira_build_conflicts (void) temp_hard_reg_set); } + /* Now we deal with paradoxical subreg cases where certain registers + cannot be accessed in the widest mode. */ + enum machine_mode outer_mode = ALLOCNO_WMODE (a); + enum machine_mode inner_mode = ALLOCNO_MODE (a); + if (GET_MODE_SIZE (outer_mode) > GET_MODE_SIZE (inner_mode)) + { + enum reg_class aclass = ALLOCNO_CLASS (a); + for (int j = ira_class_hard_regs_num[aclass] - 1; j >= 0; --j) + { + int inner_regno = ira_class_hard_regs[aclass][j]; + int outer_regno = simplify_subreg_regno (inner_regno, + inner_mode, 0, + outer_mode); + if (outer_regno < 0 + || !in_hard_reg_set_p (reg_class_contents[aclass], + outer_mode, outer_regno)) + SET_HARD_REG_BIT (OBJECT_CONFLICT_HARD_REGS (obj), + inner_regno); + } + } + if (ALLOCNO_CALLS_CROSSED_NUM (a) != 0) { int regno; |