summaryrefslogtreecommitdiff
path: root/gcc/regclass.c
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-11-16 19:11:55 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1994-11-16 19:11:55 -0500
commitec2d92affbfbb08228501683c883b2617b4e5d06 (patch)
treedf17d59cee230edb92dfa082805b3d1fecd2cf57 /gcc/regclass.c
parent9ad265b05ed2c5b516f15dc4ca9f5b17944a1951 (diff)
downloadgcc-ec2d92affbfbb08228501683c883b2617b4e5d06.tar.gz
(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.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/regclass.c b/gcc/regclass.c
index d4636d58374..129fbaf1131 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