[PATCH][2/n] Allow anonymous SSA names, a bunch of new predicates for SSA names
Richard Guenther
rguenther@suse.de
Fri Aug 3 12:54:00 GMT 2012
This adds a bunch of new SSA name predicates to remove explicit uses
of SSA_NAME_VAR.
Bootstrapped and tested on x86_64-unknown-linux-gnu.
I'm leaving this for comments. This mainly removes this cases from
explicit covering in further patches.
Richard.
2012-08-03 Richard Guenther <rguenther@suse.de>
* tree.h (SSA_NAME_IS_VIRTUAL_OPERAND): New predicate.
(SSA_NAME_HAS_PARM_OR_RESULT_DECL): Likewise.
(SSA_NAME_HAS_RESULT_DECL): Likewise.
(SSA_NAME_HAS_PARM_DECL): Likewise.
(VAR_PARM_OR_RESULT_DECL_P): Likewise.
(SSA_VAR_P): Simplify.
* tree-ssanames.c (make_ssa_name_fn): Strengthen assert.
* cfgexpand.c (expand_debug_expr): Use SSA_NAME_HAS_PARM_DECL.
* fold-const.c (fold_comparison): Use SSA_NAME_HAS_PARM_DECL.
* gimple.c (is_gimple_reg): Use SSA_NAME_IS_VIRTUAL_OPERAND.
* ipa-inline-analysis.c (unmodified_parm): Use
SSA_NAME_HAS_PARM_DECL.
(eliminated_by_inlining_prob): Use SSA_NAME_HAS_RESULT_DECL.
* ipa-prop.c (get_ancestor_addr_info): Use SSA_NAME_HAS_PARM_DECL.
(ipa_analyze_virtual_call_uses): Likewise.
* ipa-split.c (test_nonssa_use): Use SSA_NAME_HAS_RESULT_DECL.
(consider_split): Likewise.
(mark_nonssa_use): Likewise.
* tree-cfg.c (verify_gimple_return): Likewise.
* tree-complex.c (get_component_ssa_name): Switch default-def
and VAR_DEL check.
* tree-inline.c (remap_ssa_name): Likewise. Use new predicates.
* tree-into-ssa.c (prepare_block_for_update): Use
SSA_NAME_IS_VIRTUAL_OPERAND.
* tree-sra.c (replace_removed_params_ssa_names): Use
SSA_NAME_HAS_PARM_DECL.
* tree-ssa-coalesce.c (create_outofssa_var_map): Use
SSA_NAME_HAS_RESULT_DECL.
* tree-ssa-loop-ivopts.c (parm_decl_cost): Use SSA_NAME_HAS_PARM_DECL.
* tree-ssa-operands.c (add_stmt_operand): Simplify.
* tree-ssa-structalias.c (get_constraint_for_ssa_var): Use
SSA_NAME_HAS_PARM_OR_RESULT_DECL.
(get_fi_for_callee): Likewise.
(find_what_p_points_to): Likewise.
* tree-ssa-uninit.c (ssa_undefined_value_p): Use
SSA_NAME_HAS_RESULT_DECL.
* tree-ssa.c (verify_def): Likewise.
Index: trunk/gcc/cfgexpand.c
===================================================================
*** trunk.orig/gcc/cfgexpand.c 2012-08-03 12:49:33.000000000 +0200
--- trunk/gcc/cfgexpand.c 2012-08-03 13:21:46.695889693 +0200
*************** expand_debug_expr (tree exp)
*** 3360,3366 ****
value is never used in the code, use PARM_DECL's
DECL_RTL if set. */
if (SSA_NAME_IS_DEFAULT_DEF (exp)
! && TREE_CODE (SSA_NAME_VAR (exp)) == PARM_DECL)
{
op0 = expand_debug_parm_decl (SSA_NAME_VAR (exp));
if (op0)
--- 3360,3366 ----
value is never used in the code, use PARM_DECL's
DECL_RTL if set. */
if (SSA_NAME_IS_DEFAULT_DEF (exp)
! && SSA_NAME_HAS_PARM_DECL (exp))
{
op0 = expand_debug_parm_decl (SSA_NAME_VAR (exp));
if (op0)
Index: trunk/gcc/fold-const.c
===================================================================
*** trunk.orig/gcc/fold-const.c 2012-08-03 10:53:58.000000000 +0200
--- trunk/gcc/fold-const.c 2012-08-03 13:21:05.331891126 +0200
*************** fold_comparison (location_t loc, enum tr
*** 8940,8955 ****
&& auto_var_in_fn_p (base0, current_function_decl)
&& !indirect_base1
&& TREE_CODE (base1) == SSA_NAME
! && TREE_CODE (SSA_NAME_VAR (base1)) == PARM_DECL
! && SSA_NAME_IS_DEFAULT_DEF (base1))
|| (TREE_CODE (arg1) == ADDR_EXPR
&& indirect_base1
&& TREE_CODE (base1) == VAR_DECL
&& auto_var_in_fn_p (base1, current_function_decl)
&& !indirect_base0
&& TREE_CODE (base0) == SSA_NAME
! && TREE_CODE (SSA_NAME_VAR (base0)) == PARM_DECL
! && SSA_NAME_IS_DEFAULT_DEF (base0)))
{
if (code == NE_EXPR)
return constant_boolean_node (1, type);
--- 8940,8955 ----
&& auto_var_in_fn_p (base0, current_function_decl)
&& !indirect_base1
&& TREE_CODE (base1) == SSA_NAME
! && SSA_NAME_IS_DEFAULT_DEF (base1)
! && SSA_NAME_HAS_PARM_DECL (base1))
|| (TREE_CODE (arg1) == ADDR_EXPR
&& indirect_base1
&& TREE_CODE (base1) == VAR_DECL
&& auto_var_in_fn_p (base1, current_function_decl)
&& !indirect_base0
&& TREE_CODE (base0) == SSA_NAME
! && SSA_NAME_IS_DEFAULT_DEF (base0)
! && SSA_NAME_HAS_PARM_DECL (base0)))
{
if (code == NE_EXPR)
return constant_boolean_node (1, type);
Index: trunk/gcc/gimple.c
===================================================================
*** trunk.orig/gcc/gimple.c 2012-08-03 12:49:33.000000000 +0200
--- trunk/gcc/gimple.c 2012-08-03 13:01:27.451931909 +0200
*************** bool
*** 2783,2795 ****
is_gimple_reg (tree t)
{
if (TREE_CODE (t) == SSA_NAME)
! {
! t = SSA_NAME_VAR (t);
! if (TREE_CODE (t) == VAR_DECL
! && VAR_DECL_IS_VIRTUAL_OPERAND (t))
! return false;
! return true;
! }
if (TREE_CODE (t) == VAR_DECL
&& VAR_DECL_IS_VIRTUAL_OPERAND (t))
--- 2783,2789 ----
is_gimple_reg (tree t)
{
if (TREE_CODE (t) == SSA_NAME)
! return ! SSA_NAME_IS_VIRTUAL_OPERAND (t);
if (TREE_CODE (t) == VAR_DECL
&& VAR_DECL_IS_VIRTUAL_OPERAND (t))
Index: trunk/gcc/ipa-inline-analysis.c
===================================================================
*** trunk.orig/gcc/ipa-inline-analysis.c 2012-08-03 12:49:33.000000000 +0200
--- trunk/gcc/ipa-inline-analysis.c 2012-08-03 13:22:01.648889182 +0200
*************** unmodified_parm (gimple stmt, tree op)
*** 1271,1277 ****
/* SSA_NAME referring to parm default def? */
if (TREE_CODE (op) == SSA_NAME
&& SSA_NAME_IS_DEFAULT_DEF (op)
! && TREE_CODE (SSA_NAME_VAR (op)) == PARM_DECL)
return SSA_NAME_VAR (op);
/* Non-SSA parm reference? */
if (TREE_CODE (op) == PARM_DECL)
--- 1271,1277 ----
/* SSA_NAME referring to parm default def? */
if (TREE_CODE (op) == SSA_NAME
&& SSA_NAME_IS_DEFAULT_DEF (op)
! && SSA_NAME_HAS_PARM_DECL (op))
return SSA_NAME_VAR (op);
/* Non-SSA parm reference? */
if (TREE_CODE (op) == PARM_DECL)
*************** eliminated_by_inlining_prob (gimple stmt
*** 1394,1402 ****
|| (TREE_CODE(inner_lhs) == MEM_REF
&& (unmodified_parm (stmt, TREE_OPERAND (inner_lhs, 0))
|| (TREE_CODE (TREE_OPERAND (inner_lhs, 0)) == SSA_NAME
! && TREE_CODE (SSA_NAME_VAR
! (TREE_OPERAND (inner_lhs, 0)))
! == RESULT_DECL))))
lhs_free = true;
if (lhs_free
&& (is_gimple_reg (rhs) || is_gimple_min_invariant (rhs)))
--- 1394,1401 ----
|| (TREE_CODE(inner_lhs) == MEM_REF
&& (unmodified_parm (stmt, TREE_OPERAND (inner_lhs, 0))
|| (TREE_CODE (TREE_OPERAND (inner_lhs, 0)) == SSA_NAME
! && SSA_NAME_HAS_RESULT_DECL
! (TREE_OPERAND (inner_lhs, 0))))))
lhs_free = true;
if (lhs_free
&& (is_gimple_reg (rhs) || is_gimple_min_invariant (rhs)))
Index: trunk/gcc/ipa-prop.c
===================================================================
*** trunk.orig/gcc/ipa-prop.c 2012-08-02 13:39:40.000000000 +0200
--- trunk/gcc/ipa-prop.c 2012-08-03 13:23:21.054886415 +0200
*************** get_ancestor_addr_info (gimple assign, t
*** 796,802 ****
parm = TREE_OPERAND (expr, 0);
if (TREE_CODE (parm) != SSA_NAME
|| !SSA_NAME_IS_DEFAULT_DEF (parm)
! || TREE_CODE (SSA_NAME_VAR (parm)) != PARM_DECL)
return NULL_TREE;
*offset += mem_ref_offset (expr).low * BITS_PER_UNIT;
--- 796,802 ----
parm = TREE_OPERAND (expr, 0);
if (TREE_CODE (parm) != SSA_NAME
|| !SSA_NAME_IS_DEFAULT_DEF (parm)
! || !SSA_NAME_HAS_PARM_DECL (parm))
return NULL_TREE;
*offset += mem_ref_offset (expr).low * BITS_PER_UNIT;
*************** ipa_analyze_virtual_call_uses (struct cg
*** 1514,1520 ****
if (SSA_NAME_IS_DEFAULT_DEF (obj))
{
! if (TREE_CODE (SSA_NAME_VAR (obj)) != PARM_DECL)
return;
anc_offset = 0;
--- 1514,1520 ----
if (SSA_NAME_IS_DEFAULT_DEF (obj))
{
! if (!SSA_NAME_HAS_PARM_DECL (obj))
return;
anc_offset = 0;
Index: trunk/gcc/ipa-split.c
===================================================================
*** trunk.orig/gcc/ipa-split.c 2012-08-03 10:54:00.000000000 +0200
--- trunk/gcc/ipa-split.c 2012-08-03 13:24:13.710884591 +0200
*************** test_nonssa_use (gimple stmt ATTRIBUTE_U
*** 157,163 ****
to pretend that the value pointed to is actual result decl. */
if ((TREE_CODE (t) == MEM_REF || INDIRECT_REF_P (t))
&& TREE_CODE (TREE_OPERAND (t, 0)) == SSA_NAME
! && TREE_CODE (SSA_NAME_VAR (TREE_OPERAND (t, 0))) == RESULT_DECL
&& DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
return
bitmap_bit_p ((bitmap)data,
--- 157,163 ----
to pretend that the value pointed to is actual result decl. */
if ((TREE_CODE (t) == MEM_REF || INDIRECT_REF_P (t))
&& TREE_CODE (TREE_OPERAND (t, 0)) == SSA_NAME
! && SSA_NAME_HAS_RESULT_DECL (TREE_OPERAND (t, 0))
&& DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
return
bitmap_bit_p ((bitmap)data,
*************** consider_split (struct split_point *curr
*** 525,531 ****
/* Special case is value returned by reference we record as if it was non-ssa
set to result_decl. */
else if (TREE_CODE (retval) == SSA_NAME
! && TREE_CODE (SSA_NAME_VAR (retval)) == RESULT_DECL
&& DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
current->split_part_set_retval
= bitmap_bit_p (non_ssa_vars, DECL_UID (SSA_NAME_VAR (retval)));
--- 525,531 ----
/* Special case is value returned by reference we record as if it was non-ssa
set to result_decl. */
else if (TREE_CODE (retval) == SSA_NAME
! && SSA_NAME_HAS_RESULT_DECL (retval)
&& DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
current->split_part_set_retval
= bitmap_bit_p (non_ssa_vars, DECL_UID (SSA_NAME_VAR (retval)));
*************** mark_nonssa_use (gimple stmt ATTRIBUTE_U
*** 698,704 ****
to pretend that the value pointed to is actual result decl. */
if ((TREE_CODE (t) == MEM_REF || INDIRECT_REF_P (t))
&& TREE_CODE (TREE_OPERAND (t, 0)) == SSA_NAME
! && TREE_CODE (SSA_NAME_VAR (TREE_OPERAND (t, 0))) == RESULT_DECL
&& DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
return
bitmap_bit_p ((bitmap)data,
--- 698,704 ----
to pretend that the value pointed to is actual result decl. */
if ((TREE_CODE (t) == MEM_REF || INDIRECT_REF_P (t))
&& TREE_CODE (TREE_OPERAND (t, 0)) == SSA_NAME
! && SSA_NAME_HAS_RESULT_DECL (TREE_OPERAND (t, 0))
&& DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
return
bitmap_bit_p ((bitmap)data,
Index: trunk/gcc/tree-cfg.c
===================================================================
*** trunk.orig/gcc/tree-cfg.c 2012-08-03 12:49:33.000000000 +0200
--- trunk/gcc/tree-cfg.c 2012-08-03 13:08:53.232916475 +0200
*************** verify_gimple_return (gimple stmt)
*** 4176,4182 ****
if ((TREE_CODE (op) == RESULT_DECL
&& DECL_BY_REFERENCE (op))
|| (TREE_CODE (op) == SSA_NAME
! && TREE_CODE (SSA_NAME_VAR (op)) == RESULT_DECL
&& DECL_BY_REFERENCE (SSA_NAME_VAR (op))))
op = TREE_TYPE (op);
--- 4176,4182 ----
if ((TREE_CODE (op) == RESULT_DECL
&& DECL_BY_REFERENCE (op))
|| (TREE_CODE (op) == SSA_NAME
! && SSA_NAME_HAS_RESULT_DECL (op)
&& DECL_BY_REFERENCE (SSA_NAME_VAR (op))))
op = TREE_TYPE (op);
Index: trunk/gcc/tree-complex.c
===================================================================
*** trunk.orig/gcc/tree-complex.c 2012-08-02 13:39:40.000000000 +0200
--- trunk/gcc/tree-complex.c 2012-08-03 13:24:36.339883825 +0200
*************** get_component_ssa_name (tree ssa_name, b
*** 495,502 ****
is used in an abnormal phi, and whether it's uninitialized. */
SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ret)
= SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name);
! if (TREE_CODE (SSA_NAME_VAR (ssa_name)) == VAR_DECL
! && SSA_NAME_IS_DEFAULT_DEF (ssa_name))
{
SSA_NAME_DEF_STMT (ret) = SSA_NAME_DEF_STMT (ssa_name);
set_ssa_default_def (cfun, SSA_NAME_VAR (ret), ret);
--- 495,502 ----
is used in an abnormal phi, and whether it's uninitialized. */
SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ret)
= SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name);
! if (SSA_NAME_IS_DEFAULT_DEF (ssa_name)
! && TREE_CODE (SSA_NAME_VAR (ssa_name)) == VAR_DECL)
{
SSA_NAME_DEF_STMT (ret) = SSA_NAME_DEF_STMT (ssa_name);
set_ssa_default_def (cfun, SSA_NAME_VAR (ret), ret);
Index: trunk/gcc/tree-inline.c
===================================================================
*** trunk.orig/gcc/tree-inline.c 2012-08-03 12:49:33.000000000 +0200
--- trunk/gcc/tree-inline.c 2012-08-03 13:26:28.543879939 +0200
*************** remap_ssa_name (tree name, copy_body_dat
*** 187,194 ****
if (processing_debug_stmt)
{
! if (TREE_CODE (SSA_NAME_VAR (name)) == PARM_DECL
! && SSA_NAME_IS_DEFAULT_DEF (name)
&& id->entry_bb == NULL
&& single_succ_p (ENTRY_BLOCK_PTR))
{
--- 187,194 ----
if (processing_debug_stmt)
{
! if (SSA_NAME_IS_DEFAULT_DEF (name)
! && SSA_NAME_HAS_PARM_DECL (name)
&& id->entry_bb == NULL
&& single_succ_p (ENTRY_BLOCK_PTR))
{
*************** remap_ssa_name (tree name, copy_body_dat
*** 229,235 ****
inlining: this saves us from need to introduce PHI node in a case
return value is just partly initialized. */
if ((TREE_CODE (new_tree) == VAR_DECL || TREE_CODE (new_tree) == PARM_DECL)
! && (TREE_CODE (SSA_NAME_VAR (name)) != RESULT_DECL
|| !id->transform_return_to_modify))
{
struct ptr_info_def *pi;
--- 229,235 ----
inlining: this saves us from need to introduce PHI node in a case
return value is just partly initialized. */
if ((TREE_CODE (new_tree) == VAR_DECL || TREE_CODE (new_tree) == PARM_DECL)
! && (!SSA_NAME_HAS_RESULT_DECL (name)
|| !id->transform_return_to_modify))
{
struct ptr_info_def *pi;
*************** remap_ssa_name (tree name, copy_body_dat
*** 259,265 ****
regions of the CFG, but this is expensive to test. */
if (id->entry_bb
&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name)
! && TREE_CODE (SSA_NAME_VAR (name)) != PARM_DECL
&& (id->entry_bb != EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest
|| EDGE_COUNT (id->entry_bb->preds) != 1))
{
--- 259,265 ----
regions of the CFG, but this is expensive to test. */
if (id->entry_bb
&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name)
! && ! SSA_NAME_HAS_PARM_DECL (name)
&& (id->entry_bb != EDGE_SUCC (ENTRY_BLOCK_PTR, 0)->dest
|| EDGE_COUNT (id->entry_bb->preds) != 1))
{
*************** remap_gimple_stmt (gimple stmt, copy_bod
*** 1184,1190 ****
if (retval
&& (TREE_CODE (retval) != RESULT_DECL
&& (TREE_CODE (retval) != SSA_NAME
! || TREE_CODE (SSA_NAME_VAR (retval)) != RESULT_DECL)))
{
copy = gimple_build_assign (id->retvar, retval);
/* id->retvar is already substituted. Skip it on later remapping. */
--- 1184,1190 ----
if (retval
&& (TREE_CODE (retval) != RESULT_DECL
&& (TREE_CODE (retval) != SSA_NAME
! || ! SSA_NAME_HAS_RESULT_DECL (retval))))
{
copy = gimple_build_assign (id->retvar, retval);
/* id->retvar is already substituted. Skip it on later remapping. */
Index: trunk/gcc/tree-into-ssa.c
===================================================================
*** trunk.orig/gcc/tree-into-ssa.c 2012-08-03 12:49:33.000000000 +0200
--- trunk/gcc/tree-into-ssa.c 2012-08-03 13:10:46.630912530 +0200
*************** prepare_block_for_update (basic_block bb
*** 2535,2548 ****
gimple phi = gsi_stmt (si);
tree lhs_sym, lhs = gimple_phi_result (phi);
- lhs_sym = DECL_P (lhs) ? lhs : SSA_NAME_VAR (lhs);
-
if (TREE_CODE (lhs) == SSA_NAME
! && (TREE_CODE (lhs_sym) != VAR_DECL
! || !VAR_DECL_IS_VIRTUAL_OPERAND (lhs_sym)
! || !cfun->gimple_df->rename_vops))
continue;
mark_for_renaming (lhs_sym);
mark_def_interesting (lhs_sym, phi, bb, insert_phi_p);
--- 2535,2546 ----
gimple phi = gsi_stmt (si);
tree lhs_sym, lhs = gimple_phi_result (phi);
if (TREE_CODE (lhs) == SSA_NAME
! && (! SSA_NAME_IS_VIRTUAL_OPERAND (lhs)
! || ! cfun->gimple_df->rename_vops))
continue;
+ lhs_sym = DECL_P (lhs) ? lhs : SSA_NAME_VAR (lhs);
mark_for_renaming (lhs_sym);
mark_def_interesting (lhs_sym, phi, bb, insert_phi_p);
Index: trunk/gcc/tree-sra.c
===================================================================
*** trunk.orig/gcc/tree-sra.c 2012-08-03 12:49:33.000000000 +0200
--- trunk/gcc/tree-sra.c 2012-08-03 13:17:21.183898915 +0200
*************** replace_removed_params_ssa_names (gimple
*** 4234,4245 ****
else
gcc_unreachable ();
! if (TREE_CODE (lhs) != SSA_NAME)
! return false;
! decl = SSA_NAME_VAR (lhs);
! if (TREE_CODE (decl) != PARM_DECL)
return false;
adj = get_adjustment_for_base (adjustments, decl);
if (!adj)
return false;
--- 4234,4244 ----
else
gcc_unreachable ();
! if (TREE_CODE (lhs) != SSA_NAME
! || ! SSA_NAME_HAS_PARM_DECL (lhs))
return false;
+ decl = SSA_NAME_VAR (lhs);
adj = get_adjustment_for_base (adjustments, decl);
if (!adj)
return false;
Index: trunk/gcc/tree-ssa-coalesce.c
===================================================================
*** trunk.orig/gcc/tree-ssa-coalesce.c 2012-08-03 12:49:33.000000000 +0200
--- trunk/gcc/tree-ssa-coalesce.c 2012-08-03 13:08:05.407918128 +0200
*************** create_outofssa_var_map (coalesce_list_p
*** 1130,1136 ****
if (var != NULL_TREE && is_gimple_reg (var))
{
/* Add coalesces between all the result decls. */
! if (TREE_CODE (SSA_NAME_VAR (var)) == RESULT_DECL)
{
if (first == NULL_TREE)
first = var;
--- 1130,1136 ----
if (var != NULL_TREE && is_gimple_reg (var))
{
/* Add coalesces between all the result decls. */
! if (SSA_NAME_HAS_RESULT_DECL (var))
{
if (first == NULL_TREE)
first = var;
Index: trunk/gcc/tree-ssa-loop-ivopts.c
===================================================================
*** trunk.orig/gcc/tree-ssa-loop-ivopts.c 2012-08-03 12:49:33.000000000 +0200
--- trunk/gcc/tree-ssa-loop-ivopts.c 2012-08-03 13:15:30.095902735 +0200
*************** parm_decl_cost (struct ivopts_data *data
*** 4657,4664 ****
STRIP_NOPS (sbound);
if (TREE_CODE (sbound) == SSA_NAME
! && TREE_CODE (SSA_NAME_VAR (sbound)) == PARM_DECL
! && gimple_nop_p (SSA_NAME_DEF_STMT (sbound))
&& data->body_includes_call)
return COSTS_N_INSNS (1);
--- 4657,4664 ----
STRIP_NOPS (sbound);
if (TREE_CODE (sbound) == SSA_NAME
! && SSA_NAME_IS_DEFAULT_DEF (sbound)
! && SSA_NAME_HAS_PARM_DECL (sbound)
&& data->body_includes_call)
return COSTS_N_INSNS (1);
Index: trunk/gcc/tree-ssa-operands.c
===================================================================
*** trunk.orig/gcc/tree-ssa-operands.c 2012-08-03 12:49:33.000000000 +0200
--- trunk/gcc/tree-ssa-operands.c 2012-08-03 13:04:44.771925081 +0200
*************** add_virtual_operand (gimple stmt ATTRIBU
*** 626,644 ****
static void
add_stmt_operand (tree *var_p, gimple stmt, int flags)
{
! tree var, sym;
gcc_assert (SSA_VAR_P (*var_p));
! var = *var_p;
! sym = (TREE_CODE (var) == SSA_NAME ? SSA_NAME_VAR (var) : var);
!
! /* Mark statements with volatile operands. */
! if (!(flags & opf_no_vops)
! && TREE_THIS_VOLATILE (sym))
! gimple_set_has_volatile_ops (stmt, true);
!
! if (is_gimple_reg (sym))
{
/* The variable is a GIMPLE register. Add it to real operands. */
if (flags & opf_def)
--- 626,636 ----
static void
add_stmt_operand (tree *var_p, gimple stmt, int flags)
{
! tree var = *var_p;
gcc_assert (SSA_VAR_P (*var_p));
! if (is_gimple_reg (var))
{
/* The variable is a GIMPLE register. Add it to real operands. */
if (flags & opf_def)
*************** add_stmt_operand (tree *var_p, gimple st
*** 647,653 ****
append_use (var_p);
}
else
! add_virtual_operand (stmt, flags);
}
/* Mark the base address of REF as having its address taken.
--- 639,653 ----
append_use (var_p);
}
else
! {
! /* Mark statements with volatile operands. */
! if (!(flags & opf_no_vops)
! && TREE_THIS_VOLATILE (var))
! gimple_set_has_volatile_ops (stmt, true);
!
! /* The variable is a memory access. Add virtual operands. */
! add_virtual_operand (stmt, flags);
! }
}
/* Mark the base address of REF as having its address taken.
Index: trunk/gcc/tree-ssa-structalias.c
===================================================================
*** trunk.orig/gcc/tree-ssa-structalias.c 2012-08-03 12:49:33.000000000 +0200
--- trunk/gcc/tree-ssa-structalias.c 2012-08-03 13:28:00.464876746 +0200
*************** get_constraint_for_ssa_var (tree t, VEC(
*** 2742,2749 ****
decl. */
if (TREE_CODE (t) == SSA_NAME
&& SSA_NAME_IS_DEFAULT_DEF (t)
! && (TREE_CODE (SSA_NAME_VAR (t)) == PARM_DECL
! || TREE_CODE (SSA_NAME_VAR (t)) == RESULT_DECL))
{
get_constraint_for_ssa_var (SSA_NAME_VAR (t), results, address_p);
return;
--- 2742,2748 ----
decl. */
if (TREE_CODE (t) == SSA_NAME
&& SSA_NAME_IS_DEFAULT_DEF (t)
! && SSA_NAME_HAS_PARM_OR_RESULT_DECL (t))
{
get_constraint_for_ssa_var (SSA_NAME_VAR (t), results, address_p);
return;
*************** get_fi_for_callee (gimple call)
*** 3976,3984 ****
if (!fn || TREE_CODE (fn) != SSA_NAME)
return get_varinfo (anything_id);
! if ((TREE_CODE (SSA_NAME_VAR (fn)) == PARM_DECL
! || TREE_CODE (SSA_NAME_VAR (fn)) == RESULT_DECL)
! && SSA_NAME_IS_DEFAULT_DEF (fn))
fn = SSA_NAME_VAR (fn);
return get_vi_for_tree (fn);
--- 3975,3982 ----
if (!fn || TREE_CODE (fn) != SSA_NAME)
return get_varinfo (anything_id);
! if (SSA_NAME_IS_DEFAULT_DEF (fn)
! && SSA_NAME_HAS_PARM_OR_RESULT_DECL (fn))
fn = SSA_NAME_VAR (fn);
return get_vi_for_tree (fn);
*************** find_what_p_points_to (tree p)
*** 5915,5923 ****
/* For parameters, get at the points-to set for the actual parm
decl. */
if (TREE_CODE (p) == SSA_NAME
! && (TREE_CODE (SSA_NAME_VAR (p)) == PARM_DECL
! || TREE_CODE (SSA_NAME_VAR (p)) == RESULT_DECL)
! && SSA_NAME_IS_DEFAULT_DEF (p))
lookup_p = SSA_NAME_VAR (p);
vi = lookup_vi_for_tree (lookup_p);
--- 5913,5920 ----
/* For parameters, get at the points-to set for the actual parm
decl. */
if (TREE_CODE (p) == SSA_NAME
! && SSA_NAME_IS_DEFAULT_DEF (p)
! && SSA_NAME_HAS_PARM_OR_RESULT_DECL (p))
lookup_p = SSA_NAME_VAR (p);
vi = lookup_vi_for_tree (lookup_p);
Index: trunk/gcc/tree-ssa-uninit.c
===================================================================
*** trunk.orig/gcc/tree-ssa-uninit.c 2012-08-03 12:49:33.000000000 +0200
--- trunk/gcc/tree-ssa-uninit.c 2012-08-03 13:13:10.382907565 +0200
*************** ssa_undefined_value_p (tree t)
*** 89,95 ****
/* When returning by reference the return address is actually a hidden
parameter. */
! if (TREE_CODE (SSA_NAME_VAR (t)) == RESULT_DECL
&& DECL_BY_REFERENCE (SSA_NAME_VAR (t)))
return false;
--- 89,95 ----
/* When returning by reference the return address is actually a hidden
parameter. */
! if (SSA_NAME_HAS_RESULT_DECL (t)
&& DECL_BY_REFERENCE (SSA_NAME_VAR (t)))
return false;
Index: trunk/gcc/tree-ssa.c
===================================================================
*** trunk.orig/gcc/tree-ssa.c 2012-08-03 12:49:33.000000000 +0200
--- trunk/gcc/tree-ssa.c 2012-08-03 13:06:43.104920973 +0200
*************** verify_def (basic_block bb, basic_block
*** 681,687 ****
if (verify_ssa_name (ssa_name, is_virtual))
goto err;
! if (TREE_CODE (SSA_NAME_VAR (ssa_name)) == RESULT_DECL
&& DECL_BY_REFERENCE (SSA_NAME_VAR (ssa_name)))
{
error ("RESULT_DECL should be read only when DECL_BY_REFERENCE is set");
--- 681,687 ----
if (verify_ssa_name (ssa_name, is_virtual))
goto err;
! if (SSA_NAME_HAS_RESULT_DECL (ssa_name)
&& DECL_BY_REFERENCE (SSA_NAME_VAR (ssa_name)))
{
error ("RESULT_DECL should be read only when DECL_BY_REFERENCE is set");
Index: trunk/gcc/tree-ssanames.c
===================================================================
*** trunk.orig/gcc/tree-ssanames.c 2012-08-03 12:49:33.000000000 +0200
--- trunk/gcc/tree-ssanames.c 2012-08-03 12:52:24.443950711 +0200
*************** make_ssa_name_fn (struct function *fn, t
*** 118,124 ****
tree t;
use_operand_p imm;
! gcc_assert (DECL_P (var));
/* If our free list has an element, then use it. */
if (!VEC_empty (tree, FREE_SSANAMES (fn)))
--- 118,124 ----
tree t;
use_operand_p imm;
! gcc_assert (VAR_PARM_OR_RESULT_DECL_P (var));
/* If our free list has an element, then use it. */
if (!VEC_empty (tree, FREE_SSANAMES (fn)))
Index: trunk/gcc/tree.h
===================================================================
*** trunk.orig/gcc/tree.h 2012-08-03 12:49:33.000000000 +0200
--- trunk/gcc/tree.h 2012-08-03 13:13:56.369905981 +0200
*************** struct GTY(()) tree_exp {
*** 2011,2016 ****
--- 2011,2033 ----
#define SSA_NAME_IS_DEFAULT_DEF(NODE) \
SSA_NAME_CHECK (NODE)->base.default_def_flag
+ /* Nonzero if this SSA_NAME is a virtual operand. */
+ #define SSA_NAME_IS_VIRTUAL_OPERAND(NODE) \
+ (! SSA_NAME_HAS_PARM_OR_RESULT_DECL(NODE) \
+ && VAR_DECL_IS_VIRTUAL_OPERAND (SSA_NAME_VAR (NODE)))
+
+ /* Nonzero if this SSA_NAME represents a PARM_DECL or a RESULT_DECL. */
+ #define SSA_NAME_HAS_PARM_OR_RESULT_DECL(NODE) \
+ (TREE_CODE (SSA_NAME_VAR (NODE)) != VAR_DECL)
+
+ /* Nonzero if this SSA_NAME represents a RESULT_DECL. */
+ #define SSA_NAME_HAS_RESULT_DECL(NODE) \
+ (TREE_CODE (SSA_NAME_VAR (NODE)) == RESULT_DECL)
+
+ /* Nonzero if this SSA_NAME represents a PARM_DECL. */
+ #define SSA_NAME_HAS_PARM_DECL(NODE) \
+ (TREE_CODE (SSA_NAME_VAR (NODE)) == PARM_DECL)
+
/* Attributes for SSA_NAMEs for pointer-type variables. */
#define SSA_NAME_PTR_INFO(N) \
SSA_NAME_CHECK (N)->ssa_name.ptr_info
*************** struct GTY (()) tree_binfo {
*** 2635,2650 ****
/* Define fields and accessors for nodes representing declared names. */
! /* Nonzero if DECL represents a variable for the SSA passes. */
! #define SSA_VAR_P(DECL) \
(TREE_CODE (DECL) == VAR_DECL \
|| TREE_CODE (DECL) == PARM_DECL \
! || TREE_CODE (DECL) == RESULT_DECL \
! || (TREE_CODE (DECL) == SSA_NAME \
! && (TREE_CODE (SSA_NAME_VAR (DECL)) == VAR_DECL \
! || TREE_CODE (SSA_NAME_VAR (DECL)) == PARM_DECL \
! || TREE_CODE (SSA_NAME_VAR (DECL)) == RESULT_DECL)))
--- 2652,2668 ----
/* Define fields and accessors for nodes representing declared names. */
! /* Nonzero if DECL represents a VAR_DECL, PARM_DECL or RESULT_DECL. */
! #define VAR_PARM_OR_RESULT_DECL_P(DECL) \
(TREE_CODE (DECL) == VAR_DECL \
|| TREE_CODE (DECL) == PARM_DECL \
! || TREE_CODE (DECL) == RESULT_DECL)
+ /* Nonzero if DECL represents an SSA name or a variable that can possibly
+ have an associated SSA name. */
+ #define SSA_VAR_P(DECL) \
+ (VAR_PARM_OR_RESULT_DECL_P (DECL) \
+ || TREE_CODE (DECL) == SSA_NAME)
More information about the Gcc-patches
mailing list