This is the mail archive of the gcc@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: Problem with SSA form usign cgraph_nodes and push_cfun


On Fri, Apr 30, 2010 at 3:35 PM, Massimo Nazaria <max_n@rocketmail.com> wrote:
>> You'll have to post your work so people can see. Now the
>> best the
>> experts here can do is guess what you're holding behind
>> your back :-)
>>
>> Ciao!
>> Steven
>>
>
> I completely agree with you. This is my pass:
>
> static unsigned int
> execute_mypass (void)
> {
> ?basic_block bb;
> ?gimple stmt, def_stmt;
> ?gimple_stmt_iterator gsi;
> ?struct cgraph_node *node;
> ?unsigned int rhs_code_class;
>
> ?if (flag_mypass)
> ? ?{
> ? ? ?for (node = cgraph_nodes; node; node = node->next)
> ? ? ? ?{
> ? ? ? ? ?if (node->analyzed && cgraph_is_master_clone (node))
> ? ? ? ? ? ? ? ?{
> ? ? ? ? ? ? ? ? ?push_cfun (DECL_STRUCT_FUNCTION (node->decl));
>
> ? ? ? ? ? ? ?FOR_EACH_BB (bb)
> ? ? ? ? ? ? ? ?{
> ? ? ? ? ? ? ? ? ?for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
> ? ? ? ? ? ? ? ? ? ?{
> ? ? ? ? ? ? ? ? ? ? ?stmt = gsi_stmt (gsi);
>
> ? ? ? ? ? ? ? ? ? ? ?if (gimple_code (stmt) == GIMPLE_ASSIGN)
> ? ? ? ? ? ? ? ? ? ? ? ?{
> ? ? ? ? ? ? ? ? ? ? ? ?/* Check if the assignment is acctually
> ? ? ? ? ? ? ? ? ? ? ? ? ? a function call. For example:
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? D.1 = func (args...);
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? a.9 = D.1
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? a = a.9
> ? ? ? ? ? ? ? ? ? ? ? ? ?The last one is seen as a GIMPLE_ASSIGN stmt
> ? ? ? ? ? ? ? ? ? ? ? ? ?but I want to check if it refers to a function call */
>
> ? ? ? ? ? ? ? ? ? ? ? ? ?rhs_code_class = get_gimple_rhs_class (gimple_assign_rhs_code (stmt));
> ? ? ? ? ? ? ? ? ? ? ? ? ?if ((rhs_code_class == GIMPLE_UNARY_RHS) || (rhs_code_class == GIMPLE_SINGLE_RHS))
> ? ? ? ? ? ? ? ? ? ? ? ? ? ?{
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if (is_temporary_var (gimple_assign_rhs1 (stmt))) // e.g.: a.1, D.1234...

This check is critical - if it is not verifying that
TREE_CODE (gimple_Assign_rhs1 (Stmt)) == SSA_NAME then
it's wrong.

> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?def_stmt = SSA_NAME_DEF_STMT (gimple_assign_rhs1 (stmt));
>
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?fprintf (dump_file, "gimple_code: %d\n", gimple_code (def_stmt)); // Here I get segmentation fault...
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
> ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
> ? ? ? ? ? ? ? ? ? ? ? ?}
> ? ? ? ? ? ? ? ? ? ?}
> ? ? ? ? ? ? ? ?}
> ? ? ? ? ? ? ?pop_cfun ();
> ? ? ? ? ? ?}
> ? ? ? ?}
> ? ?}
>
> ?return 0;
> }
>
> The problem is that "SSA_NAME_DEF_STMT (gimple_assign_rhs1 (stmt))" does not return a gimple stmt. I think that's because, when I make a dump of the stmts with the code above, this one has not the SSA-form. But if only use the FOR_EACH (bb), without "for (node = cgraph_nodes; ...", the SS-form is OK and SSA_NAME_DEF_STMT works well.
>
> How can I do?
>
> Thank you!
>
>
>
>


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