diff options
author | Michael Matz <matz@suse.de> | 2008-05-29 20:18:07 +0000 |
---|---|---|
committer | Michael Matz <matz@suse.de> | 2008-05-29 20:18:07 +0000 |
commit | 6c472882f9b2a3dbedd5f8041581af4c7f0b1128 (patch) | |
tree | f2326c8bcf8da1de8dabd56b082ec123ce840630 | |
parent | 9dad0f2fce841e0e6b4a196417f0457dcdfb9052 (diff) |
* var-tracking.c (enum micro_operation_type): Add MO_ASSOC type.
(assoc_reg_set, assoc_mem_set, count_assocs, add_assocs): New
functions.
(compute_bb_dataflow): Use them to remember decl associations.
(emit_notes_in_bb): Deal with new micro ops.
(vt_initialize): Count new micro ops and call add_assocs.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/var-mappings-branch@136187 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog.varmap | 9 | ||||
-rw-r--r-- | gcc/var-tracking.c | 121 |
2 files changed, 127 insertions, 3 deletions
diff --git a/gcc/ChangeLog.varmap b/gcc/ChangeLog.varmap index 2a981d7b3d0..e4effbd4eaa 100644 --- a/gcc/ChangeLog.varmap +++ b/gcc/ChangeLog.varmap @@ -1,5 +1,14 @@ 2008-05-29 Michael Matz <matz@suse.de> + * var-tracking.c (enum micro_operation_type): Add MO_ASSOC type. + (assoc_reg_set, assoc_mem_set, count_assocs, add_assocs): New + functions. + (compute_bb_dataflow): Use them to remember decl associations. + (emit_notes_in_bb): Deal with new micro ops. + (vt_initialize): Count new micro ops and call add_assocs. + +2008-05-29 Michael Matz <matz@suse.de> + * dwarf2out.c (add_location_or_const_value_attribute): When a decl only has one location nevertheless note it's start of live. diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index 50564ae10d6..3f437fe0f4b 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -117,7 +117,8 @@ enum micro_operation_type location to another. */ MO_CLOBBER, /* Clobber location. */ MO_CALL, /* Call insn. */ - MO_ADJUST /* Adjust stack pointer. */ + MO_ADJUST, /* Adjust stack pointer. */ + MO_ASSOC /* Association with decl uid bitmap. */ }; /* Where shall the note be emitted? BEFORE or AFTER the instruction. */ @@ -861,6 +862,22 @@ var_reg_set (dataflow_set *set, rtx loc, enum var_init_status initialized, set_variable_part (set, loc, decl, offset, initialized, set_src); } +static void +assoc_reg_set (dataflow_set *set, rtx loc, enum var_init_status initialized, + rtx set_src, tree decl) +{ + attrs node; + + decl = var_debug_decl (decl); + + for (node = set->regs[REGNO (loc)]; node; node = node->next) + if (node->decl == decl && node->offset == 0) + break; + if (!node) + attrs_list_insert (&set->regs[REGNO (loc)], decl, 0, loc); + set_variable_part (set, loc, decl, 0, initialized, set_src); +} + static int get_init_value (dataflow_set *set, rtx loc, tree decl) { @@ -996,6 +1013,15 @@ var_mem_set (dataflow_set *set, rtx loc, enum var_init_status initialized, set_variable_part (set, loc, decl, offset, initialized, set_src); } +static void +assoc_mem_set (dataflow_set *set, rtx loc, enum var_init_status initialized, + rtx set_src, tree decl) +{ + decl = var_debug_decl (decl); + + set_variable_part (set, loc, decl, 0, initialized, set_src); +} + /* Delete and set the location part of variable MEM_EXPR (LOC) in dataflow set SET to LOC. If MODIFY is true, any other live copies of the same variable part are also deleted from the dataflow set, @@ -2021,11 +2047,12 @@ compute_bb_dataflow (basic_block bb) dataflow_set_init (&old_out, htab_elements (VTI (bb)->out.vars) + 3); dataflow_set_copy (&old_out, out); dataflow_set_copy (out, in); + variable_tracking_info vti = VTI(bb); - n = VTI (bb)->n_mos; + n = vti->n_mos; for (i = 0; i < n; i++) { - switch (VTI (bb)->mos[i].type) + switch (vti->mos[i].type) { case MO_CALL: for (r = 0; r < FIRST_PSEUDO_REGISTER; r++) @@ -2122,6 +2149,28 @@ compute_bb_dataflow (basic_block bb) case MO_ADJUST: out->stack_adjust += VTI (bb)->mos[i].u.adjust; break; + + case MO_ASSOC: + { + rtx set = VTI (bb)->mos[i].u.loc; + bitmap b = XBITMAP (set, 2); + rtx loc = SET_DEST (set); + bitmap_iterator bi; + unsigned int i; + EXECUTE_IF_SET_IN_BITMAP (b, 0, i, bi) + { + tree var = ssa_varmap_get_ref (i); + if (!var) + continue; + if (REG_P (loc)) + assoc_reg_set (out, loc, VAR_INIT_STATUS_INITIALIZED, + SET_SRC (set), var); + else if (MEM_P (loc)) + assoc_mem_set (out, loc, VAR_INIT_STATUS_INITIALIZED, + SET_SRC (set), var); + } + } + break; } } @@ -3065,6 +3114,29 @@ emit_notes_in_bb (basic_block bb) case MO_ADJUST: set.stack_adjust += VTI (bb)->mos[i].u.adjust; break; + + case MO_ASSOC: + { + rtx rt = VTI (bb)->mos[i].u.loc; + bitmap b = XBITMAP (rt, 2); + rtx loc = SET_DEST (rt); + bitmap_iterator bi; + unsigned int i; + EXECUTE_IF_SET_IN_BITMAP (b, 0, i, bi) + { + tree var = ssa_varmap_get_ref (i); + if (!var) + continue; + if (REG_P (loc)) + assoc_reg_set (&set, loc, VAR_INIT_STATUS_INITIALIZED, + SET_SRC (rt), var); + else if (MEM_P (loc)) + assoc_mem_set (&set, loc, VAR_INIT_STATUS_INITIALIZED, + SET_SRC (rt), var); + } + emit_notes_for_changes (NEXT_INSN (insn), EMIT_NOTE_BEFORE_INSN); + } + break; } } dataflow_set_destroy (&set); @@ -3195,6 +3267,46 @@ vt_add_function_parameters (void) } } +static int +count_assocs (rtx insn) +{ + rtx pat = PATTERN (insn); + if (GET_CODE (pat) == SET) + return XBITMAP (pat, 2) ? 1 : 0; + else if (GET_CODE (pat) == PARALLEL) + { + int num = 0; + int i; + for ( i = XVECLEN (pat, 0) - 1; i >= 0; i--) + if (GET_CODE (XVECEXP (pat, 0, i)) == SET + && XBITMAP (XVECEXP (pat, 0, i), 2)) + num ++; + return num; + } + else + return 0; +} + +static void +add_assocs (basic_block bb, rtx insn, rtx pat) +{ + if (GET_CODE (pat) == SET + && XBITMAP (pat, 2)) + { + micro_operation *mo = VTI (bb)->mos + VTI (bb)->n_mos++; + + mo->type = MO_ASSOC; + mo->u.loc = pat; + mo->insn = insn; + } + else if (GET_CODE (pat) == PARALLEL) + { + int i; + for ( i = XVECLEN (pat, 0) - 1; i >= 0; i--) + add_assocs (bb, insn, XVECEXP (pat, 0, i)); + } +} + /* Allocate and initialize the data structures for variable tracking and parse the RTL to get the micro operations. */ @@ -3229,6 +3341,7 @@ vt_initialize (void) note_stores (PATTERN (insn), count_stores, insn); if (CALL_P (insn)) VTI (bb)->n_mos++; + VTI (bb)->n_mos += count_assocs (insn); } } @@ -3309,6 +3422,8 @@ vt_initialize (void) } } + add_assocs (bb, insn, PATTERN (insn)); + if (!frame_pointer_needed && post) { micro_operation *mo = VTI (bb)->mos + VTI (bb)->n_mos++; |