This avoids the push/pop_cfun calls, they are not necessary.

Bootstrapped / tested on x86_64-unknown-linux-gnu, applied.

Richard.

2014-04-15  Richard Biener  <rguent...@suse.de>

        * tree-ssa-structalias.c (find_func_aliases_for_builtin_call):
        Add struct function argument and adjust.
        (find_func_aliases_for_call): Likewise.
        (find_func_aliases): Likewise.
        (find_func_clobbers): Likewise.
        (intra_create_variable_infos): Likewise.
        (compute_points_to_sets): Likewise.
        (ipa_pta_execute): Adjust.  Do not push/pop cfun.

Index: gcc/tree-ssa-structalias.c
===================================================================
*** gcc/tree-ssa-structalias.c  (revision 207658)
--- gcc/tree-ssa-structalias.c  (working copy)
*************** get_fi_for_callee (gimple call)
*** 4126,4132 ****
     was handled, otherwise false.  */
  
  static bool
! find_func_aliases_for_builtin_call (gimple t)
  {
    tree fndecl = gimple_call_fndecl (t);
    vec<ce_s> lhsc = vNULL;
--- 4126,4132 ----
     was handled, otherwise false.  */
  
  static bool
! find_func_aliases_for_builtin_call (struct function *fn, gimple t)
  {
    tree fndecl = gimple_call_fndecl (t);
    vec<ce_s> lhsc = vNULL;
*************** find_func_aliases_for_builtin_call (gimp
*** 4440,4446 ****
             and otherwise are just all nonlocal variables.  */
          if (in_ipa_mode)
            {
!             fi = lookup_vi_for_tree (cfun->decl);
              rhs = get_function_part_constraint (fi, ~0);
              rhs.type = ADDRESSOF;
            }
--- 4440,4446 ----
             and otherwise are just all nonlocal variables.  */
          if (in_ipa_mode)
            {
!             fi = lookup_vi_for_tree (fn->decl);
              rhs = get_function_part_constraint (fi, ~0);
              rhs.type = ADDRESSOF;
            }
*************** find_func_aliases_for_builtin_call (gimp
*** 4465,4471 ****
        {
          fi = NULL;
          if (!in_ipa_mode
!             || !(fi = get_vi_for_tree (cfun->decl)))
            make_constraint_from (get_varinfo (escaped_id), anything_id);
          else if (in_ipa_mode
                   && fi != NULL)
--- 4465,4471 ----
        {
          fi = NULL;
          if (!in_ipa_mode
!             || !(fi = get_vi_for_tree (fn->decl)))
            make_constraint_from (get_varinfo (escaped_id), anything_id);
          else if (in_ipa_mode
                   && fi != NULL)
*************** find_func_aliases_for_builtin_call (gimp
*** 4492,4498 ****
  /* Create constraints for the call T.  */
  
  static void
! find_func_aliases_for_call (gimple t)
  {
    tree fndecl = gimple_call_fndecl (t);
    vec<ce_s> lhsc = vNULL;
--- 4492,4498 ----
  /* Create constraints for the call T.  */
  
  static void
! find_func_aliases_for_call (struct function *fn, gimple t)
  {
    tree fndecl = gimple_call_fndecl (t);
    vec<ce_s> lhsc = vNULL;
*************** find_func_aliases_for_call (gimple t)
*** 4501,4507 ****
  
    if (fndecl != NULL_TREE
        && DECL_BUILT_IN (fndecl)
!       && find_func_aliases_for_builtin_call (t))
      return;
  
    fi = get_fi_for_callee (t);
--- 4501,4507 ----
  
    if (fndecl != NULL_TREE
        && DECL_BUILT_IN (fndecl)
!       && find_func_aliases_for_builtin_call (fn, t))
      return;
  
    fi = get_fi_for_callee (t);
*************** find_func_aliases_for_call (gimple t)
*** 4611,4617 ****
     when building alias sets and computing alias grouping heuristics.  */
  
  static void
! find_func_aliases (gimple origt)
  {
    gimple t = origt;
    vec<ce_s> lhsc = vNULL;
--- 4611,4617 ----
     when building alias sets and computing alias grouping heuristics.  */
  
  static void
! find_func_aliases (struct function *fn, gimple origt)
  {
    gimple t = origt;
    vec<ce_s> lhsc = vNULL;
*************** find_func_aliases (gimple origt)
*** 4655,4661 ****
       In non-ipa mode, we need to generate constraints for each
       pointer passed by address.  */
    else if (is_gimple_call (t))
!     find_func_aliases_for_call (t);
      
    /* Otherwise, just a regular assignment statement.  Only care about
       operations with pointer result, others are dealt with as escape
--- 4655,4661 ----
       In non-ipa mode, we need to generate constraints for each
       pointer passed by address.  */
    else if (is_gimple_call (t))
!     find_func_aliases_for_call (fn, t);
      
    /* Otherwise, just a regular assignment statement.  Only care about
       operations with pointer result, others are dealt with as escape
*************** find_func_aliases (gimple origt)
*** 4746,4752 ****
      {
        fi = NULL;
        if (!in_ipa_mode
!         || !(fi = get_vi_for_tree (cfun->decl)))
        make_escape_constraint (gimple_return_retval (t));
        else if (in_ipa_mode
               && fi != NULL)
--- 4746,4752 ----
      {
        fi = NULL;
        if (!in_ipa_mode
!         || !(fi = get_vi_for_tree (fn->decl)))
        make_escape_constraint (gimple_return_retval (t));
        else if (in_ipa_mode
               && fi != NULL)
*************** process_ipa_clobber (varinfo_t fi, tree
*** 4849,4855 ****
     IPA constraint builder.  */
  
  static void
! find_func_clobbers (gimple origt)
  {
    gimple t = origt;
    vec<ce_s> lhsc = vNULL;
--- 4849,4855 ----
     IPA constraint builder.  */
  
  static void
! find_func_clobbers (struct function *fn, gimple origt)
  {
    gimple t = origt;
    vec<ce_s> lhsc = vNULL;
*************** find_func_clobbers (gimple origt)
*** 4867,4873 ****
      return;
  
    /* We'd better have function information for the current function.  */
!   fi = lookup_vi_for_tree (cfun->decl);
    gcc_assert (fi != NULL);
  
    /* Account for stores in assignments and calls.  */
--- 4867,4873 ----
      return;
  
    /* We'd better have function information for the current function.  */
!   fi = lookup_vi_for_tree (fn->decl);
    gcc_assert (fi != NULL);
  
    /* Account for stores in assignments and calls.  */
*************** find_func_clobbers (gimple origt)
*** 4879,4890 ****
        while (handled_component_p (tem))
        tem = TREE_OPERAND (tem, 0);
        if ((DECL_P (tem)
!          && !auto_var_in_fn_p (tem, cfun->decl))
          || INDIRECT_REF_P (tem)
          || (TREE_CODE (tem) == MEM_REF
              && !(TREE_CODE (TREE_OPERAND (tem, 0)) == ADDR_EXPR
                   && auto_var_in_fn_p
!                       (TREE_OPERAND (TREE_OPERAND (tem, 0), 0), cfun->decl))))
        {
          struct constraint_expr lhsc, *rhsp;
          unsigned i;
--- 4879,4890 ----
        while (handled_component_p (tem))
        tem = TREE_OPERAND (tem, 0);
        if ((DECL_P (tem)
!          && !auto_var_in_fn_p (tem, fn->decl))
          || INDIRECT_REF_P (tem)
          || (TREE_CODE (tem) == MEM_REF
              && !(TREE_CODE (TREE_OPERAND (tem, 0)) == ADDR_EXPR
                   && auto_var_in_fn_p
!                       (TREE_OPERAND (TREE_OPERAND (tem, 0), 0), fn->decl))))
        {
          struct constraint_expr lhsc, *rhsp;
          unsigned i;
*************** find_func_clobbers (gimple origt)
*** 4907,4918 ****
        while (handled_component_p (tem))
        tem = TREE_OPERAND (tem, 0);
        if ((DECL_P (tem)
!          && !auto_var_in_fn_p (tem, cfun->decl))
          || INDIRECT_REF_P (tem)
          || (TREE_CODE (tem) == MEM_REF
              && !(TREE_CODE (TREE_OPERAND (tem, 0)) == ADDR_EXPR
                   && auto_var_in_fn_p
!                       (TREE_OPERAND (TREE_OPERAND (tem, 0), 0), cfun->decl))))
        {
          struct constraint_expr lhs, *rhsp;
          unsigned i;
--- 4907,4918 ----
        while (handled_component_p (tem))
        tem = TREE_OPERAND (tem, 0);
        if ((DECL_P (tem)
!          && !auto_var_in_fn_p (tem, fn->decl))
          || INDIRECT_REF_P (tem)
          || (TREE_CODE (tem) == MEM_REF
              && !(TREE_CODE (TREE_OPERAND (tem, 0)) == ADDR_EXPR
                   && auto_var_in_fn_p
!                       (TREE_OPERAND (TREE_OPERAND (tem, 0), 0), fn->decl))))
        {
          struct constraint_expr lhs, *rhsp;
          unsigned i;
*************** debug_solution_for_var (unsigned int var
*** 5836,5849 ****
     function for intraprocedural mode.  */
  
  static void
! intra_create_variable_infos (void)
  {
    tree t;
  
    /* For each incoming pointer argument arg, create the constraint ARG
       = NONLOCAL or a dummy variable if it is a restrict qualified
       passed-by-reference argument.  */
!   for (t = DECL_ARGUMENTS (current_function_decl); t; t = DECL_CHAIN (t))
      {
        varinfo_t p = get_vi_for_tree (t);
  
--- 5836,5849 ----
     function for intraprocedural mode.  */
  
  static void
! intra_create_variable_infos (struct function *fn)
  {
    tree t;
  
    /* For each incoming pointer argument arg, create the constraint ARG
       = NONLOCAL or a dummy variable if it is a restrict qualified
       passed-by-reference argument.  */
!   for (t = DECL_ARGUMENTS (fn->decl); t; t = DECL_CHAIN (t))
      {
        varinfo_t p = get_vi_for_tree (t);
  
*************** intra_create_variable_infos (void)
*** 5895,5913 ****
      }
  
    /* Add a constraint for a result decl that is passed by reference.  */
!   if (DECL_RESULT (cfun->decl)
!       && DECL_BY_REFERENCE (DECL_RESULT (cfun->decl)))
      {
!       varinfo_t p, result_vi = get_vi_for_tree (DECL_RESULT (cfun->decl));
  
        for (p = result_vi; p; p = vi_next (p))
        make_constraint_from (p, nonlocal_id);
      }
  
    /* Add a constraint for the incoming static chain parameter.  */
!   if (cfun->static_chain_decl != NULL_TREE)
      {
!       varinfo_t p, chain_vi = get_vi_for_tree (cfun->static_chain_decl);
  
        for (p = chain_vi; p; p = vi_next (p))
        make_constraint_from (p, nonlocal_id);
--- 5895,5913 ----
      }
  
    /* Add a constraint for a result decl that is passed by reference.  */
!   if (DECL_RESULT (fn->decl)
!       && DECL_BY_REFERENCE (DECL_RESULT (fn->decl)))
      {
!       varinfo_t p, result_vi = get_vi_for_tree (DECL_RESULT (fn->decl));
  
        for (p = result_vi; p; p = vi_next (p))
        make_constraint_from (p, nonlocal_id);
      }
  
    /* Add a constraint for the incoming static chain parameter.  */
!   if (fn->static_chain_decl != NULL_TREE)
      {
!       varinfo_t p, chain_vi = get_vi_for_tree (fn->static_chain_decl);
  
        for (p = chain_vi; p; p = vi_next (p))
        make_constraint_from (p, nonlocal_id);
*************** compute_points_to_sets (void)
*** 6792,6798 ****
  
    init_alias_vars ();
  
!   intra_create_variable_infos ();
  
    /* Now walk all statements and build the constraint set.  */
    FOR_EACH_BB_FN (bb, cfun)
--- 6792,6798 ----
  
    init_alias_vars ();
  
!   intra_create_variable_infos (cfun);
  
    /* Now walk all statements and build the constraint set.  */
    FOR_EACH_BB_FN (bb, cfun)
*************** compute_points_to_sets (void)
*** 6804,6817 ****
          gimple phi = gsi_stmt (gsi);
  
          if (! virtual_operand_p (gimple_phi_result (phi)))
!           find_func_aliases (phi);
        }
  
        for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
        {
          gimple stmt = gsi_stmt (gsi);
  
!         find_func_aliases (stmt);
        }
      }
  
--- 6804,6817 ----
          gimple phi = gsi_stmt (gsi);
  
          if (! virtual_operand_p (gimple_phi_result (phi)))
!           find_func_aliases (cfun, phi);
        }
  
        for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
        {
          gimple stmt = gsi_stmt (gsi);
  
!         find_func_aliases (cfun, stmt);
        }
      }
  
*************** ipa_pta_execute (void)
*** 7166,7172 ****
        }
  
        func = DECL_STRUCT_FUNCTION (node->decl);
!       push_cfun (func);
  
        /* For externally visible or attribute used annotated functions use
         local constraints for their arguments.
--- 7166,7172 ----
        }
  
        func = DECL_STRUCT_FUNCTION (node->decl);
!       gcc_assert (cfun == NULL);
  
        /* For externally visible or attribute used annotated functions use
         local constraints for their arguments.
*************** ipa_pta_execute (void)
*** 7176,7182 ****
          || node->externally_visible
          || node->force_output)
        {
!         intra_create_variable_infos ();
  
          /* We also need to make function return values escape.  Nothing
             escapes by returning from main though.  */
--- 7176,7182 ----
          || node->externally_visible
          || node->force_output)
        {
!         intra_create_variable_infos (func);
  
          /* We also need to make function return values escape.  Nothing
             escapes by returning from main though.  */
*************** ipa_pta_execute (void)
*** 7211,7230 ****
              gimple phi = gsi_stmt (gsi);
  
              if (! virtual_operand_p (gimple_phi_result (phi)))
!               find_func_aliases (phi);
            }
  
          for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
            {
              gimple stmt = gsi_stmt (gsi);
  
!             find_func_aliases (stmt);
!             find_func_clobbers (stmt);
            }
        }
  
-       pop_cfun ();
- 
        if (dump_file)
        {
          fprintf (dump_file, "\n");
--- 7211,7228 ----
              gimple phi = gsi_stmt (gsi);
  
              if (! virtual_operand_p (gimple_phi_result (phi)))
!               find_func_aliases (func, phi);
            }
  
          for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
            {
              gimple stmt = gsi_stmt (gsi);
  
!             find_func_aliases (func, stmt);
!             find_func_clobbers (func, stmt);
            }
        }
  
        if (dump_file)
        {
          fprintf (dump_file, "\n");

Reply via email to