This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [GOOGLE] Fix LIPO resolved node reference fixup
- From: Teresa Johnson <tejohnson at google dot com>
- To: Xinliang David Li <davidxl at google dot com>
- Cc: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 24 Oct 2014 11:46:53 -0700
- Subject: Re: [GOOGLE] Fix LIPO resolved node reference fixup
- Authentication-results: sourceware.org; auth=none
- References: <CAAe5K+X6PU5k04_ki+pouuUmgdFiFn75GvLpgJzqvVYmdAm6Qw at mail dot gmail dot com> <CAAkRFZ+7MuOdkaGyyhnBCoQCXDLHnzQ3b_bTvmPNuD5QaffNQQ at mail dot gmail dot com>
On Fri, Oct 24, 2014 at 10:55 AM, Xinliang David Li <davidxl@google.com> wrote:
> When orgin_addr == addr, is there a guarantee that this assert:
>
> gcc_assert (TREE_OPERAND (op,0) == addr);
>
> is always true?
It should be, that is the assumption of the code that we are trying to
enforce with the assert.
Teresa
>
> David
>
>
>
> On Fri, Oct 24, 2014 at 10:21 AM, Teresa Johnson <tejohnson@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 <tejohnson@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 | tejohnson@google.com | 408-460-2413
--
Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413