diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1994-11-16 19:11:55 -0500 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1994-11-16 19:11:55 -0500 |
commit | ec2d92affbfbb08228501683c883b2617b4e5d06 (patch) | |
tree | df17d59cee230edb92dfa082805b3d1fecd2cf57 /gcc/regclass.c | |
parent | 9ad265b05ed2c5b516f15dc4ca9f5b17944a1951 (diff) | |
download | gcc-ec2d92affbfbb08228501683c883b2617b4e5d06.zip gcc-ec2d92affbfbb08228501683c883b2617b4e5d06.tar.gz gcc-ec2d92affbfbb08228501683c883b2617b4e5d06.tar.bz2 |
(record_reg_classes): Handle case of single SET between a hard
register alone in a class and a pseudo.
From-SVN: r8474
Diffstat (limited to 'gcc/regclass.c')
-rw-r--r-- | gcc/regclass.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/regclass.c b/gcc/regclass.c index d4636d5..129fbaf 100644 --- a/gcc/regclass.c +++ b/gcc/regclass.c @@ -1015,6 +1015,7 @@ record_reg_classes (n_alts, n_ops, ops, modes, constraints, insn) int alt; enum op_type {OP_READ, OP_WRITE, OP_READ_WRITE} op_types[MAX_RECOG_OPERANDS]; int i, j; + rtx set; /* By default, each operand is an input operand. */ @@ -1349,6 +1350,31 @@ record_reg_classes (n_alts, n_ops, ops, modes, constraints, insn) (qq->cost[class] + alt_cost) * scale); } } + + /* If this insn is a single set copying operand 1 to operand 0 + and one is a pseudo with the other a hard reg that is in its + own register class, set the cost of that register class to -1. */ + + if ((set = single_set (insn)) != 0 + && ops[0] == SET_DEST (set) && ops[1] == SET_SRC (set) + && GET_CODE (ops[0]) == REG && GET_CODE (ops[1]) == REG) + for (i = 0; i <= 1; i++) + if (REGNO (ops[i]) >= FIRST_PSEUDO_REGISTER) + { + int regno = REGNO (ops[!i]); + enum machine_mode mode = GET_MODE (ops[!i]); + int class; + + if (regno >= FIRST_PSEUDO_REGISTER && prefclass != 0 + && (reg_class_size[prefclass[regno]] + == CLASS_MAX_NREGS (prefclass[regno], mode))) + op_costs[i].cost[prefclass[regno]] = -1; + else if (regno < FIRST_PSEUDO_REGISTER) + 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; + } } /* Compute the cost of loading X into (if TO_P is non-zero) or from (if |