On Tue, Apr 18, 2017 at 12:41 PM, Bin Cheng <bin.ch...@arm.com> wrote: > Hi, > For now, we check validity of offset by computing the maximum offset then > checking if > offset is smaller than the max offset. This is inaccurate, for example, some > targets > may require offset to be aligned by power of 2. This patch introduces new > interface > checking validity of offset. It also buffers rtx among different calls. > > Is it OK?
- static vec<HOST_WIDE_INT> max_offset_list; - + auto_vec<rtx> addr_list; as = TYPE_ADDR_SPACE (TREE_TYPE (use->iv->base)); mem_mode = TYPE_MODE (TREE_TYPE (*use->op_p)); - num = max_offset_list.length (); + num = addr_list.length (); list_index = (unsigned) as * MAX_MACHINE_MODE + (unsigned) mem_mode; if (list_index >= num) num here is always zero and thus the compare is always true. + addr_list.safe_grow_cleared (list_index + MAX_MACHINE_MODE); + for (; num < addr_list.length (); num++) + addr_list[num] = NULL; the loop is now redundant (safe_grow_cleared) + addr = addr_list[list_index]; + if (!addr) { always true again... I wonder if you really indented to drop 'static' from addr_list? There's no caching across function calls. + /* Split group if aksed to, or the offset against the first + use can't fit in offset part of addressing mode. IV uses + having the same offset are still kept in one group. */ + if (offset != 0 && + (split_p || !addr_offset_valid_p (use, offset))) && goes to the next line. Richard. > Thanks, > bin > 2017-04-11 Bin Cheng <bin.ch...@arm.com> > > * tree-ssa-loop-ivopts.c (compute_max_addr_offset): Delete. > (addr_offset_valid_p): New function. > (split_address_groups): Check offset validity with above function.