diff options
author | Paolo Bonzini <bonzini@gnu.org> | 2006-09-09 12:43:32 +0000 |
---|---|---|
committer | Paolo Bonzini <bonzini@gcc.gnu.org> | 2006-09-09 12:43:32 +0000 |
commit | 8b649f3f12cb1903ac9a66028d6e7c3673a42e6f (patch) | |
tree | ffbee5ef420b0296e0de43fb40ba819309ee225d /gcc/regclass.c | |
parent | 827d0991fde61140c0a5e9770cff4524a7cda19c (diff) | |
download | gcc-8b649f3f12cb1903ac9a66028d6e7c3673a42e6f.zip gcc-8b649f3f12cb1903ac9a66028d6e7c3673a42e6f.tar.gz gcc-8b649f3f12cb1903ac9a66028d6e7c3673a42e6f.tar.bz2 |
re PR target/26778 (GCC4 moves the result of a conditional block through inadequate registers)
gcc:
2006-09-09 Paolo Bonzini <bonzini@gnu.org>
Dale Johannesen <dalej@apple.com>
PR target/26778
* regclass.c (struct reg_pref): Update documentation.
(regclass): Set prefclass to NO_REGS if memory is the best option.
(record_reg_classes): Cope with a prefclass set to NO_REGS.
gcc/testsuite:
2006-09-09 Eric Christopher <echristo@apple.com>
PR target/26778
* gcc.target/i386/pr26778.c: New testcase.
Co-Authored-By: Dale Johannesen <dalej@apple.com>
From-SVN: r116798
Diffstat (limited to 'gcc/regclass.c')
-rw-r--r-- | gcc/regclass.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/gcc/regclass.c b/gcc/regclass.c index 7b2d5b1..8a0bab1 100644 --- a/gcc/regclass.c +++ b/gcc/regclass.c @@ -811,7 +811,8 @@ struct costs /* Structure used to record preferences of given pseudo. */ struct reg_pref { - /* (enum reg_class) prefclass is the preferred class. */ + /* (enum reg_class) prefclass is the preferred class. May be + NO_REGS if no class is better than memory. */ char prefclass; /* altclass is a register class that we should use for allocating @@ -1314,6 +1315,10 @@ regclass (rtx f, int nregs) best = reg_class_subunion[(int) best][class]; } + /* If no register class is better than memory, use memory. */ + if (p->mem_cost < best_cost) + best = NO_REGS; + /* Record the alternate register class; i.e., a class for which every register in it is better than using memory. If adding a class would make a smaller class (i.e., no union of just those @@ -1524,7 +1529,7 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops, to what we would add if this register were not in the appropriate class. */ - if (reg_pref) + if (reg_pref && reg_pref[REGNO (op)].prefclass != NO_REGS) alt_cost += (may_move_in_cost[mode] [(unsigned char) reg_pref[REGNO (op)].prefclass] @@ -1750,7 +1755,7 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops, to what we would add if this register were not in the appropriate class. */ - if (reg_pref) + if (reg_pref && reg_pref[REGNO (op)].prefclass != NO_REGS) alt_cost += (may_move_in_cost[mode] [(unsigned char) reg_pref[REGNO (op)].prefclass] @@ -1836,7 +1841,8 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops, int class; unsigned int nr; - if (regno >= FIRST_PSEUDO_REGISTER && reg_pref != 0) + if (regno >= FIRST_PSEUDO_REGISTER && reg_pref != 0 + && reg_pref[regno].prefclass != NO_REGS) { enum reg_class pref = reg_pref[regno].prefclass; |