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 <rguent...@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)