summaryrefslogtreecommitdiff
path: root/gcc/lra-assigns.c
diff options
context:
space:
mode:
authorvmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>2017-01-26 17:08:12 +0000
committervmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>2017-01-26 17:08:12 +0000
commit9628978f9de43546af531730a7c93eca787ba6e9 (patch)
tree3ba1dafb844c589e276e71d31cb9c17653dce0c5 /gcc/lra-assigns.c
parent6a5947929d528b6dca296759f4097cd354f5e9f1 (diff)
downloadgcc-9628978f9de43546af531730a7c93eca787ba6e9.tar.gz
2017-01-26 Vladimir Makarov <vmakarov@redhat.com>
PR target/79131 * lra-assigns.c (setup_live_pseudos_and_spill_after_risky): Take endianess for subregs into account. * lra-constraints.c (lra_constraints): Do risky transformations always on the first iteration. * lra-lives.c (check_pseudos_live_through_calls): Add arg last_call_used_reg_set. (process_bb_lives): Define and use last_call_used_reg_set. * lra.c (lra): Always continue after lra_constraints on the first iteration. 2017-01-26 Vladimir Makarov <vmakarov@redhat.com> PR target/79131 * gcc.target/arm/pr79131.c: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@244942 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/lra-assigns.c')
-rw-r--r--gcc/lra-assigns.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/gcc/lra-assigns.c b/gcc/lra-assigns.c
index 8e21a497f0a..74a3195c4db 100644
--- a/gcc/lra-assigns.c
+++ b/gcc/lra-assigns.c
@@ -1179,9 +1179,19 @@ setup_live_pseudos_and_spill_after_risky_transforms (bitmap
/* If it is multi-register pseudos they should start on
the same hard register. */
|| hard_regno != reg_renumber[conflict_regno])
- add_to_hard_reg_set (&conflict_set,
- lra_reg_info[conflict_regno].biggest_mode,
- reg_renumber[conflict_regno]);
+ {
+ int conflict_hard_regno = reg_renumber[conflict_regno];
+ machine_mode biggest_mode = lra_reg_info[conflict_regno].biggest_mode;
+ int biggest_nregs = hard_regno_nregs[conflict_hard_regno][biggest_mode];
+ int nregs_diff = (biggest_nregs
+ - (hard_regno_nregs
+ [conflict_hard_regno]
+ [PSEUDO_REGNO_MODE (conflict_regno)]));
+ add_to_hard_reg_set (&conflict_set,
+ biggest_mode,
+ conflict_hard_regno
+ - (WORDS_BIG_ENDIAN ? nregs_diff : 0));
+ }
if (! overlaps_hard_reg_set_p (conflict_set, mode, hard_regno))
{
update_lives (regno, false);