From 8cfd82bf11f0263afd6473c7d083dccb8b30994b Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Thu, 22 Jul 2010 22:34:11 +0000 Subject: [PATCH] ira.c (check_allocation): Correctly handle the case where an allocno with two objects was allocated to a... * ira.c (check_allocation): Correctly handle the case where an allocno with two objects was allocated to a single reg. From-SVN: r162432 --- gcc/ChangeLog | 5 +++++ gcc/ira.c | 25 +++++++++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c1a496977b8..4c71bb5b0ba 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-07-22 Bernd Schmidt + + * ira.c (check_allocation): Correctly handle the case where an allocno + with two objects was allocated to a single reg. + 2010-07-22 Richard Sandiford * tree-ssa-math-opts.c (is_widening_mult_rhs_p): New function. diff --git a/gcc/ira.c b/gcc/ira.c index 8aaaf0e8d4f..a6b77cdd3df 100644 --- a/gcc/ira.c +++ b/gcc/ira.c @@ -1624,11 +1624,14 @@ check_allocation (void) || (hard_regno = ALLOCNO_HARD_REGNO (a)) < 0) continue; nregs = hard_regno_nregs[hard_regno][ALLOCNO_MODE (a)]; - if (n > 1) - { - gcc_assert (n == nregs); - nregs = 1; - } + if (nregs == 1) + /* We allocated a single hard register. */ + n = 1; + else if (n > 1) + /* We allocated multiple hard registers, and we will test + conflicts in a granularity of single hard regs. */ + nregs = 1; + for (i = 0; i < n; i++) { ira_object_t obj = ALLOCNO_OBJECT (a, i); @@ -1648,7 +1651,13 @@ check_allocation (void) int conflict_hard_regno = ALLOCNO_HARD_REGNO (conflict_a); if (conflict_hard_regno < 0) continue; - if (ALLOCNO_NUM_OBJECTS (conflict_a) > 1) + + conflict_nregs + = (hard_regno_nregs + [conflict_hard_regno][ALLOCNO_MODE (conflict_a)]); + + if (ALLOCNO_NUM_OBJECTS (conflict_a) > 1 + && conflict_nregs == ALLOCNO_NUM_OBJECTS (conflict_a)) { if (WORDS_BIG_ENDIAN) conflict_hard_regno += (ALLOCNO_NUM_OBJECTS (conflict_a) @@ -1657,10 +1666,6 @@ check_allocation (void) conflict_hard_regno += OBJECT_SUBWORD (conflict_obj); conflict_nregs = 1; } - else - conflict_nregs - = (hard_regno_nregs - [conflict_hard_regno][ALLOCNO_MODE (conflict_a)]); if ((conflict_hard_regno <= this_regno && this_regno < conflict_hard_regno + conflict_nregs) -- 2.30.2