Index: gcc/gcc/auto-inc-dec.c |
diff --git a/gcc/gcc/auto-inc-dec.c b/gcc/gcc/auto-inc-dec.c |
index 86b5a2c6f8ddf294702d156939a550f6ac293add..6b5c3adecbf947a4a99a2730504f16acffb089f4 100644 |
--- a/gcc/gcc/auto-inc-dec.c |
+++ b/gcc/gcc/auto-inc-dec.c |
@@ -1,7 +1,7 @@ |
/* Discovery of auto-inc and auto-dec instructions. |
- Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc. |
+ Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
Contributed by Kenneth Zadeck <zadeck@naturalbridge.com> |
- |
+ |
This file is part of GCC. |
GCC is free software; you can redistribute it and/or modify it under |
@@ -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 |
@@ -93,62 +104,14 @@ along with GCC; see the file COPYING3. If not see |
by the pointer. This is useful for machines that have |
HAVE_PRE_MODIFY_DISP, HAVE_POST_MODIFY_DISP defined. |
- 3) c is a register. This is useful for machines that have |
- HAVE_PRE_MODIFY_REG, HAVE_POST_MODIFY_REG |
- |
+ 3) c is a register. This is useful for machines that have |
+ HAVE_PRE_MODIFY_REG, HAVE_POST_MODIFY_REG |
+ |
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 |
- |
- a <- b |
- ... |
- *(a += c) post |
- |
- (2) FORM_PRE_INC |
- |
- a += c |
- ... |
- *(a - c) |
+ can do the combination but switch the pre/post bit. */ |
- 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 |
@@ -166,7 +129,7 @@ enum form |
ANY is used for constants that are not +-size or 0. REG is used if |
the forms are reg1 + reg2. */ |
-enum inc_state |
+enum inc_state |
{ |
INC_ZERO, /* == 0 */ |
INC_NEG_SIZE, /* == +size */ |
@@ -332,7 +295,7 @@ init_decision_table (void) |
/* Parsed fields of an inc insn of the form "reg_res = reg0+reg1" or |
"reg_res = reg0+c". */ |
-static struct inc_insn |
+static struct inc_insn |
{ |
rtx insn; /* The insn being parsed. */ |
rtx pat; /* The pattern of the insn. */ |
@@ -348,10 +311,10 @@ static struct inc_insn |
/* Dump the parsed inc insn to FILE. */ |
-static void |
+static void |
dump_inc_insn (FILE *file) |
{ |
- const char *f = ((inc_insn.form == FORM_PRE_ADD) |
+ const char *f = ((inc_insn.form == FORM_PRE_ADD) |
|| (inc_insn.form == FORM_PRE_INC)) ? "pre" : "post"; |
dump_insn_slim (file, inc_insn.insn); |
@@ -361,26 +324,26 @@ dump_inc_insn (FILE *file) |
case FORM_PRE_ADD: |
case FORM_POST_ADD: |
if (inc_insn.reg1_is_const) |
- fprintf (file, "found %s add(%d) r[%d]=r[%d]+%d\n", |
- f, INSN_UID (inc_insn.insn), |
- REGNO (inc_insn.reg_res), |
+ fprintf (file, "found %s add(%d) r[%d]=r[%d]+%d\n", |
+ f, INSN_UID (inc_insn.insn), |
+ REGNO (inc_insn.reg_res), |
REGNO (inc_insn.reg0), (int) inc_insn.reg1_val); |
else |
- fprintf (file, "found %s add(%d) r[%d]=r[%d]+r[%d]\n", |
- f, INSN_UID (inc_insn.insn), |
- REGNO (inc_insn.reg_res), |
+ fprintf (file, "found %s add(%d) r[%d]=r[%d]+r[%d]\n", |
+ f, INSN_UID (inc_insn.insn), |
+ REGNO (inc_insn.reg_res), |
REGNO (inc_insn.reg0), REGNO (inc_insn.reg1)); |
break; |
- |
+ |
case FORM_PRE_INC: |
case FORM_POST_INC: |
if (inc_insn.reg1_is_const) |
- fprintf (file, "found %s inc(%d) r[%d]+=%d\n", |
- f, INSN_UID (inc_insn.insn), |
+ fprintf (file, "found %s inc(%d) r[%d]+=%d\n", |
+ f, INSN_UID (inc_insn.insn), |
REGNO (inc_insn.reg_res), (int) inc_insn.reg1_val); |
else |
- fprintf (file, "found %s inc(%d) r[%d]+=r[%d]\n", |
- f, INSN_UID (inc_insn.insn), |
+ fprintf (file, "found %s inc(%d) r[%d]+=r[%d]\n", |
+ f, INSN_UID (inc_insn.insn), |
REGNO (inc_insn.reg_res), REGNO (inc_insn.reg1)); |
break; |
@@ -409,18 +372,18 @@ static struct mem_insn |
/* Dump the parsed mem insn to FILE. */ |
-static void |
+static void |
dump_mem_insn (FILE *file) |
{ |
dump_insn_slim (file, mem_insn.insn); |
if (mem_insn.reg1_is_const) |
- fprintf (file, "found mem(%d) *(r[%d]+%d)\n", |
- INSN_UID (mem_insn.insn), |
+ fprintf (file, "found mem(%d) *(r[%d]+%d)\n", |
+ INSN_UID (mem_insn.insn), |
REGNO (mem_insn.reg0), (int) mem_insn.reg1_val); |
else |
- fprintf (file, "found mem(%d) *(r[%d]+r[%d])\n", |
- INSN_UID (mem_insn.insn), |
+ fprintf (file, "found mem(%d) *(r[%d]+r[%d])\n", |
+ INSN_UID (mem_insn.insn), |
REGNO (mem_insn.reg0), REGNO (mem_insn.reg1)); |
} |
@@ -446,17 +409,17 @@ static rtx *reg_next_def = NULL; |
insn. Moving the REG_EQUAL and REG_EQUIV is clearly wrong and it |
does not appear that there are any other kinds of relevant notes. */ |
-static void |
+static void |
move_dead_notes (rtx to_insn, rtx from_insn, rtx pattern) |
{ |
- rtx note; |
+ rtx note; |
rtx next_note; |
rtx prev_note = NULL; |
for (note = REG_NOTES (from_insn); note; note = next_note) |
{ |
next_note = XEXP (note, 1); |
- |
+ |
if ((REG_NOTE_KIND (note) == REG_DEAD) |
&& pattern == XEXP (note, 0)) |
{ |
@@ -488,7 +451,7 @@ insert_move_insn_before (rtx next_insn, rtx dest_reg, rtx src_reg) |
return insns; |
} |
- |
+ |
/* Change mem_insn.mem_loc so that uses NEW_ADDR which has an |
increment of INC_REG. To have reached this point, the change is a |
legitimate one from a dataflow point of view. The only questions |
@@ -507,7 +470,7 @@ attempt_change (rtx new_addr, rtx inc_reg) |
passes are for. The two cases where we have an inc insn will be |
handled mov free. */ |
- basic_block bb = BASIC_BLOCK (BLOCK_NUM (mem_insn.insn)); |
+ basic_block bb = BLOCK_FOR_INSN (mem_insn.insn); |
rtx mov_insn = NULL; |
int regno; |
rtx mem = *mem_insn.mem_loc; |
@@ -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) |
{ |
@@ -541,7 +504,7 @@ attempt_change (rtx new_addr, rtx inc_reg) |
if (! validate_change (mem_insn.insn, mem_insn.mem_loc, new_mem, 0)) |
{ |
if (dump_file) |
- fprintf (dump_file, "validation failure\n"); |
+ fprintf (dump_file, "validation failure\n"); |
return false; |
} |
@@ -554,7 +517,7 @@ attempt_change (rtx new_addr, rtx inc_reg) |
/* Replace the addition with a move. Do it at the location of |
the addition since the operand of the addition may change |
before the memory reference. */ |
- mov_insn = insert_move_insn_before (inc_insn.insn, |
+ mov_insn = insert_move_insn_before (inc_insn.insn, |
inc_insn.reg_res, inc_insn.reg0); |
move_dead_notes (mov_insn, inc_insn.insn, inc_insn.reg0); |
@@ -580,7 +543,7 @@ attempt_change (rtx new_addr, rtx inc_reg) |
break; |
case FORM_POST_ADD: |
- mov_insn = insert_move_insn_before (mem_insn.insn, |
+ mov_insn = insert_move_insn_before (mem_insn.insn, |
inc_insn.reg_res, inc_insn.reg0); |
move_dead_notes (mov_insn, inc_insn.insn, inc_insn.reg0); |
@@ -640,7 +603,7 @@ attempt_change (rtx new_addr, rtx inc_reg) |
Assuming the form is ok, a prototype new address is built which is |
passed to ATTEMPT_CHANGE for final processing. */ |
-static bool |
+static bool |
try_merge (void) |
{ |
enum gen_form gen_form; |
@@ -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) |
{ |
@@ -684,13 +648,13 @@ try_merge (void) |
return false; |
} |
- mem_insn.reg1_state = (mem_insn.reg1_is_const) |
+ mem_insn.reg1_state = (mem_insn.reg1_is_const) |
? set_inc_state (mem_insn.reg1_val, size) : INC_REG; |
inc_insn.reg1_state = (inc_insn.reg1_is_const) |
? set_inc_state (inc_insn.reg1_val, size) : INC_REG; |
/* Now get the form that we are generating. */ |
- gen_form = decision_table |
+ gen_form = decision_table |
[inc_insn.reg1_state][mem_insn.reg1_state][inc_insn.form]; |
if (dbg_cnt (auto_inc_dec) == false) |
@@ -705,66 +669,66 @@ 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); |
break; |
- |
+ |
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); |
break; |
- |
+ |
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); |
break; |
- |
+ |
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); |
@@ -782,7 +746,7 @@ get_next_ref (int regno, basic_block bb, rtx *next_array) |
rtx insn = next_array[regno]; |
/* Lazy about cleaning out the next_arrays. */ |
- if (insn && BASIC_BLOCK (BLOCK_NUM (insn)) != bb) |
+ if (insn && BLOCK_FOR_INSN (insn) != bb) |
{ |
next_array[regno] = NULL; |
insn = NULL; |
@@ -794,10 +758,10 @@ get_next_ref (int regno, basic_block bb, rtx *next_array) |
/* Reverse the operands in a mem insn. */ |
-static void |
+static void |
reverse_mem (void) |
{ |
- rtx tmp = mem_insn.reg1; |
+ rtx tmp = mem_insn.reg1; |
mem_insn.reg1 = mem_insn.reg0; |
mem_insn.reg0 = tmp; |
} |
@@ -805,10 +769,10 @@ reverse_mem (void) |
/* Reverse the operands in a inc insn. */ |
-static void |
+static void |
reverse_inc (void) |
{ |
- rtx tmp = inc_insn.reg1; |
+ rtx tmp = inc_insn.reg1; |
inc_insn.reg1 = inc_insn.reg0; |
inc_insn.reg0 = tmp; |
} |
@@ -816,8 +780,8 @@ reverse_inc (void) |
/* Return true if INSN is of a form "a = b op c" where a and b are |
regs. op is + if c is a reg and +|- if c is a const. Fill in |
- INC_INSN with what is found. |
- |
+ INC_INSN with what is found. |
+ |
This function is called in two contexts, if BEFORE_MEM is true, |
this is called for each insn in the basic block. If BEFORE_MEM is |
false, it is called for the instruction in the block that uses the |
@@ -848,10 +812,10 @@ parse_add_or_inc (rtx insn, bool before_mem) |
inc_insn.reg0 = XEXP (SET_SRC (pat), 0); |
if (rtx_equal_p (inc_insn.reg_res, inc_insn.reg0)) |
inc_insn.form = before_mem ? FORM_PRE_INC : FORM_POST_INC; |
- else |
+ 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; |
@@ -874,8 +838,8 @@ parse_add_or_inc (rtx insn, bool before_mem) |
/* Process a = b + c where c is a reg. */ |
inc_insn.reg1 = XEXP (SET_SRC (pat), 1); |
inc_insn.reg1_is_const = false; |
- |
- if (inc_insn.form == FORM_PRE_INC |
+ |
+ if (inc_insn.form == FORM_PRE_INC |
|| inc_insn.form == FORM_POST_INC) |
return true; |
else if (rtx_equal_p (inc_insn.reg_res, inc_insn.reg1)) |
@@ -886,7 +850,7 @@ parse_add_or_inc (rtx insn, bool before_mem) |
inc_insn.form = before_mem ? FORM_PRE_INC : FORM_POST_INC; |
return true; |
} |
- else |
+ else |
return true; |
} |
@@ -898,7 +862,7 @@ parse_add_or_inc (rtx insn, bool before_mem) |
ADDRESS_OF_X to see if any single one of them is compatible with |
what has been found in inc_insn. |
- -1 is returned for success. 0 is returned if nothing was found and |
+ -1 is returned for success. 0 is returned if nothing was found and |
1 is returned for failure. */ |
static int |
@@ -929,19 +893,19 @@ 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); |
- if (inc_insn.reg1_is_const |
+ if (inc_insn.reg1_is_const |
&& (inc_insn.reg1_val == val || inc_insn.reg1_val == -val)) |
{ |
mem_insn.reg1_val = val; |
return -1; |
} |
} |
- else if (!inc_insn.reg1_is_const |
- && rtx_equal_p (inc_insn.reg1, b)) |
+ else if (!inc_insn.reg1_is_const |
+ && rtx_equal_p (inc_insn.reg1, b)) |
/* Match with *(reg0 + reg1). */ |
return -1; |
} |
@@ -1001,11 +965,11 @@ find_address (rtx *address_of_x) |
add of the second register. The FIRST_TRY parameter is used to |
only allow the parameters to be reversed once. */ |
-static bool |
+static bool |
find_inc (bool first_try) |
{ |
rtx insn; |
- basic_block bb = BASIC_BLOCK (BLOCK_NUM (mem_insn.insn)); |
+ basic_block bb = BLOCK_FOR_INSN (mem_insn.insn); |
rtx other_insn; |
df_ref *def_rec; |
@@ -1013,7 +977,7 @@ find_inc (bool first_try) |
if (count_occurrences (PATTERN (mem_insn.insn), mem_insn.reg0, 1) != 1) |
{ |
if (dump_file) |
- fprintf (dump_file, "mem count failure\n"); |
+ fprintf (dump_file, "mem count failure\n"); |
return false; |
} |
@@ -1021,8 +985,8 @@ find_inc (bool first_try) |
dump_mem_insn (dump_file); |
/* Find the next use that is an inc. */ |
- insn = get_next_ref (REGNO (mem_insn.reg0), |
- BASIC_BLOCK (BLOCK_NUM (mem_insn.insn)), |
+ insn = get_next_ref (REGNO (mem_insn.reg0), |
+ BLOCK_FOR_INSN (mem_insn.insn), |
reg_next_inc_use); |
if (!insn) |
return false; |
@@ -1033,11 +997,11 @@ find_inc (bool first_try) |
{ |
/* Next use was not an add. Look for one extra case. It could be |
that we have: |
- |
+ |
*(a + b) |
...= a; |
...= b + a |
- |
+ |
if we reverse the operands in the mem ref we would |
find this. Only try it once though. */ |
if (first_try && !mem_insn.reg1_is_const) |
@@ -1049,13 +1013,13 @@ find_inc (bool first_try) |
return false; |
} |
- /* Need to assure that none of the operands of the inc instruction are |
+ /* Need to assure that none of the operands of the inc instruction are |
assigned to by the mem insn. */ |
for (def_rec = DF_INSN_DEFS (mem_insn.insn); *def_rec; def_rec++) |
{ |
df_ref def = *def_rec; |
unsigned int regno = DF_REF_REGNO (def); |
- if ((regno == REGNO (inc_insn.reg0)) |
+ if ((regno == REGNO (inc_insn.reg0)) |
|| (regno == REGNO (inc_insn.reg_res))) |
{ |
if (dump_file) |
@@ -1077,26 +1041,26 @@ find_inc (bool first_try) |
{ |
/* Make sure that there is no insn that assigns to inc_insn.res |
between the mem_insn and the inc_insn. */ |
- rtx other_insn = get_next_ref (REGNO (inc_insn.reg_res), |
- BASIC_BLOCK (BLOCK_NUM (mem_insn.insn)), |
+ rtx other_insn = get_next_ref (REGNO (inc_insn.reg_res), |
+ BLOCK_FOR_INSN (mem_insn.insn), |
reg_next_def); |
if (other_insn != inc_insn.insn) |
{ |
if (dump_file) |
- fprintf (dump_file, |
+ fprintf (dump_file, |
"result of add is assigned to between mem and inc insns.\n"); |
return false; |
} |
- other_insn = get_next_ref (REGNO (inc_insn.reg_res), |
- BASIC_BLOCK (BLOCK_NUM (mem_insn.insn)), |
+ other_insn = get_next_ref (REGNO (inc_insn.reg_res), |
+ BLOCK_FOR_INSN (mem_insn.insn), |
reg_next_use); |
- if (other_insn |
+ if (other_insn |
&& (other_insn != inc_insn.insn) |
&& (DF_INSN_LUID (inc_insn.insn) > DF_INSN_LUID (other_insn))) |
{ |
if (dump_file) |
- fprintf (dump_file, |
+ fprintf (dump_file, |
"result of add is used between mem and inc insns.\n"); |
return false; |
} |
@@ -1123,11 +1087,13 @@ find_inc (bool first_try) |
int luid = DF_INSN_LUID (inc_insn.insn); |
if (inc_insn.form == FORM_POST_ADD) |
{ |
- /* The trick is that we are not going to increment r0, |
+ /* The trick is that we are not going to increment r0, |
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"); |
@@ -1136,16 +1102,16 @@ find_inc (bool first_try) |
/* We also need to make sure that the next use of |
inc result is after the inc. */ |
- other_insn |
+ other_insn |
= get_next_ref (REGNO (inc_insn.reg1), bb, reg_next_use); |
if (other_insn && luid > DF_INSN_LUID (other_insn)) |
return false; |
if (!rtx_equal_p (mem_insn.reg0, inc_insn.reg0)) |
- reverse_inc (); |
+ reverse_inc (); |
} |
- other_insn |
+ other_insn |
= get_next_ref (REGNO (inc_insn.reg1), bb, reg_next_def); |
if (other_insn && luid > DF_INSN_LUID (other_insn)) |
return false; |
@@ -1164,19 +1130,21 @@ find_inc (bool first_try) |
need to treat it as if it was *(b + a). It may also be that |
the add is of the form a + c where c does not match b and |
then we just abandon this. */ |
- |
+ |
int luid = DF_INSN_LUID (inc_insn.insn); |
rtx other_insn; |
- |
+ |
/* Make sure this reg appears only once in this insn. */ |
if (count_occurrences (PATTERN (mem_insn.insn), mem_insn.reg1, 1) != 1) |
return false; |
- |
+ |
if (inc_insn.form == FORM_POST_ADD) |
{ |
/* 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"); |
@@ -1199,7 +1167,7 @@ find_inc (bool first_try) |
/* Need to check that there are no assignments to b |
before the add insn. */ |
- other_insn |
+ other_insn |
= get_next_ref (REGNO (inc_insn.reg1), bb, reg_next_def); |
if (other_insn && luid > DF_INSN_LUID (other_insn)) |
return false; |
@@ -1220,14 +1188,14 @@ find_inc (bool first_try) |
} |
/* To have gotten here know that. |
*(b + a) |
- |
+ |
... = (b + a) |
- |
+ |
We also know that the lhs of the inc is not b or a. We |
need to make sure that there are no assignments to b |
- between the mem ref and the inc. */ |
- |
- other_insn |
+ between the mem ref and the inc. */ |
+ |
+ other_insn |
= get_next_ref (REGNO (inc_insn.reg0), bb, reg_next_def); |
if (other_insn && luid > DF_INSN_LUID (other_insn)) |
return false; |
@@ -1235,13 +1203,13 @@ find_inc (bool first_try) |
/* Need to check that the next use of the add result is later than |
add insn since this will be the reg incremented. */ |
- other_insn |
+ other_insn |
= get_next_ref (REGNO (inc_insn.reg_res), bb, reg_next_use); |
if (other_insn && luid > DF_INSN_LUID (other_insn)) |
return false; |
} |
else /* FORM_POST_INC. There is less to check here because we |
- know that operands must line up. */ |
+ know that operands must line up. */ |
{ |
if (!rtx_equal_p (mem_insn.reg1, inc_insn.reg1)) |
/* See comment above on find_inc (false) call. */ |
@@ -1251,19 +1219,19 @@ find_inc (bool first_try) |
reverse_mem (); |
return find_inc (false); |
} |
- else |
+ else |
return false; |
} |
- |
+ |
/* To have gotten here know that. |
*(a + b) |
- |
+ |
... = (a + b) |
- |
+ |
We also know that the lhs of the inc is not b. We need to make |
sure that there are no assignments to b between the mem ref and |
the inc. */ |
- other_insn |
+ other_insn |
= get_next_ref (REGNO (inc_insn.reg1), bb, reg_next_def); |
if (other_insn && luid > DF_INSN_LUID (other_insn)) |
return false; |
@@ -1272,7 +1240,7 @@ find_inc (bool first_try) |
if (inc_insn.form == FORM_POST_INC) |
{ |
- other_insn |
+ other_insn |
= get_next_ref (REGNO (inc_insn.reg0), bb, reg_next_use); |
/* When we found inc_insn, we were looking for the |
next add or inc, not the next insn that used the |
@@ -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,11 +1347,11 @@ 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)) |
- continue; |
+ if (!NONDEBUG_INSN_P (insn)) |
+ continue; |
/* This continue is deliberate. We do not want the uses of the |
- jump put into reg_next_use because it is not considered safe to |
+ jump put into reg_next_use because it is not considered safe to |
combine a preincrement with a jump. */ |
if (JUMP_P (insn)) |
continue; |
@@ -1413,22 +1381,22 @@ merge_in_block (int max_reg, basic_block bb) |
clear of c because the inc insn is going to move |
into the mem_insn.insn. */ |
int luid = DF_INSN_LUID (mem_insn.insn); |
- rtx other_insn |
+ rtx other_insn |
= get_next_ref (REGNO (inc_insn.reg1), bb, reg_next_use); |
- |
+ |
if (other_insn && luid > DF_INSN_LUID (other_insn)) |
ok = false; |
- |
- other_insn |
+ |
+ other_insn |
= get_next_ref (REGNO (inc_insn.reg1), bb, reg_next_def); |
- |
+ |
if (other_insn && luid > DF_INSN_LUID (other_insn)) |
ok = false; |
} |
- |
+ |
if (dump_file) |
dump_inc_insn (dump_file); |
- |
+ |
if (ok && find_address (&PATTERN (mem_insn.insn)) == -1) |
{ |
if (dump_file) |
@@ -1449,10 +1417,10 @@ merge_in_block (int max_reg, basic_block bb) |
if (find_mem (&PATTERN (insn))) |
success_in_block++; |
} |
- |
+ |
/* 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; |
@@ -1464,7 +1432,7 @@ merge_in_block (int max_reg, basic_block bb) |
reg_next_inc_use[DF_REF_REGNO (def)] = NULL; |
reg_next_def[DF_REF_REGNO (def)] = insn; |
} |
- |
+ |
for (use_rec = DF_INSN_UID_USES (uid); *use_rec; use_rec++) |
{ |
df_ref use = *use_rec; |
@@ -1473,7 +1441,7 @@ merge_in_block (int max_reg, basic_block bb) |
reg_next_inc_use[DF_REF_REGNO (use)] = insn; |
else |
reg_next_inc_use[DF_REF_REGNO (use)] = NULL; |
- } |
+ } |
} |
else if (dump_file) |
fprintf (dump_file, "skipping update of deleted insn %d\n", uid); |
@@ -1496,7 +1464,7 @@ merge_in_block (int max_reg, basic_block bb) |
#endif |
-static unsigned int |
+static unsigned int |
rest_of_handle_auto_inc_dec (void) |
{ |
#ifdef AUTO_INC_DEC |
@@ -1555,8 +1523,7 @@ struct rtl_opt_pass pass_inc_dec = |
0, /* properties_provided */ |
0, /* properties_destroyed */ |
0, /* todo_flags_start */ |
- TODO_dump_func | |
+ TODO_dump_func | |
TODO_df_finish, /* todo_flags_finish */ |
} |
}; |
- |