diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-06-01 16:08:48 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-06-01 16:08:48 +0000 |
commit | 236e4c9e88484d1fd03379202c89488b6c5eda69 (patch) | |
tree | 292335cf2143a85c415d5ac3ef795e01360c4822 /gcc/var-tracking.c | |
parent | 43ae76031e46dc0677c05c19c8b0b6511858c11a (diff) | |
download | gcc-236e4c9e88484d1fd03379202c89488b6c5eda69.tar.gz |
* var-tracking.c (create_entry_value): New function.
(vt_add_function_parameter): Use it.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@174534 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/var-tracking.c')
-rw-r--r-- | gcc/var-tracking.c | 87 |
1 files changed, 36 insertions, 51 deletions
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index f761234ed08..db261c0f03d 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -8378,6 +8378,39 @@ vt_get_decl_and_offset (rtx rtl, tree *declp, HOST_WIDE_INT *offsetp) return false; } +/* Helper function for vt_add_function_parameter. RTL is + the expression and VAL corresponding cselib_val pointer + for which ENTRY_VALUE should be created. */ + +static void +create_entry_value (rtx rtl, cselib_val *val) +{ + cselib_val *val2; + struct elt_loc_list *el; + el = (struct elt_loc_list *) ggc_alloc_cleared_atomic (sizeof (*el)); + el->next = val->locs; + el->loc = gen_rtx_ENTRY_VALUE (GET_MODE (rtl)); + ENTRY_VALUE_EXP (el->loc) = rtl; + el->setting_insn = get_insns (); + val->locs = el; + val2 = cselib_lookup_from_insn (el->loc, GET_MODE (rtl), true, + VOIDmode, get_insns ()); + if (val2 + && val2 != val + && val2->locs + && rtx_equal_p (val2->locs->loc, el->loc)) + { + struct elt_loc_list *el2; + + preserve_value (val2); + el2 = (struct elt_loc_list *) ggc_alloc_cleared_atomic (sizeof (*el2)); + el2->next = val2->locs; + el2->loc = val->val_rtx; + el2->setting_insn = get_insns (); + val2->locs = el2; + } +} + /* Insert function parameter PARM in IN and OUT sets of ENTRY_BLOCK. */ static void @@ -8501,32 +8534,8 @@ vt_add_function_parameter (tree parm) VAR_INIT_STATUS_INITIALIZED, NULL, INSERT); if (dv_is_value_p (dv)) { - cselib_val *val = CSELIB_VAL_PTR (dv_as_value (dv)), *val2; - struct elt_loc_list *el; - el = (struct elt_loc_list *) - ggc_alloc_cleared_atomic (sizeof (*el)); - el->next = val->locs; - el->loc = gen_rtx_ENTRY_VALUE (GET_MODE (incoming)); - ENTRY_VALUE_EXP (el->loc) = incoming; - el->setting_insn = get_insns (); - val->locs = el; - val2 = cselib_lookup_from_insn (el->loc, GET_MODE (incoming), - true, VOIDmode, get_insns ()); - if (val2 - && val2 != val - && val2->locs - && rtx_equal_p (val2->locs->loc, el->loc)) - { - struct elt_loc_list *el2; - - preserve_value (val2); - el2 = (struct elt_loc_list *) - ggc_alloc_cleared_atomic (sizeof (*el2)); - el2->next = val2->locs; - el2->loc = dv_as_value (dv); - el2->setting_insn = get_insns (); - val2->locs = el2; - } + cselib_val *val = CSELIB_VAL_PTR (dv_as_value (dv)); + create_entry_value (incoming, val); if (TREE_CODE (TREE_TYPE (parm)) == REFERENCE_TYPE && INTEGRAL_TYPE_P (TREE_TYPE (TREE_TYPE (parm)))) { @@ -8538,31 +8547,7 @@ vt_add_function_parameter (tree parm) if (val) { preserve_value (val); - el = (struct elt_loc_list *) - ggc_alloc_cleared_atomic (sizeof (*el)); - el->next = val->locs; - el->loc = gen_rtx_ENTRY_VALUE (indmode); - ENTRY_VALUE_EXP (el->loc) = mem; - el->setting_insn = get_insns (); - val->locs = el; - val2 = cselib_lookup_from_insn (el->loc, GET_MODE (mem), - true, VOIDmode, - get_insns ()); - if (val2 - && val2 != val - && val2->locs - && rtx_equal_p (val2->locs->loc, el->loc)) - { - struct elt_loc_list *el2; - - preserve_value (val2); - el2 = (struct elt_loc_list *) - ggc_alloc_cleared_atomic (sizeof (*el2)); - el2->next = val2->locs; - el2->loc = val->val_rtx; - el2->setting_insn = get_insns (); - val2->locs = el2; - } + create_entry_value (mem, val); } } } |