public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Guenther <richard.guenther@gmail.com>
To: Michael Matz <matz@suse.de>
Cc: gcc-patches@gcc.gnu.org, Andrew MacLeod <amacleod@redhat.com>,
	 	Andrey Belevantsev <abel@ispras.ru>
Subject: Re: [RFA] expand from SSA form (1/2)
Date: Fri, 24 Apr 2009 14:32:00 -0000	[thread overview]
Message-ID: <84fc9c000904240721he410b55p9776a1d033f82fc3@mail.gmail.com> (raw)
In-Reply-To: <Pine.LNX.4.64.0904221826080.29566@wotan.suse.de>

On Wed, Apr 22, 2009 at 6:42 PM, Michael Matz <matz@suse.de> wrote:
> On Wed, 22 Apr 2009, Michael Matz wrote:
>
>> I'll soon send a new version of the patch that fixes all problems and
>> testcases I encountered.
>
> Like so.  This is the full patch, i.e. including the cleanups, but
> excluding the testsuite changes.  It should incorporate all feedback.
> Compared to the last version it adds comments for new functions, fixes
> muflap2, and generally some other minor problems showing when I started
> testing Ada and a bug reported by Andrey.
>
> This patch (plus testsuite changes) was bootstrapped with Ada on
> x86_64-linux.  There are no testsuite regressions:
> FAIL: gcc.dg/tree-prof/bb-reorg.c compilation,  -fprofile-use -D_PROFILE_USE
> FAIL: gcc.dg/tree-prof/pr34999.c compilation,  -fprofile-use -D_PROFILE_USE
> FAIL: gcc.target/i386/avx-vmovntdq-256-1.c (test for excess errors)
> FAIL: gcc.target/i386/avx-vmovntpd-256-1.c (test for excess errors)
> FAIL: gcc.target/i386/avx-vmovntps-256-1.c (test for excess errors)
> FAIL: libmudflap.c++/pass41-frag.cxx execution test
> FAIL: libmudflap.c++/pass41-frag.cxx (-static) execution test
> FAIL: libmudflap.c++/pass41-frag.cxx (-O2) execution test
> FAIL: libmudflap.c++/pass41-frag.cxx (-O3) execution test
>
> All of these happen without the patch too (known bugs, old binutils, and
> pass41-frag never seems to work anyway).
>
> I'd like to ask for approval for the series.
>
>
> Ciao,
> Michael.
> --
>        * builtins.c (fold_builtin_next_arg): Handle SSA names.
>        * tree-ssa-copyrename.c (rename_ssa_copies): Don't iterate
>        beyond num_ssa_names, use ssa_name() directly.
>        * tree-ssa-ter.c (free_temp_expr_table): Likewise.
>        * tree-ssa-coalesce.c (create_outofssa_var_map): Likewise,
>        mark only useful SSA names.
>        (compare_pairs): Swap cost comparison.
>        (coalesce_ssa_name): Don't use change_partition_var.
>        * tree-nrv.c (struct nrv_data): Add modified member.
>        (finalize_nrv_r): Set it.
>        (tree_nrv): Use it to update statements.
>        (pass_nrv): Require PROP_ssa.
>        * tree-mudflap.c (create_referenced_var): New static helper.
>        (mf_decl_cache_locals, mf_build_check_statement_for): Use it.
>        (pass_mudflap_2): Require PROP_ssa, run ssa update at finish.
>        * alias.c (find_base_decl): Handle SSA names.
>        * emit-rtl (set_reg_attrs_for_parm): Make non-static.
>        (component_ref_for_mem_expr): Don't leak SSA names into RTL.
>        * rtl.h (set_reg_attrs_for_parm): Declare.
>        * tree-optimize.c (pass_cleanup_cfg_post_optimizing): Rename
>        to "optimized", remove unused locals at finish.
>        (execute_free_datastructures): Make global, call
>        delete_tree_cfg_annotations.
>        (execute_free_cfg_annotations): Don't call
>        delete_tree_cfg_annotations.
>
>        * ssaexpand.h: New file.
>        * expr.c (toplevel): Include ssaexpand.h.
>        (expand_assignment): Handle SSA names the same as register
>        variables.
>        (expand_expr_real_1): Expand SSA names.
>        * cfgexpand.c (toplevel): Include ssaexpand.h.
>        (SA): New global variable.
>        (gimple_cond_pred_to_tree): Fold TERed comparisons into predicates.
>        (SSAVAR): New macro.
>        (set_rtl): New helper function.
>        (add_stack_var): Deal with SSA names, use set_rtl.
>        (expand_one_stack_var_at): Likewise.
>        (expand_one_stack_var): Deal with SSA names.
>        (stack_var_size_cmp): Use code (SSA_NAME / DECL) as tie breaker
>        before unique numbers.
>        (expand_stack_vars): Use set_rtl.
>        (expand_one_var): Accept SSA names, add asserts for them, feed them
>        to above subroutines.
>        (expand_used_vars): Expand all partitions (without default defs),
>        then only the local decls (ignoring those expanded already).
>        (expand_gimple_cond): Remove edges when jumpif() expands an
>        unconditional jump.
>        (expand_gimple_basic_block): Don't clear EDGE_EXECUTABLE here,
>        or remove abnormal edges.  Ignore insns setting the LHS of a TERed
>        SSA name.
>        (gimple_expand_cfg): Call into rewrite_out_of_ssa, initialize
>        members of SA; deal with PARM_DECL partitions here; expand
>        all PHI nodes, free tree datastructures and SA.  Commit instructions
>        on edges, clear EDGE_EXECUTABLE and remove abnormal edges here.
>        (pass_expand): Require and destroy PROP_ssa, verify SSA form, flow
>        info and statements at start, collect garbage at finish.
>        * tree-ssa-live.h (struct _var_map): Remove partition_to_var member.
>        (VAR_ANN_PARTITION) Remove.
>        (change_partition_var): Don't declare.
>        (partition_to_var): Always return SSA names.
>        (var_to_partition): Only accept SSA names.
>        (register_ssa_partition): Only check argument.
>        * tree-ssa-live.c (init_var_map): Don't allocate partition_to_var
>        member.
>        (delete_var_map): Don't free it.
>        (var_union): Only accept SSA names, simplify.
>        (partition_view_init): Mark only useful SSA names as used.
>        (partition_view_fini): Only deal with SSA names.
>        (change_partition_var): Remove.
>        (dump_var_map): Use ssa_name instead of partition_to_var member.
>        * tree-ssa.c (delete_tree_ssa): Don't remove PHI nodes on RTL
>        basic blocks.
>        * tree-outof-ssa.c (toplevel): Include ssaexpand.h and expr.h.
>        (struct _elim_graph): New member const_dests; nodes member vector of
>        ints.
>        (set_location_for_edge): New static helper.
>        (create_temp): Remove.
>        (insert_partition_copy_on_edge, insert_part_to_rtx_on_edge,
>        insert_value_copy_on_edge, insert_rtx_to_part_on_edge): New
>        functions.
>        (new_elim_graph): Allocate const_dests member.
>        (clean_elim_graph): Truncate const_dests member.
>        (delete_elim_graph): Free const_dests member.
>        (elim_graph_size): Adapt to new type of nodes member.
>        (elim_graph_add_node): Likewise.
>        (eliminate_name): Likewise.
>        (eliminate_build): Don't take basic block argument, deal only with
>        partition numbers, not variables.
>        (get_temp_reg): New static helper.
>        (elim_create): Use it, deal with RTL temporaries instead of trees.
>        (eliminate_phi): Adjust all calls to new signature.
>        (assign_vars, replace_use_variable, replace_def_variable): Remove.
>        (rewrite_trees): Only do checking.
>        (edge_leader, stmt_list, leader_has_match, leader_match): Remove.
>        (same_stmt_list_p, identical_copies_p, identical_stmt_lists_p,
>        init_analyze_edges_for_bb, fini_analyze_edges_for_bb,
>        contains_tree_r, MAX_STMTS_IN_LATCH,
>        process_single_block_loop_latch, analyze_edges_for_bb,
>        perform_edge_inserts): Remove.
>        (expand_phi_nodes): New global function.
>        (remove_ssa_form): Take ssaexpand parameter.  Don't call removed
>        functions, initialize new parameter, remember partitions having a
>        default def.
>        (finish_out_of_ssa): New global function.
>        (rewrite_out_of_ssa): Make global.  Adjust call to remove_ssa_form,
>        don't reset in_ssa_p here.
>        (pass_del_ssa): Remove.
>        * tree-flow.h (struct var_ann_d): Remove out_of_ssa_tag and
>        partition members.
>        (execute_free_datastructures): Declare.
>        * Makefile.in (SSAEXPAND_H): New variable.
>        (tree-outof-ssa.o, expr.o, cfgexpand.o): Depend on SSAEXPAND_H.
>        * basic-block.h (commit_one_edge_insertion): Declare.
>        * passes.c (init_optimization_passes): Move pass_nrv and
>        pass_mudflap2 before pass_cleanup_cfg_post_optimizing, remove
>        pass_del_ssa, pass_free_datastructures, pass_free_cfg_annotations.
>        * cfgrtl.c (commit_one_edge_insertion): Make global, don't declare.
>        (redirect_branch_edge): Deal with super block when expanding, split
>        out jump patching itself into ...
>        (patch_jump_insn): ... here, new static helper.

Some comments inline...

> Index: tree-ssa-copyrename.c
> ===================================================================
> *** tree-ssa-copyrename.c       (revision 146576)
> --- tree-ssa-copyrename.c       (working copy)
> *************** rename_ssa_copies (void)
> *** 291,297 ****
>    else
>      debug = NULL;
>
> !   map = init_var_map (num_ssa_names + 1);
>
>    FOR_EACH_BB (bb)
>      {
> --- 291,297 ----
>    else
>      debug = NULL;
>
> !   map = init_var_map (num_ssa_names);
>
>    FOR_EACH_BB (bb)
>      {
> *************** rename_ssa_copies (void)
> *** 339,350 ****
>    /* Now one more pass to make all elements of a partition share the same
>       root variable.  */
>
> !   for (x = 1; x <= num_ssa_names; x++)
>      {
>        part_var = partition_to_var (map, x);
>        if (!part_var)
>          continue;
> !       var = map->partition_to_var[x];
>        if (debug)
>          {
>          if (SSA_NAME_VAR (var) != SSA_NAME_VAR (part_var))
> --- 339,350 ----
>    /* Now one more pass to make all elements of a partition share the same
>       root variable.  */
>
> !   for (x = 1; x < num_ssa_names; x++)
>      {
>        part_var = partition_to_var (map, x);
>        if (!part_var)
>          continue;
> !       var = ssa_name (x);
>        if (debug)
>          {
>          if (SSA_NAME_VAR (var) != SSA_NAME_VAR (part_var))

This piece is ok as obvious.  Please commit it separately.


> Index: cfgexpand.c
> ===================================================================
> *** cfgexpand.c (revision 146576)
> --- cfgexpand.c (working copy)
> *************** along with GCC; see the file COPYING3.
> *** 42,49 ****
> --- 42,54 ----
>  #include "tree-inline.h"
>  #include "value-prof.h"
>  #include "target.h"
> + #include "ssaexpand.h"
>
>
> + /* This variable holds information helping the rewriting of SSA trees
> +    into RTL.  */
> + struct ssaexpand SA;
> +
>  /* Return an expression tree corresponding to the RHS of GIMPLE
>     statement STMT.  */
>
> *************** gimple_assign_rhs_to_tree (gimple stmt)
> *** 78,85 ****
>  static tree
>  gimple_cond_pred_to_tree (gimple stmt)
>  {
>    return build2 (gimple_cond_code (stmt), boolean_type_node,
> !                gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
>  }
>
>  /* Helper for gimple_to_tree.  Set EXPR_LOCATION for every expression
> --- 83,104 ----
>  static tree
>  gimple_cond_pred_to_tree (gimple stmt)
>  {
> +   /* We're sometimes presented with such code:
> +        D.123_1 = x < y;
> +        if (D.123_1 != 0)
> +          ...
> +      This would expand to two comparisons which then later might
> +      be cleaned up by combine.  But some pattern matchers like if-conversion
> +      work better when there's only one compare, so make up for this
> +      here as special exception if TER would have made the same change.  */
> +   tree lhs = gimple_cond_lhs (stmt);
> +   if (SA.values
> +       && TREE_CODE (lhs) == SSA_NAME
> +       && SA.values[SSA_NAME_VERSION (lhs)])
> +     lhs = gimple_assign_rhs_to_tree (SA.values[SSA_NAME_VERSION (lhs)]);

Do we really need the SA.values array here?  It seems that
a bitmap would be enough, as the definition should be still
reachable via SSA_NAME_DEF_STMT (lhs).  (Thanks Paolo
for noticing this)

> +
>    return build2 (gimple_cond_code (stmt), boolean_type_node,
> !                lhs, gimple_cond_rhs (stmt));
>  }
>
>  /* Helper for gimple_to_tree.  Set EXPR_LOCATION for every expression
> *************** failed:
> *** 423,428 ****
> --- 442,464 ----
>  #define STACK_ALIGNMENT_NEEDED 1
>  #endif
>
> + #define SSAVAR(x) (TREE_CODE (x) == SSA_NAME ? SSA_NAME_VAR (x) : x)

This should be in some public place, ideally with a more
sound name.  Any ideas?

> + /* Associate declaration T with storage space X.  If T is no
> +    SSA name this is exactly SET_DECL_RTL, otherwise make the
> +    partition of T associated with X.  */
> + static inline void
> + set_rtl (tree t, rtx x)
> + {
> +   if (TREE_CODE (t) == SSA_NAME)
> +     {
> +       SA.partition_to_pseudo[var_to_partition (SA.map, t)] = x;
> +       if (x && !MEM_P (x))
> +       set_reg_attrs_for_decl_rtl (SSA_NAME_VAR (t), x);
> +     }
> +   else
> +     SET_DECL_RTL (t, x);
> + }
>
>  /* This structure holds data relevant to one variable that will be
>     placed in a stack slot.  */
> *************** add_stack_var (tree decl)
> *** 561,575 ****
>      }
>    stack_vars[stack_vars_num].decl = decl;
>    stack_vars[stack_vars_num].offset = 0;
> !   stack_vars[stack_vars_num].size = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
> !   stack_vars[stack_vars_num].alignb = get_decl_align_unit (decl);
>
>    /* All variables are initially in their own partition.  */
>    stack_vars[stack_vars_num].representative = stack_vars_num;
>    stack_vars[stack_vars_num].next = EOC;
>
>    /* Ensure that this decl doesn't get put onto the list twice.  */
> !   SET_DECL_RTL (decl, pc_rtx);
>
>    stack_vars_num++;
>  }
> --- 597,611 ----
>      }
>    stack_vars[stack_vars_num].decl = decl;
>    stack_vars[stack_vars_num].offset = 0;
> !   stack_vars[stack_vars_num].size = tree_low_cst (DECL_SIZE_UNIT (SSAVAR (decl)), 1);
> !   stack_vars[stack_vars_num].alignb = get_decl_align_unit (SSAVAR (decl));
>
>    /* All variables are initially in their own partition.  */
>    stack_vars[stack_vars_num].representative = stack_vars_num;
>    stack_vars[stack_vars_num].next = EOC;
>
>    /* Ensure that this decl doesn't get put onto the list twice.  */
> !   set_rtl (decl, pc_rtx);
>
>    stack_vars_num++;
>  }
> *************** add_alias_set_conflicts (void)
> *** 688,709 ****
>  }
>
>  /* A subroutine of partition_stack_vars.  A comparison function for qsort,
> !    sorting an array of indices by the size of the object.  */
>
>  static int
>  stack_var_size_cmp (const void *a, const void *b)
>  {
>    HOST_WIDE_INT sa = stack_vars[*(const size_t *)a].size;
>    HOST_WIDE_INT sb = stack_vars[*(const size_t *)b].size;
> !   unsigned int uida = DECL_UID (stack_vars[*(const size_t *)a].decl);
> !   unsigned int uidb = DECL_UID (stack_vars[*(const size_t *)b].decl);
>
>    if (sa < sb)
>      return -1;
>    if (sa > sb)
>      return 1;
> !   /* For stack variables of the same size use the uid of the decl
> !      to make the sort stable.  */
>    if (uida < uidb)
>      return -1;
>    if (uida > uidb)
> --- 724,760 ----
>  }
>
>  /* A subroutine of partition_stack_vars.  A comparison function for qsort,
> !    sorting an array of indices by the size and type of the object.  */
>
>  static int
>  stack_var_size_cmp (const void *a, const void *b)
>  {
>    HOST_WIDE_INT sa = stack_vars[*(const size_t *)a].size;
>    HOST_WIDE_INT sb = stack_vars[*(const size_t *)b].size;
> !   tree decla, declb;
> !   unsigned int uida, uidb;
>
>    if (sa < sb)
>      return -1;
>    if (sa > sb)
>      return 1;
> !   decla = stack_vars[*(const size_t *)a].decl;
> !   declb = stack_vars[*(const size_t *)b].decl;
> !   /* For stack variables of the same size use and id of the decls
> !      to make the sort stable.  Two SSA names are compared by their
> !      version, SSA names come before non-SSA names, and two normal
> !      decls are compared by their DECL_UID.  */
> !   if (TREE_CODE (decla) == SSA_NAME)
> !     {
> !       if (TREE_CODE (declb) == SSA_NAME)
> !       uida = SSA_NAME_VERSION (decla), uidb = SSA_NAME_VERSION (declb);
> !       else
> !       return -1;
> !     }
> !   else if (TREE_CODE (declb) == SSA_NAME)
> !     return 1;
> !   else
> !     uida = DECL_UID (decla), uidb = DECL_UID (declb);
>    if (uida < uidb)
>      return -1;
>    if (uida > uidb)
> *************** expand_one_stack_var_at (tree decl, HOST
> *** 874,894 ****
>    gcc_assert (offset == trunc_int_for_mode (offset, Pmode));
>
>    x = plus_constant (virtual_stack_vars_rtx, offset);
> !   x = gen_rtx_MEM (DECL_MODE (decl), x);
>
> !   /* Set alignment we actually gave this decl.  */
> !   offset -= frame_phase;
> !   align = offset & -offset;
> !   align *= BITS_PER_UNIT;
> !   if (align == 0)
> !     align = STACK_BOUNDARY;
> !   else if (align > MAX_SUPPORTED_STACK_ALIGNMENT)
> !     align = MAX_SUPPORTED_STACK_ALIGNMENT;
> !   DECL_ALIGN (decl) = align;
> !   DECL_USER_ALIGN (decl) = 0;
>
> !   set_mem_attributes (x, decl, true);
> !   SET_DECL_RTL (decl, x);
>  }
>
>  /* A subroutine of expand_used_vars.  Give each partition representative
> --- 925,951 ----
>    gcc_assert (offset == trunc_int_for_mode (offset, Pmode));
>
>    x = plus_constant (virtual_stack_vars_rtx, offset);
> !   x = gen_rtx_MEM (DECL_MODE (SSAVAR (decl)), x);
>
> !   if (TREE_CODE (decl) != SSA_NAME)
> !     {
> !       /* Set alignment we actually gave this decl if it isn't an SSA name.
> !          If it is we generate stack slots only accidentally so it isn't as
> !        important, we'll simply use the alignment that is already set.  */
> !       offset -= frame_phase;
> !       align = offset & -offset;
> !       align *= BITS_PER_UNIT;
> !       if (align == 0)
> !       align = STACK_BOUNDARY;
> !       else if (align > MAX_SUPPORTED_STACK_ALIGNMENT)
> !       align = MAX_SUPPORTED_STACK_ALIGNMENT;
>
> !       DECL_ALIGN (decl) = align;
> !       DECL_USER_ALIGN (decl) = 0;
> !     }
> !
> !   set_mem_attributes (x, SSAVAR (decl), true);
> !   set_rtl (decl, x);
>  }
>
>  /* A subroutine of expand_used_vars.  Give each partition representative
> *************** expand_stack_vars (bool (*pred) (tree))
> *** 912,918 ****
>
>        /* Skip variables that have already had rtl assigned.  See also
>         add_stack_var where we perpetrate this pc_rtx hack.  */
> !       if (DECL_RTL (stack_vars[i].decl) != pc_rtx)
>        continue;
>
>        /* Check the predicate to see whether this variable should be
> --- 969,977 ----
>
>        /* Skip variables that have already had rtl assigned.  See also
>         add_stack_var where we perpetrate this pc_rtx hack.  */
> !       if ((TREE_CODE (stack_vars[i].decl) == SSA_NAME
> !          ? SA.partition_to_pseudo[var_to_partition (SA.map, stack_vars[i].decl)]
> !          : DECL_RTL (stack_vars[i].decl)) != pc_rtx)
>        continue;
>
>        /* Check the predicate to see whether this variable should be
> *************** account_stack_vars (void)
> *** 951,957 ****
>
>        size += stack_vars[i].size;
>        for (j = i; j != EOC; j = stack_vars[j].next)
> !       SET_DECL_RTL (stack_vars[j].decl, NULL);
>      }
>    return size;
>  }
> --- 1010,1016 ----
>
>        size += stack_vars[i].size;
>        for (j = i; j != EOC; j = stack_vars[j].next)
> !       set_rtl (stack_vars[j].decl, NULL);
>      }
>    return size;
>  }
> *************** expand_one_stack_var (tree var)
> *** 964,971 ****
>  {
>    HOST_WIDE_INT size, offset, align;
>
> !   size = tree_low_cst (DECL_SIZE_UNIT (var), 1);
> !   align = get_decl_align_unit (var);
>    offset = alloc_stack_frame_space (size, align);
>
>    expand_one_stack_var_at (var, offset);
> --- 1023,1030 ----
>  {
>    HOST_WIDE_INT size, offset, align;
>
> !   size = tree_low_cst (DECL_SIZE_UNIT (SSAVAR (var)), 1);
> !   align = get_decl_align_unit (SSAVAR (var));
>    offset = alloc_stack_frame_space (size, align);
>
>    expand_one_stack_var_at (var, offset);
> *************** expand_one_hard_reg_var (tree var)
> *** 986,1005 ****
>  static void
>  expand_one_register_var (tree var)
>  {
> !   tree type = TREE_TYPE (var);
>    int unsignedp = TYPE_UNSIGNED (type);
>    enum machine_mode reg_mode
> !     = promote_mode (type, DECL_MODE (var), &unsignedp, 0);
>    rtx x = gen_reg_rtx (reg_mode);
>
> !   SET_DECL_RTL (var, x);
>
>    /* Note if the object is a user variable.  */
> !   if (!DECL_ARTIFICIAL (var))
> !       mark_user_reg (x);
>
>    if (POINTER_TYPE_P (type))
> !     mark_reg_pointer (x, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (var))));
>  }
>
>  /* A subroutine of expand_one_var.  Called to assign rtl to a VAR_DECL that
> --- 1045,1065 ----
>  static void
>  expand_one_register_var (tree var)
>  {


> *************** struct rtl_opt_pass pass_expand =
> *** 2471,2480 ****
>    0,                                    /* static_pass_number */
>    TV_EXPAND,                          /* tv_id */
>    /* ??? If TER is enabled, we actually receive GENERIC.  */
> !   PROP_gimple_leh | PROP_cfg,           /* properties_required */
>    PROP_rtl,                             /* properties_provided */
> !   PROP_trees,                         /* properties_destroyed */
> !   0,                                    /* todo_flags_start */
> !   TODO_dump_func,                       /* todo_flags_finish */
>   }
>  };
> --- 2644,2655 ----
>    0,                                    /* static_pass_number */
>    TV_EXPAND,                          /* tv_id */
>    /* ??? If TER is enabled, we actually receive GENERIC.  */

This is no longer true ;)

> !   PROP_ssa | PROP_gimple_leh | PROP_cfg,           /* properties_required */
>    PROP_rtl,                             /* properties_provided */
> !   PROP_ssa | PROP_trees,                              /* properties_destroyed */
> !   TODO_verify_ssa | TODO_verify_flow
> !     | TODO_verify_stmts,              /* todo_flags_start */
> !   TODO_dump_func
> !   | TODO_ggc_collect                  /* todo_flags_finish */
>   }
>  };


> Index: tree-mudflap.c
> ===================================================================
> *** tree-mudflap.c      (revision 146576)
> --- tree-mudflap.c      (working copy)
> *************** execute_mudflap_function_ops (void)
> *** 447,452 ****
> --- 447,465 ----
>    return 0;
>  }
>
> + /* Construct a new temporary variable with TYPE
> +    as type and PREFIX as name prefix, add it to referenced vars
> +    and mark it for renaming.  */
> +
> + static tree
> + create_referenced_var (tree type, const char *prefix)
> + {
> +   tree var = create_tmp_var (type, prefix);
> +   add_referenced_var (var);
> +   mark_sym_for_renaming (var);
> +   return var;
> + }

This is exactly the same as make_rename_temp () from tree-dfa.c,
so use that.

>  /* Create and initialize local shadow variables for the lookup cache
>     globals.  Put their decls in the *_l globals for use by
>     mf_build_check_statement_for.  */
> *************** mf_decl_cache_locals (void)
> *** 459,469 ****
>
>    /* Build the cache vars.  */
>    mf_cache_shift_decl_l
> !     = mf_mark (create_tmp_var (TREE_TYPE (mf_cache_shift_decl),
>                                 "__mf_lookup_shift_l"));
>
>    mf_cache_mask_decl_l
> !     = mf_mark (create_tmp_var (TREE_TYPE (mf_cache_mask_decl),
>                                 "__mf_lookup_mask_l"));
>
>    /* Build initialization nodes for the cache vars.  We just load the
> --- 472,482 ----
>
>    /* Build the cache vars.  */
>    mf_cache_shift_decl_l
> !     = mf_mark (create_referenced_var (TREE_TYPE (mf_cache_shift_decl),
>                                 "__mf_lookup_shift_l"));
>
>    mf_cache_mask_decl_l
> !     = mf_mark (create_referenced_var (TREE_TYPE (mf_cache_mask_decl),
>                                 "__mf_lookup_mask_l"));
>
>    /* Build initialization nodes for the cache vars.  We just load the
> *************** mf_build_check_statement_for (tree base,
> *** 546,554 ****
>      }
>
>    /* Build our local variables.  */
> !   mf_elem = create_tmp_var (mf_cache_structptr_type, "__mf_elem");
> !   mf_base = create_tmp_var (mf_uintptr_type, "__mf_base");
> !   mf_limit = create_tmp_var (mf_uintptr_type, "__mf_limit");
>
>    /* Build: __mf_base = (uintptr_t) <base address expression>.  */
>    seq = gimple_seq_alloc ();
> --- 559,567 ----
>      }
>
>    /* Build our local variables.  */
> !   mf_elem = create_referenced_var (mf_cache_structptr_type, "__mf_elem");
> !   mf_base = create_referenced_var (mf_uintptr_type, "__mf_base");
> !   mf_limit = create_referenced_var (mf_uintptr_type, "__mf_limit");
>
>    /* Build: __mf_base = (uintptr_t) <base address expression>.  */
>    seq = gimple_seq_alloc ();
> *************** mf_build_check_statement_for (tree base,
> *** 627,633 ****
>    t = build2 (TRUTH_OR_EXPR, boolean_type_node, t, u);
>    t = force_gimple_operand (t, &stmts, false, NULL_TREE);
>    gimple_seq_add_seq (&seq, stmts);
> !   cond = create_tmp_var (boolean_type_node, "__mf_unlikely_cond");
>    g = gimple_build_assign  (cond, t);
>    gimple_set_location (g, location);
>    gimple_seq_add_stmt (&seq, g);
> --- 640,646 ----
>    t = build2 (TRUTH_OR_EXPR, boolean_type_node, t, u);
>    t = force_gimple_operand (t, &stmts, false, NULL_TREE);
>    gimple_seq_add_seq (&seq, stmts);
> !   cond = create_referenced_var (boolean_type_node, "__mf_unlikely_cond");
>    g = gimple_build_assign  (cond, t);
>    gimple_set_location (g, location);
>    gimple_seq_add_stmt (&seq, g);
> *************** struct gimple_opt_pass pass_mudflap_2 =
> *** 1366,1377 ****
>    NULL,                                 /* next */
>    0,                                    /* static_pass_number */
>    TV_NONE,                              /* tv_id */
> !   PROP_gimple_leh,                      /* properties_required */
>    0,                                    /* properties_provided */
>    0,                                    /* properties_destroyed */
>    0,                                    /* todo_flags_start */
>    TODO_verify_flow | TODO_verify_stmts
> !   | TODO_dump_func                      /* todo_flags_finish */
>   }
>  };
>
> --- 1379,1390 ----
>    NULL,                                 /* next */
>    0,                                    /* static_pass_number */
>    TV_NONE,                              /* tv_id */
> !   PROP_ssa | PROP_cfg | PROP_gimple_leh,/* properties_required */
>    0,                                    /* properties_provided */
>    0,                                    /* properties_destroyed */
>    0,                                    /* todo_flags_start */
>    TODO_verify_flow | TODO_verify_stmts
> !   | TODO_dump_func | TODO_update_ssa    /* todo_flags_finish */
>   }
>  };
>
> Index: tree-ssa-ter.c
> ===================================================================
> *** tree-ssa-ter.c      (revision 146576)
> --- tree-ssa-ter.c      (working copy)
> *************** free_temp_expr_table (temp_expr_table_p
> *** 225,231 ****
>    unsigned x;
>    for (x = 0; x <= num_var_partitions (t->map); x++)
>      gcc_assert (!t->kill_list[x]);
> !   for (x = 0; x < num_ssa_names + 1; x++)
>      {
>        gcc_assert (t->expr_decl_uids[x] == NULL);
>        gcc_assert (t->partition_dependencies[x] == NULL);
> --- 225,231 ----
>    unsigned x;
>    for (x = 0; x <= num_var_partitions (t->map); x++)
>      gcc_assert (!t->kill_list[x]);
> !   for (x = 0; x < num_ssa_names; x++)
>      {
>        gcc_assert (t->expr_decl_uids[x] == NULL);
>        gcc_assert (t->partition_dependencies[x] == NULL);

Obvious, commit with the other similar piece separately.


> Index: tree-ssa.c
> ===================================================================
> *** tree-ssa.c  (revision 146576)
> --- tree-ssa.c  (working copy)
> *************** delete_tree_ssa (void)
> *** 844,850 ****
>
>          gimple_set_modified (stmt, true);
>        }
> !       set_phi_nodes (bb, NULL);
>      }
>
>    /* Remove annotations from every referenced local variable.  */
> --- 844,851 ----
>
>          gimple_set_modified (stmt, true);
>        }
> !       if (!(bb->flags & BB_RTL))
> !       set_phi_nodes (bb, NULL);
>      }
>
>    /* Remove annotations from every referenced local variable.  */
> Index: rtl.h
> ===================================================================
> *** rtl.h       (revision 146576)
> --- rtl.h       (working copy)
> *************** extern rtx gen_int_mode (HOST_WIDE_INT,
> *** 1494,1499 ****
> --- 1494,1500 ----
>  extern rtx emit_copy_of_insn_after (rtx, rtx);
>  extern void set_reg_attrs_from_value (rtx, rtx);
>  extern void set_reg_attrs_for_parm (rtx, rtx);
> + extern void set_reg_attrs_for_decl_rtl (tree t, rtx x);
>  extern void adjust_reg_mode (rtx, enum machine_mode);
>  extern int mem_expr_equal_p (const_tree, const_tree);
>
> Index: tree-optimize.c
> ===================================================================
> *** tree-optimize.c     (revision 146576)
> --- tree-optimize.c     (working copy)
> *************** struct gimple_opt_pass pass_cleanup_cfg_
> *** 201,207 ****
>  {
>   {
>    GIMPLE_PASS,
> !   "final_cleanup",                    /* name */
>    NULL,                                       /* gate */
>    execute_cleanup_cfg_post_optimizing,        /* execute */
>    NULL,                                       /* sub */
> --- 201,207 ----
>  {
>   {
>    GIMPLE_PASS,
> !   "optimized",                        /* name */
>    NULL,                                       /* gate */
>    execute_cleanup_cfg_post_optimizing,        /* execute */
>    NULL,                                       /* sub */
> *************** struct gimple_opt_pass pass_cleanup_cfg_
> *** 213,225 ****
>    0,                                  /* properties_destroyed */
>    0,                                  /* todo_flags_start */
>    TODO_dump_func                      /* todo_flags_finish */
>   }
>  };
>
>  /* Pass: do the actions required to finish with tree-ssa optimization
>     passes.  */
>
> ! static unsigned int
>  execute_free_datastructures (void)
>  {
>    free_dominance_info (CDI_DOMINATORS);
> --- 213,226 ----
>    0,                                  /* properties_destroyed */
>    0,                                  /* todo_flags_start */
>    TODO_dump_func                      /* todo_flags_finish */
> +     | TODO_remove_unused_locals
>   }
>  };
>
>  /* Pass: do the actions required to finish with tree-ssa optimization
>     passes.  */
>
> ! unsigned int
>  execute_free_datastructures (void)
>  {
>    free_dominance_info (CDI_DOMINATORS);
> *************** execute_free_datastructures (void)
> *** 228,233 ****
> --- 229,238 ----
>    /* Remove the ssa structures.  */
>    if (cfun->gimple_df)
>      delete_tree_ssa ();
> +
> +   /* And get rid of annotations we no longer need.  */
> +   delete_tree_cfg_annotations ();
> +
>    return 0;
>  }
>
> *************** struct gimple_opt_pass pass_free_datastr
> *** 254,262 ****
>  static unsigned int
>  execute_free_cfg_annotations (void)
>  {
> -   /* And get rid of annotations we no longer need.  */
> -   delete_tree_cfg_annotations ();
> -
>    return 0;
>  }

It looks like the pass referencing this is now dead.  Please remove
this function and the pass structure.

> [Message clipped]

bah ... ;)  Other half in next mail.

Richard.

  parent reply	other threads:[~2009-04-24 14:21 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-04-13 20:50 RFC: " Michael Matz
2009-04-21 18:23 ` Andrew MacLeod
2009-04-22 10:12   ` Paolo Bonzini
2009-04-22 10:16     ` Richard Guenther
2009-04-22 10:54   ` Michael Matz
2009-04-22 11:20     ` Richard Guenther
2009-04-22 12:34     ` Andrew MacLeod
2009-04-22 16:45     ` [RFA] " Michael Matz
2009-04-23 15:10       ` Andrew MacLeod
2009-04-24  9:42         ` Richard Guenther
2009-04-26 20:27         ` Michael Matz
2010-01-19 15:48           ` H.J. Lu
2009-04-24 14:32       ` Richard Guenther [this message]
2009-04-24 14:46         ` Richard Guenther
2009-04-26 20:21           ` Michael Matz
2009-04-26 20:34             ` Richard Guenther
2009-04-26 20:53               ` Michael Matz
2009-04-26 21:14                 ` Richard Guenther
2009-04-26 21:15                   ` Michael Matz
2009-04-26 21:17                     ` Richard Guenther
2009-04-26 22:21                       ` Michael Matz
2009-04-26 21:42             ` Michael Matz
2009-04-26 22:15               ` Michael Matz
2009-04-27 12:34             ` Michael Matz
2009-04-27  5:47       ` H.J. Lu
2009-04-28 23:49         ` H.J. Lu
2009-04-29  0:21           ` Andrew Pinski
2009-04-30 13:47           ` H.J. Lu
2009-05-29  3:47             ` H.J. Lu
2010-10-20 18:02               ` H.J. Lu
2011-02-14 18:02                 ` H.J. Lu
2009-04-27  7:22       ` Hans-Peter Nilsson
2009-04-30 18:18       ` Steve Ellcey
2009-05-01 17:40         ` Michael Matz
2009-04-27 14:15 David Edelsohn
2009-04-27 14:43 ` H.J. Lu
2009-04-27 15:08 ` Michael Matz
2009-04-27 15:11   ` David Edelsohn
2009-04-27 15:51     ` Michael Matz
2009-04-27 17:03       ` David Edelsohn
2009-04-27 17:27         ` David Edelsohn
2009-04-27 19:15       ` David Edelsohn
2009-04-28  0:48         ` Michael Matz
2009-04-28  0:54           ` Luis Machado
2009-04-28  1:22             ` Michael Matz
2009-04-28 13:24               ` Luis Machado
2009-04-30 17:55               ` Luis Machado
2009-05-01 19:33                 ` Richard Guenther
2009-05-04 13:38                   ` Luis Machado
2009-04-28 16:05           ` David Edelsohn
2009-04-28 16:19             ` Michael Matz
2009-04-28 23:49             ` Michael Matz
2009-04-29  5:50               ` David Edelsohn
2009-04-29 12:48                 ` Michael Matz
2009-04-29 13:21                   ` David Edelsohn
2009-04-29 13:35                     ` Michael Matz
2009-04-29 14:38                   ` David Edelsohn
2009-04-29 14:50                     ` Richard Guenther
2009-04-29 15:03                   ` Andreas Krebbel
2009-04-29 15:11                     ` Michael Matz
2009-04-29 15:40                       ` Andreas Krebbel
2009-04-29 17:33                         ` Michael Matz
2009-04-29 17:41                           ` Michael Matz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=84fc9c000904240721he410b55p9776a1d033f82fc3@mail.gmail.com \
    --to=richard.guenther@gmail.com \
    --cc=abel@ispras.ru \
    --cc=amacleod@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=matz@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).