This is the first patch in improving this code. Since there are a few places which get the index and they check the same thing, let's factor that out into one function.
Bootstrapped and tested on x86_64-linux-gnu. gcc/ChangeLog: * cfgexpand.cc (INVALID_STACK_INDEX): New defined. (decl_stack_index): New function. (visit_op): Use decl_stack_index. (visit_conflict): Likewise. (add_scope_conflicts_1): Likewise. Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> --- gcc/cfgexpand.cc | 62 +++++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc index ed890f692e5..b88e8827667 100644 --- a/gcc/cfgexpand.cc +++ b/gcc/cfgexpand.cc @@ -338,6 +338,8 @@ static unsigned stack_vars_alloc; static unsigned stack_vars_num; static hash_map<tree, unsigned> *decl_to_stack_part; +#define INVALID_STACK_INDEX ((unsigned)-1) + /* Conflict bitmaps go on this obstack. This allows us to destroy all of them in one big sweep. */ static bitmap_obstack stack_var_bitmap_obstack; @@ -526,6 +528,27 @@ stack_var_conflict_p (unsigned x, unsigned y) return bitmap_bit_p (a->conflicts, y); } +/* Returns the DECL's index into the stack_vars array. + If the DECL does not exist return INVALID_STACK_INDEX. */ +static unsigned +decl_stack_index (tree decl) +{ + if (!decl) + return INVALID_STACK_INDEX; + if (!DECL_P (decl)) + return INVALID_STACK_INDEX; + if (DECL_RTL_IF_SET (decl) != pc_rtx) + return INVALID_STACK_INDEX; + unsigned *v = decl_to_stack_part->get (decl); + if (!v) + return INVALID_STACK_INDEX; + + unsigned indx = *v; + gcc_checking_assert (indx != INVALID_STACK_INDEX); + gcc_checking_assert (indx < stack_vars_num); + return indx; +} + /* Callback for walk_stmt_ops. If OP is a decl touched by add_stack_var enter its partition number into bitmap DATA. */ @@ -534,14 +557,9 @@ visit_op (gimple *, tree op, tree, void *data) { bitmap active = (bitmap)data; op = get_base_address (op); - if (op - && DECL_P (op) - && DECL_RTL_IF_SET (op) == pc_rtx) - { - unsigned *v = decl_to_stack_part->get (op); - if (v) - bitmap_set_bit (active, *v); - } + unsigned idx = decl_stack_index (op); + if (idx != INVALID_STACK_INDEX) + bitmap_set_bit (active, idx); return false; } @@ -554,20 +572,15 @@ visit_conflict (gimple *, tree op, tree, void *data) { bitmap active = (bitmap)data; op = get_base_address (op); - if (op - && DECL_P (op) - && DECL_RTL_IF_SET (op) == pc_rtx) + unsigned num = decl_stack_index (op); + if (num != INVALID_STACK_INDEX + && bitmap_set_bit (active, num)) { - unsigned *v = decl_to_stack_part->get (op); - if (v && bitmap_set_bit (active, *v)) - { - unsigned num = *v; - bitmap_iterator bi; - unsigned i; - gcc_assert (num < stack_vars_num); - EXECUTE_IF_SET_IN_BITMAP (active, 0, i, bi) - add_stack_var_conflict (num, i); - } + bitmap_iterator bi; + unsigned i; + gcc_assert (num < stack_vars_num); + EXECUTE_IF_SET_IN_BITMAP (active, 0, i, bi) + add_stack_var_conflict (num, i); } return false; } @@ -639,15 +652,14 @@ add_scope_conflicts_1 (basic_block bb, bitmap work, bool for_conflict) if (gimple_clobber_p (stmt)) { tree lhs = gimple_assign_lhs (stmt); - unsigned *v; /* Handle only plain var clobbers. Nested functions lowering and C++ front-end inserts clobbers which are not just plain variables. */ if (!VAR_P (lhs)) continue; - if (DECL_RTL_IF_SET (lhs) == pc_rtx - && (v = decl_to_stack_part->get (lhs))) - bitmap_clear_bit (work, *v); + unsigned indx = decl_stack_index (lhs); + if (indx != INVALID_STACK_INDEX) + bitmap_clear_bit (work, indx); } else if (!is_gimple_debug (stmt)) { -- 2.43.0