On Tue, Nov 5, 2013 at 1:18 PM, Yufeng Zhang <yufeng.zh...@arm.com> wrote: > On 11/05/13 11:45, Bin.Cheng wrote: >> >> On Tue, Nov 5, 2013 at 7:19 PM, Yufeng Zhang<yufeng.zh...@arm.com> wrote: >>> >>> > On 11/05/13 10:13, bin.cheng wrote: >>>> >>>> >> >>>> >> Index: gcc/tree-affine.c >>>> >> =================================================================== >>>> >> --- gcc/tree-affine.c (revision 204117) >>>> >> +++ gcc/tree-affine.c (working copy) >>>> >> @@ -874,10 +874,11 @@ debug_aff (aff_tree *val) >>>> >> fprintf (stderr, "\n"); >>>> >> } >>>> >> >>>> >> -/* Returns address of the reference REF in ADDR. The size of the >>>> >> accessed >>>> >> - location is stored to SIZE. */ >>>> >> +/* Computes address of the reference REF in ADDR. The size of the >>>> >> accessed >>>> >> + location is stored to SIZE. Returns pointer to the ultimate >>>> >> containing >>>> >> + object to which REF refers. */ >>>> >> >>>> >> -void >>>> >> +tree >>>> >> get_inner_reference_aff (tree ref, aff_tree *addr, double_int >>>> >> *size) >>>> >> { >>>> >> HOST_WIDE_INT bitsize, bitpos; >>>> >> @@ -904,6 +905,8 @@ get_inner_reference_aff (tree ref, aff_tree >>>> >> *addr, >>>> >> aff_combination_add (addr,&tmp); >>>> >> >>>> >> *size = double_int::from_shwi ((bitsize + BITS_PER_UNIT - 1) / >>>> >> BITS_PER_UNIT); >>>> >> + >>>> >> + return base_addr; >>>> >> } >>>> >> >>> >>> > >>> > I think what Richard suggests is to return the base object rather the >>> > address of the base object, i.e. >> >> I am not sure about that. We have to pass pointer_type expression to >> function determine_base_object for address expressions, because there >> is no way to tell pointer from object once we are in >> determine_base_object. > > > I'm just concerned with the consistency in what is returned between > get_inner_reference and get_inner_reference_aff. If determine_base_object > expects reference only, you can probably work around it with something like: > > base_object = build_fold_addr_expr (base_object); > > after the get_inner_reference_aff call.
Note that get_inner_reference_aff is already different from get_inner_reference in that it does not separate base object and offset but lumps them together into an address represented as affine combination. For this reason get_inner_reference_aff may not exactly be the best name for the function ... it could be split to not do aff_combination_add (addr, &tmp); but instead return 'base'. The two existing users of the function could be unified into aff_comb_cannot_overlap_p (giving that a better name as well), even avoiding combining the base but instead handle comparing the base itself. Of course that's preexisting issues that I don't want to force Bin Cheng to clean up and fix (given I've, too, just spent a minute thinking about it). Thanks, Richard. > Yufeng >