From: Kazu Hirata Date: Thu, 12 Jun 2003 04:15:56 +0000 (+0000) Subject: gcse.c (fis_get_condition): Make it a global function. X-Git-Tag: releases/gcc-3.4.0~5922 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2fa4a84980a8076f2819d0eac793a3fa215c6276;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ecbb5be3a9b0..e7d48447b19b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-06-12 Kazu Hirata + + * 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 * stmt.c (expand_asm_operands): Don't warn for memories with diff --git a/gcc/gcse.c b/gcc/gcse.c index 8050dd13c73d..0dbe56a63263 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 f8b3d5aef349..12f6689eaf19 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 8b2ae092ebbe..85bc64571ecb 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 *));