From: Richard Henderson Date: Sat, 27 Jun 1998 23:30:37 +0000 (-0700) Subject: jump.c (jump_optimize): Use side_effects_p & may_trap_p instead of rtx_unsafe_p. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0bef9b8d880c9d6288e826c6526cf047bfe1ec27;p=gcc.git jump.c (jump_optimize): Use side_effects_p & may_trap_p instead of rtx_unsafe_p. * jump.c (jump_optimize): Use side_effects_p & may_trap_p instead of rtx_unsafe_p. Use modified_between_p instead of reg_set_between_p. Allow FP moves to be optimized. (rtx_unsafe_p): Delete. From-SVN: r20770 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7b997092847..6aa4f957224 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +Sat Jun 27 23:32:25 1998 Richard Henderson + + * jump.c (jump_optimize): Use side_effects_p & may_trap_p instead + of rtx_unsafe_p. Use modified_between_p instead of reg_set_between_p. + Allow FP moves to be optimized. + (rtx_unsafe_p): Delete. + Sat Jun 27 23:02:04 1998 Richard Henderson * objc/archive.c: Remove prototypes. diff --git a/gcc/jump.c b/gcc/jump.c index 273d31d662c..6c38de8e662 100644 --- a/gcc/jump.c +++ b/gcc/jump.c @@ -122,7 +122,6 @@ static void redirect_tablejump PROTO((rtx, rtx)); #ifndef HAVE_cc0 static rtx find_insert_position PROTO((rtx, rtx)); #endif -static int rtx_unsafe_p PROTO((rtx)); /* Delete no-op jumps and optimize jumps to jumps and jumps around jumps. @@ -773,7 +772,8 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan) && GET_CODE (temp2) == INSN && (temp4 = single_set (temp2)) != 0 && rtx_equal_p (SET_DEST (temp4), temp1) - && ! rtx_unsafe_p (SET_SRC (temp4)) + && ! side_effects_p (SET_SRC (temp4)) + && ! may_trap_p (SET_SRC (temp4)) && (REG_NOTES (temp2) == 0 || ((REG_NOTE_KIND (REG_NOTES (temp2)) == REG_EQUAL || REG_NOTE_KIND (REG_NOTES (temp2)) == REG_EQUIV) @@ -910,11 +910,8 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan) && GET_CODE (temp3) == INSN && (temp4 = single_set (temp3)) != 0 && rtx_equal_p (SET_DEST (temp4), temp1) - && (GET_CODE (SET_SRC (temp4)) == REG - || GET_CODE (SET_SRC (temp4)) == SUBREG - || (GET_CODE (SET_SRC (temp4)) == MEM - && RTX_UNCHANGING_P (SET_SRC (temp4))) - || CONSTANT_P (SET_SRC (temp4))) + && ! side_effects_p (SET_SRC (temp4)) + && ! may_trap_p (SET_SRC (temp4)) && (REG_NOTES (temp3) == 0 || ((REG_NOTE_KIND (REG_NOTES (temp3)) == REG_EQUAL || REG_NOTE_KIND (REG_NOTES (temp3)) == REG_EQUIV) @@ -944,9 +941,7 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan) && ! reg_referenced_between_p (temp1, temp3, NEXT_INSN (temp2)) && ! reg_set_between_p (temp1, insert_after, temp) - && (GET_CODE (SET_SRC (temp4)) == CONST_INT - || ! reg_set_between_p (SET_SRC (temp4), - insert_after, temp)) + && ! modified_between_p (SET_SRC (temp4), insert_after, temp) && invert_jump (temp, JUMP_LABEL (insn))) { emit_insn_after_with_line_notes (PATTERN (temp3), @@ -992,7 +987,6 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan) && JUMP_LABEL (temp2) == JUMP_LABEL (insn))) && (temp1 = single_set (temp)) != 0 && (temp2 = SET_DEST (temp1), GET_CODE (temp2) == REG) - && GET_MODE_CLASS (GET_MODE (temp2)) == MODE_INT && (! SMALL_REGISTER_CLASSES || REGNO (temp2) >= FIRST_PSEUDO_REGISTER) && GET_CODE (SET_SRC (temp1)) != REG @@ -1159,7 +1153,8 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan) && GET_CODE (temp1 = SET_DEST (PATTERN (temp))) == REG && (! SMALL_REGISTER_CLASSES || REGNO (temp1) >= FIRST_PSEUDO_REGISTER) - && ! rtx_unsafe_p (temp2 = SET_SRC (PATTERN (temp))) + && ! side_effects_p (temp2 = SET_SRC (PATTERN (temp))) + && ! may_trap_p (temp2) /* Allow either form, but prefer the former if both apply. There is no point in using the old value of TEMP1 if it is a register, since cse will alias them. It can @@ -4852,72 +4847,3 @@ find_insert_position (insn, new) return reg_mentioned_p (SET_DEST (single_set (new)), prev) ? 0 : prev; } #endif /* !HAVE_cc0 */ - -/* Return 1 if the value of X is unsafe to arbitrarily evaluate, i.e. - might fault on some arguments. This is used in connection with - conditional move optimization. */ - -static int -rtx_unsafe_p (x) - rtx x; -{ - register RTX_CODE code = GET_CODE (x); - register int i; - register char *fmt; - - switch (code) - { - case MEM: - return ! RTX_UNCHANGING_P (x); - - case QUEUED: - return 1; - - case CONST_INT: - case CONST_DOUBLE: - case CONST_STRING: - case CONST: - case PC: - case LABEL_REF: - case SYMBOL_REF: - case ADDRESSOF: - case REG: - return 0; - - case DIV: - case MOD: - case UDIV: - case UMOD: - case SQRT: - return 1; - - default: - if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT - && !flag_fast_math - && FLOAT_MODE_P (GET_MODE (x))) - return 1; - - switch (GET_RTX_CLASS (code)) - { - case '<': - case '1': - case '2': - case '3': - case 'c': - case 'b': - break; - - default: - return 1; - } - break; - } - - fmt = GET_RTX_FORMAT (code); - for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) - if (fmt[i] == 'e') - if (rtx_unsafe_p (XEXP (x, i))) - return 1; - - return 0; -}