aboutsummaryrefslogtreecommitdiff
path: root/gcc/ira-conflicts.c
diff options
context:
space:
mode:
authorDavid Sherwood <david.sherwood@arm.com>2014-09-30 08:04:32 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2014-09-30 08:04:32 +0000
commitd1bb282efbf9ef9c4217119896d5d594eca627a5 (patch)
treef4c9f1d2c838c3e2c542cc98b20aed91a2457ea4 /gcc/ira-conflicts.c
parent4176084b61c55045e4ac47c1b8794292f61b44e1 (diff)
downloadgcc-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.c21
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;