This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Assigning a value to a temp var in GIMPLE SSA
- From: Zdenek Dvorak <rakdver at kam dot mff dot cuni dot cz>
- To: Mario Fanelli <mario dot fanelli at gmail dot com>
- Cc: gcc at gcc dot gnu dot org
- Date: Sat, 23 Feb 2008 00:07:47 +0100
- Subject: Re: Assigning a value to a temp var in GIMPLE SSA
- References: <aa5776be0802220718g6f117ac6xb361cf2cb365f510@mail.gmail.com>
Hi,
> I'm trying to add a simple statement to GIMPLE code adding a new pass,
> that I put in pass_tree_loop.sub as last pass just before
> pass_tree_loop_done pass. Just as test I'd like to add a call like:
>
> .palp = shmalloc (16);
>
> This is the code I'm using:
>
> t = build_function_type_list (ptr_type_node,
> integer_type_node, NULL_TREE);
> decl = build_fn_decl ("shmalloc", t);
> t = build_int_cst (integer_type_node, 16);
> args = tree_cons (NULL, t, NULL);
> t = build_function_call_expr (decl, args);
> TREE_SIDE_EFFECTS (t) = 1;
>
> palpstruct = create_tmp_var (ptr_type_node, ".palp");
> add_referenced_var (palpstruct);
> t1 = build2 (MODIFY_EXPR, ptr_type_node, palpstruct, t);
depending on what version of gcc you use, you might need to use
t1 = build_gimple_modify_stmt (palpstruct, t);
> t2 = make_ssa_name (palpstruct, NULL);
t2 = make_ssa_name (palpstruct, t1);
> DECL_ARTIFICIAL (t1) = 1;
> TREE_SIDE_EFFECTS (t1) = 1;
> DECL_EXTERNAL (t1) = 1;
remove these three statements (t1 is not decl, and setting
TREE_SIDE_EFFECTS of t1 is not necessary).
> TREE_OPERAND (t1, 0) = t2;
> bsi_insert_after (&si, t1, BSI_CONTINUE_LINKING);
>
> If I try to add just the shmalloc(16); statement it works, but if I
> add the code to assign the result to a temporary variable, gcc
> segfaults while executing the vrp2 pass in tree-vrp.c. Could someone
> point me to the right direction? What am I doing wrong?
It may also turn out to be necessary to ensure that virtual operands
are updated,
Zdenek