From patchwork Tue May 7 09:48:54 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 1932365 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=xTfqooPW; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=uXSJq3NP; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=xTfqooPW; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=uXSJq3NP; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4VYYQT30kBz1xnS for ; Tue, 7 May 2024 19:49:21 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 822E3385B529 for ; Tue, 7 May 2024 09:49:19 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.223.130]) by sourceware.org (Postfix) with ESMTPS id B51D63858D35 for ; Tue, 7 May 2024 09:48:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B51D63858D35 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org B51D63858D35 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=195.135.223.130 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715075338; cv=none; b=LPyw3DquntoLI9kMyPFjywWpJ59U/YPFEV2MQ2EwBvlGcHoAtPa3Lkc5LePvbnCJVIGeJCwWsktveBfP1ZtqJ5yAhyaJO1bCE3ejc9HQtHcPcCnSlpfp4XrmMLJbnWOl3S/hLoOZk8kicgCTAwCcr2WbbaUTNLJZMZFIAfysLxY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715075338; c=relaxed/simple; bh=ktZ1uIDGYypWWfM5K6xao6iUx6VnFqjX10/y9lWKE7Q=; h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:Date: From:To:Subject:MIME-Version; b=Y6ppsULWAyHem7cFxesWfSTHq+3nd8udNqpBcyCYQRqOAGDmSa6FXAflJojpBqbR+mJQr+q+zOHTrCFLwT+9feogh00xFshbVyJLj5bgjN9/AMNDk+bhSuylnReNjs05wmYmfI0x/tQC0F+2BjlSw+x77mLfd/ojD0+RkWyPDoA= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from [10.168.5.241] (unknown [10.168.5.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 8DC3533CA3 for ; Tue, 7 May 2024 09:48:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1715075334; h=from:from:reply-to:date:date:to:to:cc:mime-version:mime-version: content-type:content-type; bh=AwzZSl4RMZPh3qKSN1BASgVY6rZSim6V0CjVJweQ6PM=; b=xTfqooPWQ6Wtk4a6E7XfUUOjVX0Su6E67gDu8nElg7EBU6xxYJROJBtuplphpkyQ3Hzm6a 6WVMsm0vslpN2Kcj1PLpdd0Z3rL8TepfZccZv4/BGngQanb7WybWAEYFnpBVlsH4eWxNdT qGiPidy6z7ZJ/jt8e64M18JBJD9Q6/c= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1715075334; h=from:from:reply-to:date:date:to:to:cc:mime-version:mime-version: content-type:content-type; bh=AwzZSl4RMZPh3qKSN1BASgVY6rZSim6V0CjVJweQ6PM=; b=uXSJq3NPH4xwmJrjoxynxu0RYZINk2skTUihh8Lka9XCkhuh2m2VRj08MRjchw3Z+wOyYN 5tz51fE8xAUuvYBA== Authentication-Results: smtp-out1.suse.de; none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1715075334; h=from:from:reply-to:date:date:to:to:cc:mime-version:mime-version: content-type:content-type; bh=AwzZSl4RMZPh3qKSN1BASgVY6rZSim6V0CjVJweQ6PM=; b=xTfqooPWQ6Wtk4a6E7XfUUOjVX0Su6E67gDu8nElg7EBU6xxYJROJBtuplphpkyQ3Hzm6a 6WVMsm0vslpN2Kcj1PLpdd0Z3rL8TepfZccZv4/BGngQanb7WybWAEYFnpBVlsH4eWxNdT qGiPidy6z7ZJ/jt8e64M18JBJD9Q6/c= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1715075334; h=from:from:reply-to:date:date:to:to:cc:mime-version:mime-version: content-type:content-type; bh=AwzZSl4RMZPh3qKSN1BASgVY6rZSim6V0CjVJweQ6PM=; b=uXSJq3NPH4xwmJrjoxynxu0RYZINk2skTUihh8Lka9XCkhuh2m2VRj08MRjchw3Z+wOyYN 5tz51fE8xAUuvYBA== Date: Tue, 7 May 2024 11:48:54 +0200 (CEST) From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: [PATCH] Use unsigned for stack var indexes during RTL expansion MIME-Version: 1.0 X-Spam-Score: -1.80 X-Spam-Level: X-Spamd-Result: default: False [-1.80 / 50.00]; BAYES_HAM(-3.00)[100.00%]; MISSING_MID(2.50)[]; NEURAL_HAM_LONG(-1.00)[-0.995]; NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; ARC_NA(0.00)[]; RCPT_COUNT_ONE(0.00)[1]; FUZZY_BLOCKED(0.00)[rspamd.com]; TO_MATCH_ENVRCPT_ALL(0.00)[]; FROM_HAS_DN(0.00)[]; RCVD_COUNT_ZERO(0.00)[0]; MISSING_XM_UA(0.00)[]; FROM_EQ_ENVFROM(0.00)[]; TO_DN_NONE(0.00)[]; MIME_TRACE(0.00)[0:+] X-Spam-Status: No, score=-10.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, MISSING_MID, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Message-Id: <20240507094919.822E3385B529@sourceware.org> We're currently using size_t but at the same time storing them into bitmaps which only support unsigned int index. The following makes it unsigned int throughout, saving memory as well. Re-bootstrap and regtest running on x86_64-unknown-linux-gnu. Richard. * cfgexpand.cc (stack_var::representative): Use 'unsigned' for stack var indexes instead of 'size_t'. (stack_var::next): Likewise. (EOC): Likewise. (stack_vars_alloc): Likewise. (stack_vars_num): Likewise. (decl_to_stack_part): Likewise. (stack_vars_sorted): Likewise. (add_stack_var): Likewise. (add_stack_var_conflict): Likewise. (stack_var_conflict_p): Likewise. (visit_op): Likewise. (visit_conflict): Likewise. (add_scope_conflicts_1): Likewise. (stack_var_cmp): Likewise. (part_hashmap): Likewise. (update_alias_info_with_stack_vars): Likewise. (union_stack_vars): Likewise. (partition_stack_vars): Likewise. (dump_stack_var_partition): Likewise. (expand_stack_vars): Likewise. (account_stack_vars): Likewise. (stack_protect_decl_phase_1): Likewise. (stack_protect_decl_phase_2): Likewise. (asan_decl_phase_3): Likewise. (init_vars_expansion): Likewise. (estimated_stack_frame_size): Likewise. --- gcc/cfgexpand.cc | 75 ++++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc index afee064aa15..557cb28733b 100644 --- a/gcc/cfgexpand.cc +++ b/gcc/cfgexpand.cc @@ -320,22 +320,22 @@ public: unsigned int alignb; /* The partition representative. */ - size_t representative; + unsigned representative; /* The next stack variable in the partition, or EOC. */ - size_t next; + unsigned next; /* The numbers of conflicting stack variables. */ bitmap conflicts; }; -#define EOC ((size_t)-1) +#define EOC ((unsigned)-1) /* We have an array of such objects while deciding allocation. */ static class stack_var *stack_vars; -static size_t stack_vars_alloc; -static size_t stack_vars_num; -static hash_map *decl_to_stack_part; +static unsigned stack_vars_alloc; +static unsigned stack_vars_num; +static hash_map *decl_to_stack_part; /* Conflict bitmaps go on this obstack. This allows us to destroy all of them in one big sweep. */ @@ -343,7 +343,7 @@ static bitmap_obstack stack_var_bitmap_obstack; /* An array of indices such that stack_vars[stack_vars_sorted[i]].size is non-decreasing. */ -static size_t *stack_vars_sorted; +static unsigned *stack_vars_sorted; /* The phase of the stack frame. This is the known misalignment of virtual_stack_vars_rtx from PREFERRED_STACK_BOUNDARY. That is, @@ -457,7 +457,7 @@ add_stack_var (tree decl, bool really_expand) = XRESIZEVEC (class stack_var, stack_vars, stack_vars_alloc); } if (!decl_to_stack_part) - decl_to_stack_part = new hash_map; + decl_to_stack_part = new hash_map; v = &stack_vars[stack_vars_num]; decl_to_stack_part->put (decl, stack_vars_num); @@ -491,7 +491,7 @@ add_stack_var (tree decl, bool really_expand) /* Make the decls associated with luid's X and Y conflict. */ static void -add_stack_var_conflict (size_t x, size_t y) +add_stack_var_conflict (unsigned x, unsigned y) { class stack_var *a = &stack_vars[x]; class stack_var *b = &stack_vars[y]; @@ -508,7 +508,7 @@ add_stack_var_conflict (size_t x, size_t y) /* Check whether the decls associated with luid's X and Y conflict. */ static bool -stack_var_conflict_p (size_t x, size_t y) +stack_var_conflict_p (unsigned x, unsigned y) { class stack_var *a = &stack_vars[x]; class stack_var *b = &stack_vars[y]; @@ -537,7 +537,7 @@ visit_op (gimple *, tree op, tree, void *data) && DECL_P (op) && DECL_RTL_IF_SET (op) == pc_rtx) { - size_t *v = decl_to_stack_part->get (op); + unsigned *v = decl_to_stack_part->get (op); if (v) bitmap_set_bit (active, *v); } @@ -557,10 +557,10 @@ visit_conflict (gimple *, tree op, tree, void *data) && DECL_P (op) && DECL_RTL_IF_SET (op) == pc_rtx) { - size_t *v = decl_to_stack_part->get (op); + unsigned *v = decl_to_stack_part->get (op); if (v && bitmap_set_bit (active, *v)) { - size_t num = *v; + unsigned num = *v; bitmap_iterator bi; unsigned i; gcc_assert (num < stack_vars_num); @@ -627,7 +627,7 @@ add_scope_conflicts_1 (basic_block bb, bitmap work, bool for_conflict) if (gimple_clobber_p (stmt)) { tree lhs = gimple_assign_lhs (stmt); - size_t *v; + unsigned *v; /* Nested function lowering might introduce LHSs that are COMPONENT_REFs. */ if (!VAR_P (lhs)) @@ -743,8 +743,8 @@ add_scope_conflicts (void) static int stack_var_cmp (const void *a, const void *b) { - size_t ia = *(const size_t *)a; - size_t ib = *(const size_t *)b; + unsigned ia = *(const unsigned *)a; + unsigned ib = *(const unsigned *)b; unsigned int aligna = stack_vars[ia].alignb; unsigned int alignb = stack_vars[ib].alignb; poly_int64 sizea = stack_vars[ia].size; @@ -792,8 +792,8 @@ stack_var_cmp (const void *a, const void *b) return 0; } -struct part_traits : unbounded_int_hashmap_traits {}; -typedef hash_map part_hashmap; +struct part_traits : unbounded_int_hashmap_traits {}; +typedef hash_map part_hashmap; /* If the points-to solution *PI points to variables that are in a partition together with other variables add all partition members to the pointed-to @@ -844,7 +844,7 @@ static void update_alias_info_with_stack_vars (void) { part_hashmap *decls_to_partitions = NULL; - size_t i, j; + unsigned i, j; tree var = NULL_TREE; for (i = 0; i < stack_vars_num; i++) @@ -923,7 +923,7 @@ update_alias_info_with_stack_vars (void) Merge them into a single partition A. */ static void -union_stack_vars (size_t a, size_t b) +union_stack_vars (unsigned a, unsigned b) { class stack_var *vb = &stack_vars[b]; bitmap_iterator bi; @@ -969,20 +969,20 @@ union_stack_vars (size_t a, size_t b) static void partition_stack_vars (void) { - size_t si, sj, n = stack_vars_num; + unsigned si, sj, n = stack_vars_num; - stack_vars_sorted = XNEWVEC (size_t, stack_vars_num); + stack_vars_sorted = XNEWVEC (unsigned, stack_vars_num); for (si = 0; si < n; ++si) stack_vars_sorted[si] = si; if (n == 1) return; - qsort (stack_vars_sorted, n, sizeof (size_t), stack_var_cmp); + qsort (stack_vars_sorted, n, sizeof (unsigned), stack_var_cmp); for (si = 0; si < n; ++si) { - size_t i = stack_vars_sorted[si]; + unsigned i = stack_vars_sorted[si]; unsigned int ialign = stack_vars[i].alignb; poly_int64 isize = stack_vars[i].size; @@ -994,7 +994,7 @@ partition_stack_vars (void) for (sj = si + 1; sj < n; ++sj) { - size_t j = stack_vars_sorted[sj]; + unsigned j = stack_vars_sorted[sj]; unsigned int jalign = stack_vars[j].alignb; poly_int64 jsize = stack_vars[j].size; @@ -1034,7 +1034,7 @@ partition_stack_vars (void) static void dump_stack_var_partition (void) { - size_t si, i, j, n = stack_vars_num; + unsigned si, i, j, n = stack_vars_num; for (si = 0; si < n; ++si) { @@ -1044,8 +1044,7 @@ dump_stack_var_partition (void) if (stack_vars[i].representative != i) continue; - fprintf (dump_file, "Partition " HOST_SIZE_T_PRINT_UNSIGNED ": size ", - (fmt_size_t) i); + fprintf (dump_file, "Partition %u: size ", i); print_dec (stack_vars[i].size, dump_file); fprintf (dump_file, " align %u\n", stack_vars[i].alignb); @@ -1128,9 +1127,9 @@ public: a unique location within the stack frame. Update each partition member with that location. */ static void -expand_stack_vars (bool (*pred) (size_t), class stack_vars_data *data) +expand_stack_vars (bool (*pred) (unsigned), class stack_vars_data *data) { - size_t si, i, j, n = stack_vars_num; + unsigned si, i, j, n = stack_vars_num; poly_uint64 large_size = 0, large_alloc = 0; rtx large_base = NULL; rtx large_untagged_base = NULL; @@ -1398,7 +1397,7 @@ expand_stack_vars (bool (*pred) (size_t), class stack_vars_data *data) static poly_uint64 account_stack_vars (void) { - size_t si, j, i, n = stack_vars_num; + unsigned si, j, i, n = stack_vars_num; poly_uint64 size = 0; for (si = 0; si < n; ++si) @@ -2028,13 +2027,13 @@ stack_protect_decl_phase (tree decl) as callbacks for expand_stack_vars. */ static bool -stack_protect_decl_phase_1 (size_t i) +stack_protect_decl_phase_1 (unsigned i) { return stack_protect_decl_phase (stack_vars[i].decl) == 1; } static bool -stack_protect_decl_phase_2 (size_t i) +stack_protect_decl_phase_2 (unsigned i) { return stack_protect_decl_phase (stack_vars[i].decl) == 2; } @@ -2044,7 +2043,7 @@ stack_protect_decl_phase_2 (size_t i) Returns true if any of the vars in the partition need to be protected. */ static bool -asan_decl_phase_3 (size_t i) +asan_decl_phase_3 (unsigned i) { while (i != EOC) { @@ -2062,7 +2061,7 @@ asan_decl_phase_3 (size_t i) static bool add_stack_protection_conflicts (void) { - size_t i, j, n = stack_vars_num; + unsigned i, j, n = stack_vars_num; unsigned char *phase; bool ret = false; @@ -2107,7 +2106,7 @@ init_vars_expansion (void) bitmap_obstack_initialize (&stack_var_bitmap_obstack); /* A map from decl to stack partition. */ - decl_to_stack_part = new hash_map; + decl_to_stack_part = new hash_map; /* Initialize local stack smashing state. */ has_protected_decls = false; @@ -2144,7 +2143,7 @@ HOST_WIDE_INT estimated_stack_frame_size (struct cgraph_node *node) { poly_int64 size = 0; - size_t i; + unsigned i; tree var; struct function *fn = DECL_STRUCT_FUNCTION (node->decl); @@ -2159,7 +2158,7 @@ estimated_stack_frame_size (struct cgraph_node *node) if (stack_vars_num > 0) { /* Fake sorting the stack vars for account_stack_vars (). */ - stack_vars_sorted = XNEWVEC (size_t, stack_vars_num); + stack_vars_sorted = XNEWVEC (unsigned , stack_vars_num); for (i = 0; i < stack_vars_num; ++i) stack_vars_sorted[i] = i; size += account_stack_vars ();