aboutsummaryrefslogtreecommitdiff
path: root/gcc/regclass.c
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-11-18 18:23:49 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1994-11-18 18:23:49 -0500
commit4841ba4b1d6d93eb360f046d908643d26f0b042c (patch)
tree4701fcef836e9a8b2749bc3156de8d503b06ee76 /gcc/regclass.c
parent1ced4e9b049df5ba9f4ba699f6df044c463061ef (diff)
downloadgcc-4841ba4b1d6d93eb360f046d908643d26f0b042c.zip
gcc-4841ba4b1d6d93eb360f046d908643d26f0b042c.tar.gz
gcc-4841ba4b1d6d93eb360f046d908643d26f0b042c.tar.bz2
(record_reg_classes): When handling case of single SET between a hard register alone in a class and a pseudo...
(record_reg_classes): When handling case of single SET between a hard register alone in a class and a pseudo, make sure the register is the only member of the class. From-SVN: r8511
Diffstat (limited to 'gcc/regclass.c')
-rw-r--r--gcc/regclass.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/gcc/regclass.c b/gcc/regclass.c
index 129fbaf..5e75854 100644
--- a/gcc/regclass.c
+++ b/gcc/regclass.c
@@ -1364,6 +1364,7 @@ record_reg_classes (n_alts, n_ops, ops, modes, constraints, insn)
int regno = REGNO (ops[!i]);
enum machine_mode mode = GET_MODE (ops[!i]);
int class;
+ int nr;
if (regno >= FIRST_PSEUDO_REGISTER && prefclass != 0
&& (reg_class_size[prefclass[regno]]
@@ -1373,7 +1374,21 @@ record_reg_classes (n_alts, n_ops, ops, modes, constraints, insn)
for (class = 0; class < N_REG_CLASSES; class++)
if (TEST_HARD_REG_BIT (reg_class_contents[class], regno)
&& reg_class_size[class] == CLASS_MAX_NREGS (class, mode))
- op_costs[i].cost[class] = -1;
+ {
+ if (reg_class_size[class] == 1)
+ op_costs[i].cost[class] = -1;
+ else
+ {
+ for (nr = 0; nr < HARD_REGNO_NREGS(regno, mode); nr++)
+ {
+ if (!TEST_HARD_REG_BIT (reg_class_contents[class], regno + nr))
+ break;
+ }
+
+ if (nr == HARD_REGNO_NREGS(regno,mode))
+ op_costs[i].cost[class] = -1;
+ }
+ }
}
}