summaryrefslogtreecommitdiff
path: root/gcc/lra-constraints.c
diff options
context:
space:
mode:
authorvmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>2014-12-15 19:51:31 +0000
committervmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>2014-12-15 19:51:31 +0000
commit2bd0853710d6bda898e11f38dc704107e0c2823d (patch)
tree750014302b6c2aa69719a56bb900622d8fc084ca /gcc/lra-constraints.c
parent06f29f535a7d704bfd14da3b6a42e8529827ad01 (diff)
downloadgcc-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.c22
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