This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [patch PR39960] Fix new stmt construction
- From: Richard Guenther <rguenther at suse dot de>
- To: Olga Golovanevsky <OLGA at il dot ibm dot com>
- Cc: Jan Hubicka <hubicka at ucw dot cz>, dnovillo at google dot com, gcc-patches at gcc dot gnu dot org
- Date: Tue, 17 Nov 2009 16:09:37 +0100 (CET)
- Subject: Re: [patch PR39960] Fix new stmt construction
- References: <OF76866B85.390D15BF-ONC2257671.0034523F-C2257671.004A9C29@il.ibm.com>
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.