diff mbox

[GOOGLE] Fix LIPO resolved node reference fixup

Message ID CAAe5K+X6PU5k04_ki+pouuUmgdFiFn75GvLpgJzqvVYmdAm6Qw@mail.gmail.com
State New
Headers show

Commit Message

Teresa Johnson Oct. 24, 2014, 5:21 p.m. UTC
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.

Comments

Xinliang David Li Oct. 24, 2014, 5:55 p.m. UTC | #1
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 <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 Oct. 24, 2014, 6:46 p.m. UTC | #2
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
diff mbox

Patch

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);