From 37cf61167f3d85b235bec602cef96b6e39764f2c Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 28 Jul 2005 22:57:44 -0700 Subject: [PATCH] cse.c (exp_equiv_p): Special case CONST_DOUBLE. * cse.c (exp_equiv_p): Special case CONST_DOUBLE. * cselib.c (rtx_equal_for_cselib_p): Likewise. * jump.c (rtx_renumbered_equal_p): Likewise. * loop.c (rtx_equal_for_loop_p): Tidy and special case PC, CC0, CONST_INT and CONST_DOUBLE. (rtx_equal_for_prefetch_p): Likewise, plus LABEL_REF. * reload.c (operands_match_p): Special case CONST_INT and CONST_DOUBLE; check mode earlier. From-SVN: r102548 --- gcc/ChangeLog | 11 +++++++++++ gcc/cse.c | 1 + gcc/cselib.c | 15 ++++++++++++--- gcc/jump.c | 1 + gcc/loop.c | 44 +++++++++++++++++++++++++++++++++++++------- gcc/reload.c | 24 +++++++++++++++++------- 6 files changed, 79 insertions(+), 17 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 86664bab127..07e31b4bf42 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2005-07-28 Richard Henderson + + * cse.c (exp_equiv_p): Special case CONST_DOUBLE. + * cselib.c (rtx_equal_for_cselib_p): Likewise. + * jump.c (rtx_renumbered_equal_p): Likewise. + * loop.c (rtx_equal_for_loop_p): Tidy and special case PC, CC0, + CONST_INT and CONST_DOUBLE. + (rtx_equal_for_prefetch_p): Likewise, plus LABEL_REF. + * reload.c (operands_match_p): Special case CONST_INT and + CONST_DOUBLE; check mode earlier. + 2005-07-29 Joseph S. Myers PR c/22240 diff --git a/gcc/cse.c b/gcc/cse.c index 9cade945e4e..1efcf308ae4 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -2498,6 +2498,7 @@ exp_equiv_p (rtx x, rtx y, int validate, bool for_gcse) case PC: case CC0: case CONST_INT: + case CONST_DOUBLE: return x == y; case LABEL_REF: diff --git a/gcc/cselib.c b/gcc/cselib.c index 5d36be91829..13fc5326dc0 100644 --- a/gcc/cselib.c +++ b/gcc/cselib.c @@ -462,9 +462,18 @@ rtx_equal_for_cselib_p (rtx x, rtx y) if (GET_CODE (x) != GET_CODE (y) || GET_MODE (x) != GET_MODE (y)) return 0; - /* This won't be handled correctly by the code below. */ - if (GET_CODE (x) == LABEL_REF) - return XEXP (x, 0) == XEXP (y, 0); + /* These won't be handled correctly by the code below. */ + switch (GET_CODE (x)) + { + case CONST_DOUBLE: + return 0; + + case LABEL_REF: + return XEXP (x, 0) == XEXP (y, 0); + + default: + break; + } code = GET_CODE (x); fmt = GET_RTX_FORMAT (code); diff --git a/gcc/jump.c b/gcc/jump.c index e3e2cdaa501..c278319b4d2 100644 --- a/gcc/jump.c +++ b/gcc/jump.c @@ -1879,6 +1879,7 @@ rtx_renumbered_equal_p (rtx x, rtx y) case ADDR_VEC: case ADDR_DIFF_VEC: case CONST_INT: + case CONST_DOUBLE: return 0; case LABEL_REF: diff --git a/gcc/loop.c b/gcc/loop.c index 2686294bfd8..a904881be3d 100644 --- a/gcc/loop.c +++ b/gcc/loop.c @@ -2057,14 +2057,26 @@ rtx_equal_for_loop_p (rtx x, rtx y, struct loop_movables *movables, if (GET_MODE (x) != GET_MODE (y)) return 0; - /* These three types of rtx's can be compared nonrecursively. */ - if (code == REG) - return (REGNO (x) == REGNO (y) || regs_match_p (x, y, movables)); + /* These types of rtx's can be compared nonrecursively. */ + switch (code) + { + case PC: + case CC0: + case CONST_INT: + case CONST_DOUBLE: + return 0; - if (code == LABEL_REF) - return XEXP (x, 0) == XEXP (y, 0); - if (code == SYMBOL_REF) - return XSTR (x, 0) == XSTR (y, 0); + case REG: + return (REGNO (x) == REGNO (y) || regs_match_p (x, y, movables)); + + case LABEL_REF: + return XEXP (x, 0) == XEXP (y, 0); + case SYMBOL_REF: + return XSTR (x, 0) == XSTR (y, 0); + + default: + break; + } /* Compare the elements. If any pair of corresponding elements fail to match, return 0 for the whole things. */ @@ -3984,6 +3996,24 @@ rtx_equal_for_prefetch_p (rtx x, rtx y) if (code != GET_CODE (y)) return 0; + if (GET_MODE (x) != GET_MODE (y)) + return 0; + + switch (code) + { + case PC: + case CC0: + case CONST_INT: + case CONST_DOUBLE: + return 0; + + case LABEL_REF: + return XEXP (x, 0) == XEXP (y, 0); + + default: + break; + } + if (COMMUTATIVE_ARITH_P (x)) { return ((rtx_equal_for_prefetch_p (XEXP (x, 0), XEXP (y, 0)) diff --git a/gcc/reload.c b/gcc/reload.c index e2d4a8e1f3a..378db66aeac 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -2208,20 +2208,30 @@ operands_match_p (rtx x, rtx y) slow: - /* Now we have disposed of all the cases - in which different rtx codes can match. */ + /* Now we have disposed of all the cases in which different rtx codes + can match. */ if (code != GET_CODE (y)) return 0; - if (code == LABEL_REF) - return XEXP (x, 0) == XEXP (y, 0); - if (code == SYMBOL_REF) - return XSTR (x, 0) == XSTR (y, 0); /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. */ - if (GET_MODE (x) != GET_MODE (y)) return 0; + switch (code) + { + case CONST_INT: + case CONST_DOUBLE: + return 0; + + case LABEL_REF: + return XEXP (x, 0) == XEXP (y, 0); + case SYMBOL_REF: + return XSTR (x, 0) == XSTR (y, 0); + + default: + break; + } + /* Compare the elements. If any pair of corresponding elements fail to match, return 0 for the whole things. */ -- 2.30.2