From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id D61BF385841D for ; Mon, 22 May 2023 18:56:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D61BF385841D Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1684781802; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bf5gAyXb2aub8t8+Kvn+5bJxXlWUb4smQBMn8V9q9pQ=; b=GwMBLYxfsRD3Wdhl+dc7HISlaD89Yjen3J+I2hMPIhmslA/2b8IaRqmb5+zH0AP9O7aqPL fSGthZIzhg6T2ykxrBwNzZqkHI6Vt3DtGMJxz9h9p5VaS3ZLnuP1FeW+TR6vhaoqqzB9JN wGYxR5gj8CaP+jM7JZ+EEeojYvQ0VP8= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-437-nbw134WROfuDT2LQIl_GBQ-1; Mon, 22 May 2023 14:56:40 -0400 X-MC-Unique: nbw134WROfuDT2LQIl_GBQ-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 795F33C01DE8 for ; Mon, 22 May 2023 18:56:40 +0000 (UTC) Received: from abulafia.quesejoda.com (unknown [10.39.192.26]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1189B1121314; Mon, 22 May 2023 18:56:39 +0000 (UTC) Received: from abulafia.quesejoda.com (localhost [127.0.0.1]) by abulafia.quesejoda.com (8.17.1/8.17.1) with ESMTPS id 34MIubJG537485 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Mon, 22 May 2023 20:56:37 +0200 Received: (from aldyh@localhost) by abulafia.quesejoda.com (8.17.1/8.17.1/Submit) id 34MIub1f537484; Mon, 22 May 2023 20:56:37 +0200 From: Aldy Hernandez To: GCC patches Cc: Andrew MacLeod , Aldy Hernandez Subject: [PATCH] Implement ipa_vr hashing. Date: Mon, 22 May 2023 20:56:21 +0200 Message-Id: <20230522185622.537454-2-aldyh@redhat.com> In-Reply-To: <20230522185622.537454-1-aldyh@redhat.com> References: <20230522185622.537454-1-aldyh@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true X-Spam-Status: No, score=-11.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Implement hashing for ipa_vr. When all is said and done, all these patches incurr a 7.64% slowdown for ipa-cp, with is entirely covered by the similar 7% increase in this area last week. So we get type agnostic ranges with "infinite" range precision close to free. There is no change in overall compilation. OK? gcc/ChangeLog: * ipa-prop.cc (struct ipa_vr_ggc_hash_traits): Adjust for use with ipa_vr instead of value_range. (gt_pch_nx): Same. (gt_ggc_mx): Same. (ipa_get_value_range): Same. * value-range.cc (gt_pch_nx): Move to ipa-prop.cc and adjust for ipa_vr. (gt_ggc_mx): Same. --- gcc/ipa-prop.cc | 76 +++++++++++++++++++++++++++------------------- gcc/value-range.cc | 15 --------- 2 files changed, 45 insertions(+), 46 deletions(-) diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc index c46a89f1b49..6383bc11e0a 100644 --- a/gcc/ipa-prop.cc +++ b/gcc/ipa-prop.cc @@ -109,53 +109,53 @@ struct ipa_bit_ggc_hash_traits : public ggc_cache_remove /* Hash table for avoid repeated allocations of equal ipa_bits. */ static GTY ((cache)) hash_table *ipa_bits_hash_table; -/* Traits for a hash table for reusing value_ranges used for IPA. Note that - the equiv bitmap is not hashed and is expected to be NULL. */ +/* Traits for a hash table for reusing ranges. */ -struct ipa_vr_ggc_hash_traits : public ggc_cache_remove +struct ipa_vr_ggc_hash_traits : public ggc_cache_remove { - typedef value_range *value_type; - typedef value_range *compare_type; + typedef ipa_vr *value_type; + typedef const vrange *compare_type; static hashval_t - hash (const value_range *p) + hash (const ipa_vr *p) { - tree min, max; - value_range_kind kind = get_legacy_range (*p, min, max); - inchash::hash hstate (kind); - inchash::add_expr (min, hstate); - inchash::add_expr (max, hstate); + // This never get called, except in the verification code, as + // ipa_get_value_range() calculates the hash itself. This + // function is mostly here for completness' sake. + Value_Range vr; + p->get_vrange (vr); + inchash::hash hstate; + add_vrange (vr, hstate); return hstate.end (); } static bool - equal (const value_range *a, const value_range *b) + equal (const ipa_vr *a, const vrange *b) { - return (types_compatible_p (a->type (), b->type ()) - && *a == *b); + return a->equal_p (*b); } static const bool empty_zero_p = true; static void - mark_empty (value_range *&p) + mark_empty (ipa_vr *&p) { p = NULL; } static bool - is_empty (const value_range *p) + is_empty (const ipa_vr *p) { return p == NULL; } static bool - is_deleted (const value_range *p) + is_deleted (const ipa_vr *p) { - return p == reinterpret_cast (1); + return p == reinterpret_cast (1); } static void - mark_deleted (value_range *&p) + mark_deleted (ipa_vr *&p) { - p = reinterpret_cast (1); + p = reinterpret_cast (1); } }; -/* Hash table for avoid repeated allocations of equal value_ranges. */ +/* Hash table for avoid repeated allocations of equal ranges. */ static GTY ((cache)) hash_table *ipa_vr_hash_table; /* Holders of ipa cgraph hooks: */ @@ -265,6 +265,22 @@ ipa_vr::dump (FILE *out) const fprintf (out, "NO RANGE"); } +// ?? These stubs are because we use an ipa_vr in a hash_traits and +// hash-traits.h defines an extern of gt_ggc_mx (T &) instead of +// picking up the gt_ggc_mx (T *) version. +void +gt_pch_nx (ipa_vr *&x) +{ + return gt_pch_nx ((ipa_vr *) x); +} + +void +gt_ggc_mx (ipa_vr *&x) +{ + return gt_ggc_mx ((ipa_vr *) x); +} + + /* Return true if DECL_FUNCTION_SPECIFIC_OPTIMIZATION of the decl associated with NODE should prevent us from analyzing it for the purposes of IPA-CP. */ @@ -2284,27 +2300,25 @@ ipa_set_jfunc_bits (ipa_jump_func *jf, const widest_int &value, jf->bits = ipa_get_ipa_bits_for_value (value, mask); } -/* Return a pointer to a value_range just like *TMP, but either find it in - ipa_vr_hash_table or allocate it in GC memory. TMP->equiv must be NULL. */ +/* Return a pointer to an ipa_vr just like TMP, but either find it in + ipa_vr_hash_table or allocate it in GC memory. */ static ipa_vr * ipa_get_value_range (const vrange &tmp) { - /* FIXME: Add hashing support. - value_range **slot = ipa_vr_hash_table->find_slot (tmp, INSERT); + inchash::hash hstate; + inchash::add_vrange (tmp, hstate); + hashval_t hash = hstate.end (); + ipa_vr **slot = ipa_vr_hash_table->find_slot_with_hash (&tmp, hash, INSERT); if (*slot) return *slot; - value_range *vr = new (ggc_alloc ()) value_range; - *vr = *tmp; - *slot = vr; - */ ipa_vr *vr = new (ggc_alloc ()) ipa_vr (tmp); - + *slot = vr; return vr; } -/* Assign to JF a pointer to a value_range just like TMP but either fetch a +/* Assign to JF a pointer to a range just like TMP but either fetch a copy from ipa_vr_hash_table or allocate a new on in GC memory. */ static void diff --git a/gcc/value-range.cc b/gcc/value-range.cc index 45b1e655967..7b81025357b 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -2008,21 +2008,6 @@ gt_pch_nx (vrange *x, gt_pointer_operator op, void *cookie) gcc_unreachable (); } -// ?? These stubs are for ipa-prop.cc which use a value_range in a -// hash_traits. hash-traits.h defines an extern of gt_ggc_mx (T &) -// instead of picking up the gt_ggc_mx (T *) version. -void -gt_pch_nx (int_range<2> *&x) -{ - return gt_pch_nx ((irange *) x); -} - -void -gt_ggc_mx (int_range<2> *&x) -{ - return gt_ggc_mx ((irange *) x); -} - #define DEFINE_INT_RANGE_INSTANCE(N) \ template int_range::int_range(tree_node *, \ const wide_int &, \ -- 2.40.1