X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fauto-inc-dec.c;h=3b3006c985fa414d021f4eae72502c79fd28f1d2;hb=06b9e52b8e4c071a2846fdf9931e48b640230cff;hp=86b5a2c6f8ddf294702d156939a550f6ac293add;hpb=cfaf579ddfaec5cb9bc5d220eadd212786138f3d;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/auto-inc-dec.c b/gcc/auto-inc-dec.c index 86b5a2c6f8d..3b3006c985f 100644 --- a/gcc/auto-inc-dec.c +++ b/gcc/auto-inc-dec.c @@ -40,12 +40,14 @@ along with GCC; see the file COPYING3. If not see #include "tree-pass.h" #include "df.h" #include "dbgcnt.h" +#include "target.h" /* This pass was originally removed from flow.c. However there is almost nothing that remains of that code. There are (4) basic forms that are matched: + (1) FORM_PRE_ADD a <- b + c ... *a @@ -55,6 +57,9 @@ along with GCC; see the file COPYING3. If not see a <- b ... *(a += c) pre + + + (2) FORM_PRE_INC a += c ... *a @@ -62,18 +67,24 @@ along with GCC; see the file COPYING3. If not see becomes *(a += c) pre + + + (3) FORM_POST_ADD *a ... b <- a + c - for this case to be true, b must not be assigned or used between - the *a and the assignment to b. B must also be a Pmode reg. + (For this case to be true, b must not be assigned or used between + the *a and the assignment to b. B must also be a Pmode reg.) becomes b <- a ... *(b += c) post + + + (4) FORM_POST_INC *a ... a <- a + c @@ -99,56 +110,8 @@ along with GCC; see the file COPYING3. If not see The is one special case: if a already had an offset equal to it +- its width and that offset is equal to -c when the increment was before the ref or +c if the increment was after the ref, then if we - can do the combination but switch the pre/post bit. - - (1) FORM_PRE_ADD - - a <- b + c - ... - *(a - c) - - becomes + can do the combination but switch the pre/post bit. */ - a <- b - ... - *(a += c) post - - (2) FORM_PRE_INC - - a += c - ... - *(a - c) - - becomes - - *(a += c) post - - (3) FORM_POST_ADD - - *(a + c) - ... - b <- a + c - - for this case to be true, b must not be assigned or used between - the *a and the assignment to b. B must also be a Pmode reg. - - becomes - - b <- a - ... - *(b += c) pre - - - (4) FORM_POST_INC - - *(a + c) - ... - a <- a + c - - becomes - - *(a += c) pre -*/ #ifdef AUTO_INC_DEC enum form @@ -520,10 +483,10 @@ attempt_change (rtx new_addr, rtx inc_reg) PUT_MODE (mem_tmp, mode); XEXP (mem_tmp, 0) = new_addr; - old_cost = rtx_cost (mem, 0, speed) - + rtx_cost (PATTERN (inc_insn.insn), 0, speed); - new_cost = rtx_cost (mem_tmp, 0, speed); - + old_cost = (rtx_cost (mem, SET, speed) + + rtx_cost (PATTERN (inc_insn.insn), SET, speed)); + new_cost = rtx_cost (mem_tmp, SET, speed); + /* The first item of business is to see if this is profitable. */ if (old_cost < new_cost) { @@ -651,6 +614,7 @@ try_merge (void) /* The width of the mem being accessed. */ int size = GET_MODE_SIZE (GET_MODE (mem)); rtx last_insn = NULL; + enum machine_mode reg_mode = GET_MODE (inc_reg); switch (inc_insn.form) { @@ -705,33 +669,33 @@ try_merge (void) case SIMPLE_PRE_INC: /* ++size */ if (dump_file) fprintf (dump_file, "trying SIMPLE_PRE_INC\n"); - return attempt_change (gen_rtx_PRE_INC (Pmode, inc_reg), inc_reg); + return attempt_change (gen_rtx_PRE_INC (reg_mode, inc_reg), inc_reg); break; case SIMPLE_POST_INC: /* size++ */ if (dump_file) fprintf (dump_file, "trying SIMPLE_POST_INC\n"); - return attempt_change (gen_rtx_POST_INC (Pmode, inc_reg), inc_reg); + return attempt_change (gen_rtx_POST_INC (reg_mode, inc_reg), inc_reg); break; case SIMPLE_PRE_DEC: /* --size */ if (dump_file) fprintf (dump_file, "trying SIMPLE_PRE_DEC\n"); - return attempt_change (gen_rtx_PRE_DEC (Pmode, inc_reg), inc_reg); + return attempt_change (gen_rtx_PRE_DEC (reg_mode, inc_reg), inc_reg); break; case SIMPLE_POST_DEC: /* size-- */ if (dump_file) fprintf (dump_file, "trying SIMPLE_POST_DEC\n"); - return attempt_change (gen_rtx_POST_DEC (Pmode, inc_reg), inc_reg); + return attempt_change (gen_rtx_POST_DEC (reg_mode, inc_reg), inc_reg); break; case DISP_PRE: /* ++con */ if (dump_file) fprintf (dump_file, "trying DISP_PRE\n"); - return attempt_change (gen_rtx_PRE_MODIFY (Pmode, + return attempt_change (gen_rtx_PRE_MODIFY (reg_mode, inc_reg, - gen_rtx_PLUS (Pmode, + gen_rtx_PLUS (reg_mode, inc_reg, inc_insn.reg1)), inc_reg); @@ -740,9 +704,9 @@ try_merge (void) case DISP_POST: /* con++ */ if (dump_file) fprintf (dump_file, "trying POST_DISP\n"); - return attempt_change (gen_rtx_POST_MODIFY (Pmode, + return attempt_change (gen_rtx_POST_MODIFY (reg_mode, inc_reg, - gen_rtx_PLUS (Pmode, + gen_rtx_PLUS (reg_mode, inc_reg, inc_insn.reg1)), inc_reg); @@ -751,9 +715,9 @@ try_merge (void) case REG_PRE: /* ++reg */ if (dump_file) fprintf (dump_file, "trying PRE_REG\n"); - return attempt_change (gen_rtx_PRE_MODIFY (Pmode, + return attempt_change (gen_rtx_PRE_MODIFY (reg_mode, inc_reg, - gen_rtx_PLUS (Pmode, + gen_rtx_PLUS (reg_mode, inc_reg, inc_insn.reg1)), inc_reg); @@ -762,9 +726,9 @@ try_merge (void) case REG_POST: /* reg++ */ if (dump_file) fprintf (dump_file, "trying POST_REG\n"); - return attempt_change (gen_rtx_POST_MODIFY (Pmode, + return attempt_change (gen_rtx_POST_MODIFY (reg_mode, inc_reg, - gen_rtx_PLUS (Pmode, + gen_rtx_PLUS (reg_mode, inc_reg, inc_insn.reg1)), inc_reg); @@ -851,7 +815,7 @@ parse_add_or_inc (rtx insn, bool before_mem) else inc_insn.form = before_mem ? FORM_PRE_ADD : FORM_POST_ADD; - if (GET_CODE (XEXP (SET_SRC (pat), 1)) == CONST_INT) + if (CONST_INT_P (XEXP (SET_SRC (pat), 1))) { /* Process a = b + c where c is a const. */ inc_insn.reg1_is_const = true; @@ -929,7 +893,7 @@ find_address (rtx *address_of_x) mem_insn.reg0 = inc_insn.reg_res; mem_insn.reg1 = b; mem_insn.reg1_is_const = inc_insn.reg1_is_const; - if (GET_CODE (b) == CONST_INT) + if (CONST_INT_P (b)) { /* Match with *(reg0 + reg1) where reg1 is a const. */ HOST_WIDE_INT val = INTVAL (b); @@ -1127,7 +1091,9 @@ find_inc (bool first_try) we are going to increment the result of the add insn. For this trick to be correct, the result reg of the inc must be a valid addressing reg. */ - if (GET_MODE (inc_insn.reg_res) != Pmode) + addr_space_t as = MEM_ADDR_SPACE (*mem_insn.mem_loc); + if (GET_MODE (inc_insn.reg_res) + != targetm.addr_space.address_mode (as)) { if (dump_file) fprintf (dump_file, "base reg mode failure.\n"); @@ -1176,7 +1142,9 @@ find_inc (bool first_try) { /* For this trick to be correct, the result reg of the inc must be a valid addressing reg. */ - if (GET_MODE (inc_insn.reg_res) != Pmode) + addr_space_t as = MEM_ADDR_SPACE (*mem_insn.mem_loc); + if (GET_MODE (inc_insn.reg_res) + != targetm.addr_space.address_mode (as)) { if (dump_file) fprintf (dump_file, "base reg mode failure.\n"); @@ -1317,7 +1285,7 @@ find_mem (rtx *address_of_x) mem_insn.mem_loc = address_of_x; mem_insn.reg0 = XEXP (XEXP (x, 0), 0); mem_insn.reg1 = reg1; - if (GET_CODE (reg1) == CONST_INT) + if (CONST_INT_P (reg1)) { mem_insn.reg1_is_const = true; /* Match with *(reg0 + c) where c is a const. */ @@ -1379,7 +1347,7 @@ merge_in_block (int max_reg, basic_block bb) unsigned int uid = INSN_UID (insn); bool insn_is_add_or_inc = true; - if (!INSN_P (insn)) + if (!NONDEBUG_INSN_P (insn)) continue; /* This continue is deliberate. We do not want the uses of the @@ -1452,7 +1420,7 @@ merge_in_block (int max_reg, basic_block bb) /* If the inc insn was merged with a mem, the inc insn is gone and there is noting to update. */ - if (DF_INSN_UID_GET(uid)) + if (DF_INSN_UID_GET (uid)) { df_ref *def_rec; df_ref *use_rec; @@ -1559,4 +1527,3 @@ struct rtl_opt_pass pass_inc_dec = TODO_df_finish, /* todo_flags_finish */ } }; -