This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch PR39960] Fix new stmt construction


On Tue, 17 Nov 2009, Olga Golovanevsky wrote:

> 
> This patch fixes PR39960 of incorrect statement construction for pointers
> or indirect references.
> Regtested on powerpc64-linux.
> 
> Ok for mailine?
> 
> Olga
> 
> 2009-11-17 Olga Golovanevsky <olga@il.ibm.com>
> 
>       PR middle-end/39960
>       * ipa-struct-reorg.c (find_pos_in_stmt): New parameter R_POS.
>       (ref_pos): New field in structure.
>       (insert_new_var_in_stmt): New function.
> 
> 
> Index: ipa-struct-reorg.c
> ===================================================================
> --- ipa-struct-reorg.c  (revision 154244)
> +++ ipa-struct-reorg.c  (working copy)
> @@ -868,6 +868,7 @@ struct ref_pos
>  {
>    tree *pos;
>    tree ref;
> +  tree container;
>  };
> 
> 
> @@ -890,6 +891,7 @@ find_pos_in_stmt_1 (tree *tp, int *walk_
>        return t;
>      }
> 
> +  r_pos->container = t;
>    *walk_subtrees = 1;
>    return NULL_TREE;
>  }
> @@ -899,18 +901,18 @@ find_pos_in_stmt_1 (tree *tp, int *walk_
>     It returns it, if found, and NULL otherwise.  */
> 
>  static tree *
> -find_pos_in_stmt (gimple stmt, tree ref)
> +find_pos_in_stmt (gimple stmt, tree ref, struct ref_pos * r_pos)
>  {
> -  struct ref_pos r_pos;
>    struct walk_stmt_info wi;
> 
> -  r_pos.ref = ref;
> -  r_pos.pos = NULL;
> +  r_pos->ref = ref;
> +  r_pos->pos = NULL;
> +  r_pos->container = NULL_TREE;
>    memset (&wi, 0, sizeof (wi));
> -  wi.info = &r_pos;
> +  wi.info = r_pos;
>    walk_gimple_op (stmt, find_pos_in_stmt_1, &wi);
> 
> -  return r_pos.pos;
> +  return r_pos->pos;
>  }
> 
>  /* This structure is used to represent array
> @@ -948,6 +950,7 @@ replace_field_acc (struct field_access_s
>    tree field_id = DECL_NAME (acc->field_decl);
>    VEC (type_wrapper_t, heap) *wrapper = VEC_alloc (type_wrapper_t, heap,
> 10);
>    type_wrapper_t *wr_p = NULL;
> +  struct ref_pos r_pos;
> 
>    while (TREE_CODE (ref_var) == INDIRECT_REF
>        || TREE_CODE (ref_var) == ARRAY_REF)
> @@ -999,14 +1002,14 @@ replace_field_acc (struct field_access_s
>       gimple_assign_set_rhs1 (acc->stmt, new_acc);
>        else
>       {
> -       pos = find_pos_in_stmt (acc->stmt, acc->comp_ref);
> +       pos = find_pos_in_stmt (acc->stmt, acc->comp_ref, &r_pos);
>         gcc_assert (pos);
>         *pos = new_acc;
>       }
>      }
>    else
>      {
> -      pos = find_pos_in_stmt (acc->stmt, acc->comp_ref);
> +      pos = find_pos_in_stmt (acc->stmt, acc->comp_ref, &r_pos);
>        gcc_assert (pos);
>        *pos = new_acc;
>      }
> @@ -1244,6 +1247,35 @@ create_new_stmts_for_cond_expr (gimple s
>      }
>  }
> 
> +/* This function looks for VAR in STMT, and replace it with NEW_VAR.
> +   If needed, it wraps NEW_VAR in pointers and indirect references
> +   before insertion.  */
> +
> +static void
> +insert_new_var_in_stmt (gimple stmt, tree var, tree new_var)
> +{
> +  struct ref_pos r_pos;
> +  tree *pos;
> +
> +  pos = find_pos_in_stmt (stmt, var, &r_pos);
> +  gcc_assert (pos);
> +
> +  while (r_pos.container && (TREE_CODE(r_pos.container) == INDIRECT_REF
> +                      || TREE_CODE(r_pos.container) == ADDR_EXPR))

Please align && vertically

> +    {
> +      tree type = TREE_TYPE (TREE_TYPE (new_var));
> +
> +      if (TREE_CODE(r_pos.container) == INDIRECT_REF)

Space after TREE_CODE

Ok with that change.

Thanks,
Richard.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]