On Fri, Dec 12, 2008 at 11:59 AM, Jan Hubicka <hubi...@ucw.cz> wrote: >> On Fri, Dec 12, 2008 at 12:29 AM, Martin Jambor <mjam...@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?
No, get_ref_base_and_extent handles those fine (it is supposed to set max_size to -1 in this case). > 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. Of course, just bail out if max_size is -1. The problem Martin is seeing is that it isn't -1 for some reason. Martin, are you asking get_ref_base_and_extent for only a part of an access? Richard.