On Fri, Apr 30, 2010 at 3:35 PM, Massimo Nazaria <ma...@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!
>
>
>
>

Reply via email to