void remove_phi_node (tree phi, tree prev) { tree *loc; if (prev) { loc = &PHI_CHAIN (prev); } else { for (loc = &(bb_for_stmt (phi)->phi_nodes); *loc != phi; loc = &PHI_CHAIN (*loc)) ; } /* Remove PHI from the chain. */ *loc = PHI_CHAIN (phi); /* If we are deleting the PHI node, then we should release the SSA_NAME node so that it can be reused. */ release_phi_node (phi); release_ssa_name (PHI_RESULT (phi)); }
void remove_phi_node (gimple_stmt_iterator *gsi, bool release_lhs_p) { gimple phi = gsi_stmt (*gsi); gsi_remove (gsi, false); /* If we are deleting the PHI node, then we should release the SSA_NAME node so that it can be reused. */ release_phi_node (phi); if (release_lhs_p) release_ssa_name (gimple_phi_result (phi)); }
void release_defs (gimple stmt) { tree def; ssa_op_iter iter; /* Make sure that we are in SSA. Otherwise, operand cache may point to garbage. */ gcc_assert (gimple_in_ssa_p (cfun)); FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS) if (TREE_CODE (def) == SSA_NAME) release_ssa_name (def); }
static inline void finalize_ssa_defs (gimple stmt) { unsigned new_i; struct def_optype_d new_list; def_optype_p old_ops, last; unsigned int num = VEC_length (tree, build_defs); /* There should only be a single real definition per assignment. */ gcc_assert ((stmt && gimple_code (stmt) != GIMPLE_ASSIGN) || num <= 1); /* Pre-pend the vdef we may have built. */ if (build_vdef != NULL_TREE) { tree oldvdef = gimple_vdef (stmt); if (oldvdef && TREE_CODE (oldvdef) == SSA_NAME) oldvdef = SSA_NAME_VAR (oldvdef); if (oldvdef != build_vdef) gimple_set_vdef (stmt, build_vdef); VEC_safe_insert (tree, heap, build_defs, 0, (tree)gimple_vdef_ptr (stmt)); ++num; } new_list.next = NULL; last = &new_list; old_ops = gimple_def_ops (stmt); new_i = 0; /* Clear and unlink a no longer necessary VDEF. */ if (build_vdef == NULL_TREE && gimple_vdef (stmt) != NULL_TREE) { if (TREE_CODE (gimple_vdef (stmt)) == SSA_NAME) { unlink_stmt_vdef (stmt); release_ssa_name (gimple_vdef (stmt)); } gimple_set_vdef (stmt, NULL_TREE); } /* If we have a non-SSA_NAME VDEF, mark it for renaming. */ if (gimple_vdef (stmt) && TREE_CODE (gimple_vdef (stmt)) != SSA_NAME) mark_sym_for_renaming (gimple_vdef (stmt)); /* Check for the common case of 1 def that hasn't changed. */ if (old_ops && old_ops->next == NULL && num == 1 && (tree *) VEC_index (tree, build_defs, 0) == DEF_OP_PTR (old_ops)) return; /* If there is anything in the old list, free it. */ if (old_ops) { old_ops->next = gimple_ssa_operands (cfun)->free_defs; gimple_ssa_operands (cfun)->free_defs = old_ops; } /* If there is anything remaining in the build_defs list, simply emit it. */ for ( ; new_i < num; new_i++) last = add_def_op ((tree *) VEC_index (tree, build_defs, new_i), last); /* Now set the stmt's operands. */ gimple_set_def_ops (stmt, new_list.next); }