https://gcc.gnu.org/g:575ff22a2b1165ec584d374ec5eed7f0c48cfd76
commit 575ff22a2b1165ec584d374ec5eed7f0c48cfd76 Author: Michael Matz <[email protected]> Date: Mon Mar 5 02:21:04 2018 +0100 update-stmt: remove add_ssa_op and TLC so, now remove add_ssa_op. Also remove various asserts, factor out free_stmt_use_op, and factor in ensure_vop into sole caller. Diff: --- gcc/tree-ssa-operands.c | 188 ++++++++++-------------------------------------- 1 file changed, 37 insertions(+), 151 deletions(-) diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c index dedf1baf2d68..458fc7b46cb4 100644 --- a/gcc/tree-ssa-operands.c +++ b/gcc/tree-ssa-operands.c @@ -1053,19 +1053,27 @@ find_delink_use_op (gimple *stmt, tree *pop) return NULL; } +static void +free_stmt_use_op (use_optype_p *puse) +{ + use_optype_p use = *puse; + *puse = use->next; + use->next = gimple_ssa_operands (cfun)->free_uses; + gimple_ssa_operands (cfun)->free_uses = use; +} + static void prepend_use_op (gimple *stmt, tree *op) { gimple_statement_with_ops *ops_stmt = dyn_cast <gimple_statement_with_ops *> (stmt); - use_optype_p *insert_point; - use_optype_p new_use; + use_optype_p *insert_point, new_use; new_use = alloc_use (cfun); USE_OP_PTR (new_use)->use = op; link_imm_use_stmt (USE_OP_PTR (new_use), *op, stmt); - /* Ensure vop use is in front. */ insert_point = &ops_stmt->use_ops; + /* Ensure vop use is in front. */ if (!virtual_operand_p (*op) && *insert_point) insert_point = &((*insert_point)->next); new_use->next = *insert_point; @@ -1093,13 +1101,10 @@ update_stmt_use (use_operand_p use) || !*pnewval || is_gimple_min_invariant (*pnewval)); - use_optype_p *puse, stmtuse; + use_optype_p *puse; for (puse = &ops_stmt->use_ops; USE_OP_PTR (*puse) != use; puse = &((*puse)->next)) ; - stmtuse = *puse; - *puse = (*puse)->next; - stmtuse->next = gimple_ssa_operands (cfun)->free_uses; - gimple_ssa_operands (cfun)->free_uses = stmtuse; + free_stmt_use_op (puse); if (gimple_debug_bind_p (stmt) && pnewval == gimple_debug_bind_get_value_ptr (stmt) @@ -1109,10 +1114,7 @@ update_stmt_use (use_operand_p use) start_ssa_stmt_operands (); get_expr_operands (stmt, pnewval, opf_no_vops | opf_use); for (unsigned i = 0; i < build_uses.length (); i++) - { - tree *op = build_uses[i]; - prepend_use_op (stmt, op); - } + prepend_use_op (stmt, build_uses[i]); if (build_flags & BF_RENAME) cfun->gimple_df->ssa_renaming_needed = 1; @@ -1178,8 +1180,6 @@ easy_stmt_p (gimple *stmt, unsigned i) } } -static void ensure_vop (gimple *stmt, int flags); - static int diddle_vops (gimple *stmt, int oldvop, int newvop, unsigned nop) { @@ -1222,110 +1222,26 @@ diddle_vops (gimple *stmt, int oldvop, int newvop, unsigned nop) } gimple_set_vdef (stmt, NULL_TREE); } + else if (newvop >= BF_VDEF && !gimple_vdef (stmt)) + gimple_set_vdef (stmt, gimple_vop (cfun)); if (newvop >= BF_VUSE) { gcc_assert (!is_gimple_debug (stmt)); - ensure_vop (stmt, newvop >= BF_VDEF ? opf_def : opf_use); + if (!gimple_vuse (stmt)) + gimple_set_vuse (stmt, gimple_vop (cfun)); } else if (gimple_vuse (stmt)) gimple_set_vuse (stmt, NULL_TREE); - return 0; -} - -static int -add_ssa_op (gimple *stmt, tree *pop, tree val, unsigned nop, int flags) -{ - use_optype_p *puse, use; - int was_vop = 0, newvop; - if (*pop && SSA_VAR_P (*pop)) - { - puse = find_delink_use_op (stmt, pop); - /* If there's the danger that we replace the last operand that caused - a vop with one that doesn't we need to revisit everything. */ - if (!(flags & opf_no_vops) - && !is_gimple_reg (*pop) && !virtual_operand_p (*pop)) - was_vop = BF_VUSE | ((flags & opf_def) ? BF_VDEF : 0); - use = puse ? *puse : NULL; - } - else - use = NULL; - - if (nop == 1 && gimple_code (stmt) == GIMPLE_CALL) - was_vop = get_call_vop_flags (stmt); - - *pop = val; - - if (val && SSA_VAR_P (val)) - { - if (is_gimple_reg (val) || virtual_operand_p (val)) - { - if (was_vop && diddle_vops (stmt, was_vop, 0, nop) < 0) - return 1; - if (DECL_P (val) && !virtual_operand_p (val)) - cfun->gimple_df->ssa_renaming_needed = 1; - if (flags & opf_def) - gcc_assert (!use); - else - { - if (!use) - prepend_use_op (stmt, pop); - else - link_imm_use_stmt (&(use->use_ptr), *pop, stmt); - } - } - else - { - gcc_assert (!TREE_THIS_VOLATILE (val)); - /* The variable is a memory access. Add virtual operands. */ - ensure_vop (stmt, flags); - } - } - else - { - gcc_assert (!val || is_gimple_min_invariant (val)); - if (use) - { - *puse = use->next; - use->next = gimple_ssa_operands (cfun)->free_uses; - gimple_ssa_operands (cfun)->free_uses = use; - } - newvop = 0; - if (nop == 1 && gimple_code (stmt) == GIMPLE_CALL) - newvop = get_call_vop_flags (stmt); - if (was_vop && diddle_vops (stmt, was_vop, newvop, nop) < 0) - return 1; - } - - return 0; -} - -static void -ensure_vop (gimple *stmt, int flags) -{ - if (flags & opf_no_vops) - { - gcc_assert (!gimple_vuse (stmt)); - return; - } - if (flags & opf_def) - { - if (!gimple_vdef (stmt)) - gimple_set_vdef (stmt, gimple_vop (cfun)); - } - if (!gimple_vuse (stmt)) - gimple_set_vuse (stmt, gimple_vop (cfun)); - if (gimple_vdef (stmt) && TREE_CODE (gimple_vdef (stmt)) != SSA_NAME) - { - cfun->gimple_df->rename_vops = 1; - cfun->gimple_df->ssa_renaming_needed = 1; - } - if (gimple_vuse (stmt) && TREE_CODE (gimple_vuse (stmt)) != SSA_NAME) + if ((gimple_vdef (stmt) && TREE_CODE (gimple_vdef (stmt)) != SSA_NAME) + || (gimple_vuse (stmt) && TREE_CODE (gimple_vuse (stmt)) != SSA_NAME)) { cfun->gimple_df->rename_vops = 1; cfun->gimple_df->ssa_renaming_needed = 1; } + + return 0; } static int @@ -1355,11 +1271,7 @@ exchange_complex_op (gimple *stmt, tree *pop, tree val, unsigned nop, int flags) to DEBUG_BIND (with opcache), so accept that here. */ gcc_assert(is_gimple_debug (stmt)); else if (i) - { - *puse = use->next; - use->next = gimple_ssa_operands (cfun)->free_uses; - gimple_ssa_operands (cfun)->free_uses = use; - } + free_stmt_use_op (puse); } cleanup_build_arrays (); @@ -1387,11 +1299,7 @@ exchange_complex_op (gimple *stmt, tree *pop, tree val, unsigned nop, int flags) i++; } else - { - *puse = use->next; - use->next = gimple_ssa_operands (cfun)->free_uses; - gimple_ssa_operands (cfun)->free_uses = use; - } + free_stmt_use_op (puse); } /* If the op was volatile and now isn't we need to recheck everything. */ @@ -1437,40 +1345,29 @@ gimple_set_vuse (gimple *stmt, tree vuse) mem_ops_stmt->vuse = vuse; else { - //add_ssa_op (stmt, &mem_ops_stmt->vuse, vuse, -1, opf_use); tree *pop = &mem_ops_stmt->vuse; use_optype_p *puse, use; if (*pop && gimple_use_ops (stmt)) { - gcc_assert (SSA_VAR_P (*pop)); - puse = find_delink_use_op (stmt, pop); - gcc_assert (&(dyn_cast <gimple_statement_with_ops *> (stmt))->use_ops == puse); + puse = &mem_ops_stmt->use_ops; + delink_imm_use (&((*puse)->use_ptr)); use = *puse; } else - { - gcc_assert (!gimple_use_ops (stmt) - || gimple_use_ops (stmt)->use_ptr.use != pop); - use = NULL; - } + use = NULL; *pop = vuse; if (vuse) { - gcc_assert (SSA_VAR_P (vuse) && virtual_operand_p (vuse)); if (!use) prepend_use_op (stmt, pop); else link_imm_use_stmt (&(use->use_ptr), *pop, stmt); } else if (use) - { - *puse = use->next; - use->next = gimple_ssa_operands (cfun)->free_uses; - gimple_ssa_operands (cfun)->free_uses = use; - } + free_stmt_use_op (puse); } } @@ -1483,7 +1380,7 @@ do_change_in_op (gimple *gs, tree *op_ptr, tree *pop, tree val) /* GIMPLE_DEBUG only has opcache for debug_bind and operand 1! .*/ || (gimple_debug_bind_p (gs) && i == 1)) { - tree old = *pop; + //tree old = *pop; int flags = opf_use; gasm *asmstmt; if ((i == 0 && (is_gimple_assign (gs) || is_gimple_call (gs))) @@ -1492,26 +1389,15 @@ do_change_in_op (gimple *gs, tree *op_ptr, tree *pop, tree val) flags = opf_def; if (gimple_code (gs) == GIMPLE_DEBUG) flags |= opf_no_vops; - if (flag_try_patch == 2 && pop == op_ptr - && (!old || TREE_CODE (old) == SSA_NAME || is_gimple_val (old)) - && (!val || is_gimple_val (val))) - { - if (add_ssa_op (gs, pop, val, i, flags)) - { -do_full_update: - /*fprintf (stderr, " XXX replace "); - print_generic_expr (stderr, old, TDF_VOPS|TDF_MEMSYMS); - fprintf (stderr, " with "); - print_generic_expr (stderr, val, TDF_VOPS|TDF_MEMSYMS); - fprintf (stderr, " in "); - print_gimple_stmt (stderr, gs, 0, 0);*/ - update_stmt_for_real (gs); - } - } - else + if (exchange_complex_op (gs, pop, val, i, flags)) { - if (exchange_complex_op (gs, pop, val, i, flags)) - goto do_full_update; + /*fprintf (stderr, " XXX replace "); + print_generic_expr (stderr, old, TDF_VOPS|TDF_MEMSYMS); + fprintf (stderr, " with "); + print_generic_expr (stderr, val, TDF_VOPS|TDF_MEMSYMS); + fprintf (stderr, " in "); + print_gimple_stmt (stderr, gs, 0, 0);*/ + update_stmt_for_real (gs); } } else
