diff options
author | Kazu Hirata <kazu@cs.umass.edu> | 2003-06-12 04:15:56 +0000 |
---|---|---|
committer | Kazu Hirata <kazu@gcc.gnu.org> | 2003-06-12 04:15:56 +0000 |
commit | 2fa4a84980a8076f2819d0eac793a3fa215c6276 (patch) | |
tree | 85141565fe52d7f0a1a45c4dc9d1cb2189baa8da /gcc | |
parent | 58ac1d7f0ed6264255737ccba13f32d70fb79d22 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/gcse.c | 3 | ||||
-rw-r--r-- | gcc/reload1.c | 24 | ||||
-rw-r--r-- | gcc/rtl.h | 1 |
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 @@ -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) @@ -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 *)); |