diff options
author | vmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-12-15 19:51:31 +0000 |
---|---|---|
committer | vmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-12-15 19:51:31 +0000 |
commit | 2bd0853710d6bda898e11f38dc704107e0c2823d (patch) | |
tree | 750014302b6c2aa69719a56bb900622d8fc084ca /gcc/lra-constraints.c | |
parent | 06f29f535a7d704bfd14da3b6a42e8529827ad01 (diff) | |
download | gcc-2bd0853710d6bda898e11f38dc704107e0c2823d.tar.gz |
2014-12-15 Vladimir Makarov <vmakarov@redhat.com>
* ira-int.h (ira_prohibited_class_mode_regs): Remove.
(struct target_ira_int): Move x_ira_prohibited_class_mode_regs to
...
* ira.h (struct target_ira_int): ... here.
(ira_prohibited_class_mode_regs): Define.
* lra-constraints.c (process_alt_operands): Add one more condition
to refuse alternative when reload pseudo of given class can not
hold value of given mode.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@218760 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/lra-constraints.c')
-rw-r--r-- | gcc/lra-constraints.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c index e0d4c1950d7..a108b84c120 100644 --- a/gcc/lra-constraints.c +++ b/gcc/lra-constraints.c @@ -2269,17 +2269,25 @@ process_alt_operands (int only_alternative) /* Alternative loses if it required class pseudo can not hold value of required mode. Such insns can be - described by insn definitions with mode iterators. - Don't use ira_prohibited_class_mode_regs here as it - is common practice for constraints to use a class - which does not have actually enough regs to hold the - value (e.g. x86 AREG for mode requiring more one - general reg). */ + described by insn definitions with mode iterators. */ if (GET_MODE (*curr_id->operand_loc[nop]) != VOIDmode && ! hard_reg_set_empty_p (this_alternative_set) + /* It is common practice for constraints to use a + class which does not have actually enough regs to + hold the value (e.g. x86 AREG for mode requiring + more one general reg). Therefore we have 2 + conditions to check that the reload pseudo can + not hold the mode value. */ && ! HARD_REGNO_MODE_OK (ira_class_hard_regs [this_alternative][0], - GET_MODE (*curr_id->operand_loc[nop]))) + GET_MODE (*curr_id->operand_loc[nop])) + /* The above condition is not enough as the first + reg in ira_class_hard_regs can be not aligned for + multi-words mode values. */ + && hard_reg_set_subset_p (this_alternative_set, + ira_prohibited_class_mode_regs + [this_alternative] + [GET_MODE (*curr_id->operand_loc[nop])])) { if (lra_dump_file != NULL) fprintf |