On Sat, Nov 16, 2024 at 5:27 AM Andrew Pinski <quic_apin...@quicinc.com> wrote: > > 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.
OK. Thanks, Richard. > 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 >