aboutsummaryrefslogtreecommitdiff
path: root/gcc/gcse.c
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@redhat.com>2004-03-23 09:33:30 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2004-03-23 09:33:30 +0000
commit1707bafaa50737e92d6d374b69a4de4d02ab4476 (patch)
treefb7805eaa3dd4f5f9578071423db5c11ddeef1e1 /gcc/gcse.c
parent63185fabbac3d69f62a463c5d1dc18c9a92c9cac (diff)
downloadgcc-1707bafaa50737e92d6d374b69a4de4d02ab4476.zip
gcc-1707bafaa50737e92d6d374b69a4de4d02ab4476.tar.gz
gcc-1707bafaa50737e92d6d374b69a4de4d02ab4476.tar.bz2
gcse.c (can_assign_to_reg_p): New function, split out from...
* gcse.c (can_assign_to_reg_p): New function, split out from... (want_to_gcse_p): ...here. (compute_ld_motion_mems): Use can_assign_to_reg_p to validate the rhs of a store. From-SVN: r79856
Diffstat (limited to 'gcc/gcse.c')
-rw-r--r--gcc/gcse.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/gcc/gcse.c b/gcc/gcse.c
index eb37e18..88f94f6 100644
--- a/gcc/gcse.c
+++ b/gcc/gcse.c
@@ -568,6 +568,7 @@ static void hash_scan_set (rtx, rtx, struct hash_table *);
static void hash_scan_clobber (rtx, rtx, struct hash_table *);
static void hash_scan_call (rtx, rtx, struct hash_table *);
static int want_to_gcse_p (rtx);
+static bool can_assign_to_reg_p (rtx);
static bool gcse_constant_p (rtx);
static int oprs_unchanged_p (rtx, rtx, int);
static int oprs_anticipatable_p (rtx, rtx);
@@ -1269,13 +1270,9 @@ static basic_block current_bb;
/* See whether X, the source of a set, is something we want to consider for
GCSE. */
-static GTY(()) rtx test_insn;
static int
want_to_gcse_p (rtx x)
{
- int num_clobbers = 0;
- int icode;
-
switch (GET_CODE (x))
{
case REG:
@@ -1288,8 +1285,21 @@ want_to_gcse_p (rtx x)
return 0;
default:
- break;
+ return can_assign_to_reg_p (x);
}
+}
+
+/* Used internally by can_assign_to_reg_p. */
+
+static GTY(()) rtx test_insn;
+
+/* Return true if we can assign X to a pseudo register. */
+
+static bool
+can_assign_to_reg_p (rtx x)
+{
+ int num_clobbers = 0;
+ int icode;
/* If this is a valid operand, we are OK. If it's VOIDmode, we aren't. */
if (general_operand (x, GET_MODE (x)))
@@ -6838,7 +6848,7 @@ compute_ld_motion_mems (void)
&& GET_CODE (src) != ASM_OPERANDS
/* Check for REG manually since want_to_gcse_p
returns 0 for all REGs. */
- && (REG_P (src) || want_to_gcse_p (src)))
+ && can_assign_to_reg_p (src))
ptr->stores = alloc_INSN_LIST (insn, ptr->stores);
else
ptr->invalid = 1;