When orgin_addr == addr, is there a guarantee that this assert: gcc_assert (TREE_OPERAND (op,0) == addr);
is always true? David On Fri, Oct 24, 2014 at 10:21 AM, Teresa Johnson <tejohn...@google.com> wrote: > This patch makes a fix to the reference fixups performed after LIPO > node resolution, to better handle the case where we are updating the > base address of a reference. > > Fixes google benchmark and passes regression tests. Ok for google/4_9? > > Thanks, > Teresa > > 2014-10-24 Teresa Johnson <tejohn...@google.com> > > Google ref b/18110567. > * cgraphbuild.c (get_base_address_expr): New function. > (fixup_ref): Update the op expression for new base address. > > Index: cgraphbuild.c > =================================================================== > --- cgraphbuild.c (revision 216667) > +++ cgraphbuild.c (working copy) > @@ -665,13 +665,35 @@ record_references_in_initializer (tree decl, bool > pointer_set_destroy (visited_nodes); > } > > +/* Similar to get_base_address but returns the ADDR_EXPR pointing > + to the base address corresponding to T. */ > + > +static tree > +get_base_address_expr (tree t) > +{ > + while (handled_component_p (t)) > + t = TREE_OPERAND (t, 0); > + > + if ((TREE_CODE (t) == MEM_REF > + || TREE_CODE (t) == TARGET_MEM_REF) > + && TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR) > + return TREE_OPERAND (t, 0); > + > + return NULL_TREE; > +} > + > /* Update any function decl references in base ADDR of operand OP to refer to > the resolved node. */ > > static bool > fixup_ref (gimple, tree addr, tree op) > { > + tree orig_addr = addr; > addr = get_base_address (addr); > + /* If the address was changed, update the operand OP to be the > + ADDR_EXPR pointing to the new base address. */ > + if (orig_addr != addr) > + op = get_base_address_expr (orig_addr); > if (addr && TREE_CODE (addr) == FUNCTION_DECL) > { > gcc_assert (TREE_CODE (op) == ADDR_EXPR); > > > -- > Teresa Johnson | Software Engineer | tejohn...@google.com | 408-460-2413