diff --git a/gcc/tree-phinodes.cc b/gcc/tree-phinodes.cc index ddd731323e13..5a7e4a94e575 100644 --- a/gcc/tree-phinodes.cc +++ b/gcc/tree-phinodes.cc @@ -223,6 +223,14 @@ release_phi_node (gimple *phi) delink_imm_use (imm); } + /* Immediately return the memory to the allocator when we would + only ever re-use it for a smaller size allocation. */ + if (len - 2 >= NUM_BUCKETS - 2) + { + ggc_free (phi); + return; + } + bucket = len > NUM_BUCKETS - 1 ? NUM_BUCKETS - 1 : len; bucket -= 2; vec_safe_push (free_phinodes[bucket], phi); @@ -445,9 +453,9 @@ remove_phi_node (gimple_stmt_iterator *gsi, bool release_lhs_p) /* 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)); + release_phi_node (phi); } /* Remove all the phi nodes from BB. */ diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index f33629e9b045..984636edbc5f 100644 --- a/gcc/tree-vect-loop.cc +++ b/gcc/tree-vect-loop.cc @@ -10962,8 +10962,8 @@ vectorizable_live_operation (vec_info *vinfo, stmt_vec_info stmt_info, lhs_type, &exit_gsi); auto gsi = gsi_for_stmt (use_stmt); - remove_phi_node (&gsi, false); tree lhs_phi = gimple_phi_result (use_stmt); + remove_phi_node (&gsi, false); gimple *copy = gimple_build_assign (lhs_phi, new_tree); gsi_insert_before (&exit_gsi, copy, GSI_SAME_STMT); break;