aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKazu Hirata <kazu@cs.umass.edu>2003-06-12 04:15:56 +0000
committerKazu Hirata <kazu@gcc.gnu.org>2003-06-12 04:15:56 +0000
commit2fa4a84980a8076f2819d0eac793a3fa215c6276 (patch)
tree85141565fe52d7f0a1a45c4dc9d1cb2189baa8da /gcc
parent58ac1d7f0ed6264255737ccba13f32d70fb79d22 (diff)
downloadgcc-2fa4a84980a8076f2819d0eac793a3fa215c6276.zip
gcc-2fa4a84980a8076f2819d0eac793a3fa215c6276.tar.gz
gcc-2fa4a84980a8076f2819d0eac793a3fa215c6276.tar.bz2
gcse.c (fis_get_condition): Make it a global function.
* gcse.c (fis_get_condition): Make it a global function. * reload1.c (reload_cse_move2add): Detect implicit sets. * rtl.h: Add a prototype for fis_get_condition. From-SVN: r67814
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/gcse.c3
-rw-r--r--gcc/reload1.c24
-rw-r--r--gcc/rtl.h1
4 files changed, 32 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ecbb5be..e7d4844 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2003-06-12 Kazu Hirata <kazu@cs.umass.edu>
+
+ * gcse.c (fis_get_condition): Make it a global function.
+ * reload1.c (reload_cse_move2add): Detect implicit sets.
+ * rtl.h: Add a prototype for fis_get_condition.
+
2003-06-11 Richard Henderson <rth@redhat.com>
* stmt.c (expand_asm_operands): Don't warn for memories with
diff --git a/gcc/gcse.c b/gcc/gcse.c
index 8050dd1..0dbe56a 100644
--- a/gcc/gcse.c
+++ b/gcc/gcse.c
@@ -611,7 +611,6 @@ static int load_killed_in_block_p PARAMS ((basic_block, int, rtx, int));
static void canon_list_insert PARAMS ((rtx, rtx, void *));
static int cprop_insn PARAMS ((rtx, int));
static int cprop PARAMS ((int));
-static rtx fis_get_condition PARAMS ((rtx));
static void find_implicit_sets PARAMS ((void));
static int one_cprop_pass PARAMS ((int, int, int));
static bool constprop_register PARAMS ((rtx, rtx, rtx, int));
@@ -4610,7 +4609,7 @@ cprop (alter_jumps)
recording the value of *every* register scaned by canonicalize_condition,
but this would require some code reorganization. */
-static rtx
+rtx
fis_get_condition (jump)
rtx jump;
{
diff --git a/gcc/reload1.c b/gcc/reload1.c
index f8b3d5a..12f6689 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -9314,6 +9314,30 @@ reload_cse_move2add (first)
}
}
note_stores (PATTERN (insn), move2add_note_store, NULL);
+
+ /* If INSN is a conditional branch, we try to extract an
+ implicit set out of it. */
+ if (any_condjump_p (insn) && onlyjump_p (insn))
+ {
+ rtx cnd = fis_get_condition (insn);
+
+ if (cnd != NULL_RTX
+ && GET_CODE (cnd) == NE
+ && GET_CODE (XEXP (cnd, 0)) == REG
+ /* The following two checks, which are also in
+ move2add_note_store, are intended to reduce the
+ number of calls to gen_rtx_SET to avoid memory
+ allocation if possible. */
+ && SCALAR_INT_MODE_P (GET_MODE (XEXP (cnd, 0)))
+ && HARD_REGNO_NREGS (REGNO (XEXP (cnd, 0)), GET_MODE (XEXP (cnd, 0))) == 1
+ && GET_CODE (XEXP (cnd, 1)) == CONST_INT)
+ {
+ rtx implicit_set =
+ gen_rtx_SET (VOIDmode, XEXP (cnd, 0), XEXP (cnd, 1));
+ move2add_note_store (SET_DEST (implicit_set), implicit_set, 0);
+ }
+ }
+
/* If this is a CALL_INSN, all call used registers are stored with
unknown values. */
if (GET_CODE (insn) == CALL_INSN)
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 8b2ae09..85bc645 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2168,6 +2168,7 @@ extern rtx expand_mult_highpart PARAMS ((enum machine_mode, rtx,
/* In gcse.c */
extern bool can_copy_p PARAMS ((enum machine_mode));
+extern rtx fis_get_condition PARAMS ((rtx));
#ifdef BUFSIZ
extern int gcse_main PARAMS ((rtx, FILE *));
extern int bypass_jumps PARAMS ((FILE *));