From patchwork Mon Sep 17 14:07:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 970605 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-485772-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="DvSs4dG0"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 42DSdH1jfHz9sfR for ; Tue, 18 Sep 2018 00:08:03 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:mime-version:content-type; q=dns; s= default; b=mrED63cMbY83Vyg3vHICzOaCbsZDAPE4UN7mcmo2UTLv/8+Liq0kI hec9XJOaahzAIz71Ie5L01F4ZPRIYz+j5iCIn/KX8M8T9K0GM4hIKR5Dr6oTLuhl j2+ULrXaSpUg1HJZkEnRXY+oXytjhOOMDbFDgv/ylF7RrAEQmgU/F4= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:mime-version:content-type; s= default; bh=AVlQXDohS8Yllz16TEkFAxc78aA=; b=DvSs4dG0GUQVoW8mhY9g XaaqaC/9y41droq55uzmI1GT16XW0pufyZA9V0ZJLfRBD7HCHLkiZABA/+1T6ygO CsK6qtD8Ge2g2dNuaVurzNC6wDbZcMUrP4ndhc4xNtjWXMH0EPlql5SP9nW8YlnO a8E7I/HDmQhqqH8Exp5h33E= Received: (qmail 130283 invoked by alias); 17 Sep 2018 14:07:55 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 129926 invoked by uid 89); 17 Sep 2018 14:07:55 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-16.4 required=5.0 tests=BAYES_00, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_NUMSUBJECT, SPF_PASS autolearn=ham version=3.3.2 spammy=holds, saving, bitmaps X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 17 Sep 2018 14:07:53 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 13206AE60 for ; Mon, 17 Sep 2018 14:07:51 +0000 (UTC) Date: Mon, 17 Sep 2018 16:07:51 +0200 (CEST) From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: [PATCH] Fix PR63155 Message-ID: User-Agent: Alpine 2.20 (LSU 67 2015-01-07) MIME-Version: 1.0 The following fixes the memory use at -O0 from out-of-SSA coalescing (conflict computation in particular) with lots of abnormals (setjmp calls). After reviewing I found no reason to not use compute_optimized_partition_bases since we populate the coalesce lists and used_in_copy pieces correctly at -O0 and using compute_optimized_partition_bases avoids having gigantic bases for type-equivalent variables, specifically: - /* This restricts what anonymous SSA names we can coalesce - as it restricts the sets we compute conflicts for. - Using TREE_TYPE to generate sets is the easiest as - type equivalency also holds for SSA names with the same - underlying decl. - - Check gimple_can_coalesce_p when changing this code. */ - m->base.from = (TYPE_CANONICAL (TREE_TYPE (var)) - ? TYPE_CANONICAL (TREE_TYPE (var)) - : TREE_TYPE (var)); but instead uses bases that only include things that we desire to coalesce later. Memory use of the conflict bitmaps is quadratic in the sizes of the base sets so splitting up to more bases is desirable (and doesn't change code generation). {,-O0} Bootstrap and regtest running on x86_64-unknown-linux-gnu. I still have one other memory/compile-time improvement patch but I lack a testcase that shows a measurable difference. Richard. 2018-09-17 Richard Biener PR middle-end/63155 * tree-ssa-coalesce.c (tree_int_map_hasher): Remove. (compute_samebase_partition_bases): Likewise. (coalesce_ssa_name): Always use compute_optimized_partition_bases. Index: gcc/tree-ssa-coalesce.c =================================================================== --- gcc/tree-ssa-coalesce.c (revision 264368) +++ gcc/tree-ssa-coalesce.c (working copy) @@ -1720,89 +1720,6 @@ compute_optimized_partition_bases (var_m partition_delete (tentative); } -/* Hashtable helpers. */ - -struct tree_int_map_hasher : nofree_ptr_hash -{ - static inline hashval_t hash (const tree_int_map *); - static inline bool equal (const tree_int_map *, const tree_int_map *); -}; - -inline hashval_t -tree_int_map_hasher::hash (const tree_int_map *v) -{ - return tree_map_base_hash (v); -} - -inline bool -tree_int_map_hasher::equal (const tree_int_map *v, const tree_int_map *c) -{ - return tree_int_map_eq (v, c); -} - -/* This routine will initialize the basevar fields of MAP with base - names. Partitions will share the same base if they have the same - SSA_NAME_VAR, or, being anonymous variables, the same type. This - must match gimple_can_coalesce_p in the non-optimized case. */ - -static void -compute_samebase_partition_bases (var_map map) -{ - int x, num_part; - tree var; - struct tree_int_map *m, *mapstorage; - - num_part = num_var_partitions (map); - hash_table tree_to_index (num_part); - /* We can have at most num_part entries in the hash tables, so it's - enough to allocate so many map elements once, saving some malloc - calls. */ - mapstorage = m = XNEWVEC (struct tree_int_map, num_part); - - /* If a base table already exists, clear it, otherwise create it. */ - free (map->partition_to_base_index); - map->partition_to_base_index = (int *) xmalloc (sizeof (int) * num_part); - - /* Build the base variable list, and point partitions at their bases. */ - for (x = 0; x < num_part; x++) - { - struct tree_int_map **slot; - unsigned baseindex; - var = partition_to_var (map, x); - if (SSA_NAME_VAR (var) - && (!VAR_P (SSA_NAME_VAR (var)) - || !DECL_IGNORED_P (SSA_NAME_VAR (var)))) - m->base.from = SSA_NAME_VAR (var); - else - /* This restricts what anonymous SSA names we can coalesce - as it restricts the sets we compute conflicts for. - Using TREE_TYPE to generate sets is the easiest as - type equivalency also holds for SSA names with the same - underlying decl. - - Check gimple_can_coalesce_p when changing this code. */ - m->base.from = (TYPE_CANONICAL (TREE_TYPE (var)) - ? TYPE_CANONICAL (TREE_TYPE (var)) - : TREE_TYPE (var)); - /* If base variable hasn't been seen, set it up. */ - slot = tree_to_index.find_slot (m, INSERT); - if (!*slot) - { - baseindex = m - mapstorage; - m->to = baseindex; - *slot = m; - m++; - } - else - baseindex = (*slot)->to; - map->partition_to_base_index[x] = baseindex; - } - - map->num_basevars = m - mapstorage; - - free (mapstorage); -} - /* Given an initial var_map MAP, coalesce variables and return a partition map with the resulting coalesce. Note that this function is called in either live range computation context or out-of-ssa context, indicated by MAP. */ @@ -1824,10 +1741,7 @@ coalesce_ssa_name (var_map map) partition_view_bitmap (map, used_in_copies); - if (flag_tree_coalesce_vars) - compute_optimized_partition_bases (map, used_in_copies, cl); - else - compute_samebase_partition_bases (map); + compute_optimized_partition_bases (map, used_in_copies, cl); if (num_var_partitions (map) < 1) {