diff options
author | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-09-30 08:04:32 +0000 |
---|---|---|
committer | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-09-30 08:04:32 +0000 |
commit | d02274e660aa88a0f1750798c21e8df6125f31e6 (patch) | |
tree | f4c9f1d2c838c3e2c542cc98b20aed91a2457ea4 /gcc/ira-build.c | |
parent | c76141f619ced6c2887182c80f0867471c5b8090 (diff) | |
download | gcc-d02274e660aa88a0f1750798c21e8df6125f31e6.tar.gz |
gcc/
2014-09-26 David Sherwood <david.sherwood@arm.com>
* ira-int.h (ira_allocno): Add "wmode" field.
* ira-build.c (create_insn_allocnos): Add new "parent" function
parameter.
* ira-conflicts.c (ira_build_conflicts): Add conflicts for registers
that cannot be accessed in wmode.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@215707 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ira-build.c')
-rw-r--r-- | gcc/ira-build.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/gcc/ira-build.c b/gcc/ira-build.c index 3f2ab17fd82..9c9916683ef 100644 --- a/gcc/ira-build.c +++ b/gcc/ira-build.c @@ -524,6 +524,7 @@ ira_create_allocno (int regno, bool cap_p, ALLOCNO_BAD_SPILL_P (a) = false; ALLOCNO_ASSIGNED_P (a) = false; ALLOCNO_MODE (a) = (regno < 0 ? VOIDmode : PSEUDO_REGNO_MODE (regno)); + ALLOCNO_WMODE (a) = ALLOCNO_MODE (a); ALLOCNO_PREFS (a) = NULL; ALLOCNO_COPIES (a) = NULL; ALLOCNO_HARD_REG_COSTS (a) = NULL; @@ -893,6 +894,7 @@ create_cap_allocno (ira_allocno_t a) parent = ALLOCNO_LOOP_TREE_NODE (a)->parent; cap = ira_create_allocno (ALLOCNO_REGNO (a), true, parent); ALLOCNO_MODE (cap) = ALLOCNO_MODE (a); + ALLOCNO_WMODE (cap) = ALLOCNO_WMODE (a); aclass = ALLOCNO_CLASS (a); ira_set_allocno_class (cap, aclass); ira_create_allocno_objects (cap); @@ -1859,9 +1861,9 @@ static basic_block curr_bb; /* This recursive function creates allocnos corresponding to pseudo-registers containing in X. True OUTPUT_P means that X is - a lvalue. */ + an lvalue. PARENT corresponds to the parent expression of X. */ static void -create_insn_allocnos (rtx x, bool output_p) +create_insn_allocnos (rtx x, rtx outer, bool output_p) { int i, j; const char *fmt; @@ -1876,7 +1878,15 @@ create_insn_allocnos (rtx x, bool output_p) ira_allocno_t a; if ((a = ira_curr_regno_allocno_map[regno]) == NULL) - a = ira_create_allocno (regno, false, ira_curr_loop_tree_node); + { + a = ira_create_allocno (regno, false, ira_curr_loop_tree_node); + if (outer != NULL && GET_CODE (outer) == SUBREG) + { + enum machine_mode wmode = GET_MODE (outer); + if (GET_MODE_SIZE (wmode) > GET_MODE_SIZE (ALLOCNO_WMODE (a))) + ALLOCNO_WMODE (a) = wmode; + } + } ALLOCNO_NREFS (a)++; ALLOCNO_FREQ (a) += REG_FREQ_FROM_BB (curr_bb); @@ -1887,25 +1897,25 @@ create_insn_allocnos (rtx x, bool output_p) } else if (code == SET) { - create_insn_allocnos (SET_DEST (x), true); - create_insn_allocnos (SET_SRC (x), false); + create_insn_allocnos (SET_DEST (x), NULL, true); + create_insn_allocnos (SET_SRC (x), NULL, false); return; } else if (code == CLOBBER) { - create_insn_allocnos (XEXP (x, 0), true); + create_insn_allocnos (XEXP (x, 0), NULL, true); return; } else if (code == MEM) { - create_insn_allocnos (XEXP (x, 0), false); + create_insn_allocnos (XEXP (x, 0), NULL, false); return; } else if (code == PRE_DEC || code == POST_DEC || code == PRE_INC || code == POST_INC || code == POST_MODIFY || code == PRE_MODIFY) { - create_insn_allocnos (XEXP (x, 0), true); - create_insn_allocnos (XEXP (x, 0), false); + create_insn_allocnos (XEXP (x, 0), NULL, true); + create_insn_allocnos (XEXP (x, 0), NULL, false); return; } @@ -1913,10 +1923,10 @@ create_insn_allocnos (rtx x, bool output_p) for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) { if (fmt[i] == 'e') - create_insn_allocnos (XEXP (x, i), output_p); + create_insn_allocnos (XEXP (x, i), x, output_p); else if (fmt[i] == 'E') for (j = 0; j < XVECLEN (x, i); j++) - create_insn_allocnos (XVECEXP (x, i, j), output_p); + create_insn_allocnos (XVECEXP (x, i, j), x, output_p); } } @@ -1935,7 +1945,7 @@ create_bb_allocnos (ira_loop_tree_node_t bb_node) ira_assert (bb != NULL); FOR_BB_INSNS_REVERSE (bb, insn) if (NONDEBUG_INSN_P (insn)) - create_insn_allocnos (PATTERN (insn), false); + create_insn_allocnos (PATTERN (insn), NULL, false); /* It might be a allocno living through from one subloop to another. */ EXECUTE_IF_SET_IN_REG_SET (df_get_live_in (bb), FIRST_PSEUDO_REGISTER, i, bi) |