This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: get_ref_base_and_extent() semantics


> On Fri, Dec 12, 2008 at 12:29 AM, Martin Jambor <mjambor@suse.cz> wrote:
> > Hi,
> >
> > today  I have  encountered  an unpleasant  problem  with the  function
> > get_ref_base_and_extent() when it claimed  a known and constant offset
> > for the expression  insn_4(D)->u.fld[arg.82_3].rt_rtvec.  (arg being a
> > default_def parameter of the function,  insn is an rtx).  Moreover, it
> > also  returned constant  size  and  max_size, all  three  equal to  64
> > (bits).
> >
> > This  is certainly  wrong  (I  believe the  function  got confused  by
> > unions) but after looking at the function and what it did in debugger,
> > I grew unsure  what the expected behavior is.   The two alternatives I
> > consider  possibly  correct  are  returned  offset  equal  to  -1  or,
> > alternatively, offset  equal to the offset  of the array  (+ offset of
> > rt_rtvec which is  zero) and max_size equal either to  the size of the
> > array or -1 if it is unknown.
> >
> > At  the moment, the  function never  returns offset  equal to  -1, the
> > comment above it does not  even mention such possibility and, from the
> > limited research  I did, its callers  do not expect and  check for it.
> > However, at  the same time,  the special handling of  non-constants in
> > array  indices  after  the  label  "done" does  not  trigger  in  this
> > particular case (here I suspect the  unions come to play because it is
> > the last part of the conjunction that evaluates to false).
> >
> > Which (or what  else) is the correct semantics  of the function?  Both
> > make sense to me (I would  prefer the former but I suspect other users
> > rely on  the latter).   What would  be the correct  fix, when  a union
> > field is  itself a  record ending with  a variable-length  array?  How
> > much would I pessimize things if I just returned -1 max_size if both a
> > non-constant index and a union was encountered?
> >
> > Or did I miss something else?
> 
> The function is supposed to return -1 for max_size in case the access
> accesses a variable array index of an array of unknown size.
> 
> insn_4(D)->u.fld[arg.82_3].rt_rtvec accesses struct rtvec_def -- in which
> case the access _does_ have known size (an int plus one rtx pointer).
> But maybe I am missing context here?

Hmm, isn't this the usual problem with arrays running past the end of
sturcture?
I guess we need to special case these for needs of SRA as you can't
easilly know size of the array even if it is explicitely written in the
program.
We similarly special case those in VRP, right?

Jan
> 
> Richard.
> 
> > Thanks a lot in advance,
> >
> > Martin
> >


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]