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.133.124]) by sourceware.org (Postfix) with ESMTPS id 714CB3858D1E for ; Wed, 14 Jun 2023 12:09:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 714CB3858D1E 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=1686744596; 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=TXMTR8wXfVQaYUUMmIxv1otti4OF29nB4Ng/ntbcFAo=; b=WwOjBuVjwuFF2WmYybAK8RPpSpmdcW5GgtJpsyV+5zUZvEBYqaWR6q59+oxr8UZSXnu6I6 qmMVsyuLQrxsAynObbT+Tu+WCWhpWejuAQuw87fsfUl7g9/dKKdCBKxL8NLJZHnVYxOivD 9eqQtNnG+eTRj3kTtr54dAw2RVBybqY= Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-134-yJ02Qi5mM1Cm9ijghclnlg-1; Wed, 14 Jun 2023 08:09:54 -0400 X-MC-Unique: yJ02Qi5mM1Cm9ijghclnlg-1 Received: by mail-ed1-f70.google.com with SMTP id 4fb4d7f45d1cf-5187cc1768dso747677a12.2 for ; Wed, 14 Jun 2023 05:09:54 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1686744593; x=1689336593; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TXMTR8wXfVQaYUUMmIxv1otti4OF29nB4Ng/ntbcFAo=; b=WV/QQMv0vVgFXlsjaywRixlL/xv+4yzNjczfGq5nTDTFzB7L///ADgxtKIgC+4Seso KELeuKTmZVNNzl8q+8b2P/YdRjNGB0WKWCMP8yr0JB1StyyHi3hzBLVfnBJRUivHoyRf QuNBY+ai8XdHCkJGTd9qg3riuIyHRYTg/gAl2GNC1A1zGr7TLtBCVQtzszkwRTZnMS4E pAw77GuEAj7ZNepIqy9lm2bgjB3h1Rf88c9OmObJ8Zh0IW/6U5kilxZwfuZSGrHlOBuW oFGYclexGVNAKcOIWsG4x/quxaWNWbAzJE4gcNtWzM7aU0i7kr4Is8l64IeekDcBENMg 5tcw== X-Gm-Message-State: AC+VfDzDK2JfnJxgtcGK3LfBuZKO3+qEUs1oByLcihmO+UbRpl1Cb21L w0Of/EUpDvhIFwWaUD1Poim/AyWx9CfVPrw+IqFBzXMQH3FMuMQTEZW2n/MGHTeDz4ygTIm83qo 1Fbf80d4PFuzZFnG6qh9H+YcfTEGdkfQNPln+1PZKoOcv X-Received: by 2002:aa7:cd09:0:b0:50b:d75d:3155 with SMTP id b9-20020aa7cd09000000b0050bd75d3155mr10438732edw.37.1686744593114; Wed, 14 Jun 2023 05:09:53 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7nKBiDSHipZjeCelPU2kgB71tOJ4zO3+XpVZLTn7sW6ucIY7hmp2SxY+As+P2/ke/0ypriQ8+HBg/l95Ccf3Y= X-Received: by 2002:aa7:cd09:0:b0:50b:d75d:3155 with SMTP id b9-20020aa7cd09000000b0050bd75d3155mr10438717edw.37.1686744592674; Wed, 14 Jun 2023 05:09:52 -0700 (PDT) MIME-Version: 1.0 References: <20230522185622.537454-1-aldyh@redhat.com> In-Reply-To: <20230522185622.537454-1-aldyh@redhat.com> From: Aldy Hernandez Date: Wed, 14 Jun 2023 14:09:41 +0200 Message-ID: Subject: Re: [PATCH] Convert ipa_jump_func to use ipa_vr instead of a value_range. To: GCC patches , Martin Jambor Cc: Andrew MacLeod X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-11.5 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_H5,RCVD_IN_MSPIKE_WL,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: PING On Mon, May 22, 2023 at 8:56=E2=80=AFPM Aldy Hernandez w= rote: > > This patch converts the ipa_jump_func code to use the type agnostic > ipa_vr suitable for GC instead of value_range which is integer specific. > > I've disabled the range cacheing to simplify the patch for review, but > it is handled in the next patch in the series. > > OK? > > gcc/ChangeLog: > > * ipa-cp.cc (ipa_vr_operation_and_type_effects): New. > * ipa-prop.cc (ipa_get_value_range): Adjust for ipa_vr. > (ipa_set_jfunc_vr): Take a range. > (ipa_compute_jump_functions_for_edge): Pass range to > ipa_set_jfunc_vr. > (ipa_write_jump_function): Call streamer write helper. > (ipa_read_jump_function): Call streamer read helper. > * ipa-prop.h (class ipa_vr): Change m_vr to an ipa_vr. > --- > gcc/ipa-cp.cc | 15 +++++++++++ > gcc/ipa-prop.cc | 70 ++++++++++++++++++------------------------------- > gcc/ipa-prop.h | 5 +++- > 3 files changed, 44 insertions(+), 46 deletions(-) > > diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc > index bdbc2184b5f..03273666ea2 100644 > --- a/gcc/ipa-cp.cc > +++ b/gcc/ipa-cp.cc > @@ -1928,6 +1928,21 @@ ipa_vr_operation_and_type_effects (vrange &dst_vr, > && !dst_vr.undefined_p ()); > } > > +/* Same as above, but the SRC_VR argument is an IPA_VR which must > + first be extracted onto a vrange. */ > + > +static bool > +ipa_vr_operation_and_type_effects (vrange &dst_vr, > + const ipa_vr &src_vr, > + enum tree_code operation, > + tree dst_type, tree src_type) > +{ > + Value_Range tmp; > + src_vr.get_vrange (tmp); > + return ipa_vr_operation_and_type_effects (dst_vr, tmp, operation, > + dst_type, src_type); > +} > + > /* Determine range of JFUNC given that INFO describes the caller node or > the one it is inlined to, CS is the call graph edge corresponding to = JFUNC > and PARM_TYPE of the parameter. */ > diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc > index bbfe0f8aa45..c46a89f1b49 100644 > --- a/gcc/ipa-prop.cc > +++ b/gcc/ipa-prop.cc > @@ -2287,9 +2287,10 @@ ipa_set_jfunc_bits (ipa_jump_func *jf, const wides= t_int &value, > /* 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 NU= LL. */ > > -static value_range * > -ipa_get_value_range (value_range *tmp) > +static ipa_vr * > +ipa_get_value_range (const vrange &tmp) > { > + /* FIXME: Add hashing support. > value_range **slot =3D ipa_vr_hash_table->find_slot (tmp, INSERT); > if (*slot) > return *slot; > @@ -2297,40 +2298,27 @@ ipa_get_value_range (value_range *tmp) > value_range *vr =3D new (ggc_alloc ()) value_range; > *vr =3D *tmp; > *slot =3D vr; > + */ > + ipa_vr *vr =3D new (ggc_alloc ()) ipa_vr (tmp); > > return vr; > } > > -/* Return a pointer to a value range consisting of TYPE, MIN, MAX and an= empty > - equiv set. Use hash table in order to avoid creating multiple same co= pies of > - value_ranges. */ > - > -static value_range * > -ipa_get_value_range (enum value_range_kind kind, tree min, tree max) > -{ > - value_range tmp (TREE_TYPE (min), > - wi::to_wide (min), wi::to_wide (max), kind); > - return ipa_get_value_range (&tmp); > -} > - > -/* Assign to JF a pointer to a value_range structure with TYPE, MIN and = MAX and > - a NULL equiv bitmap. Use hash table in order to avoid creating multi= ple > - same value_range structures. */ > +/* Assign to JF a pointer to a value_range just like TMP but either fetc= h a > + copy from ipa_vr_hash_table or allocate a new on in GC memory. */ > > static void > -ipa_set_jfunc_vr (ipa_jump_func *jf, enum value_range_kind type, > - tree min, tree max) > +ipa_set_jfunc_vr (ipa_jump_func *jf, const vrange &tmp) > { > - jf->m_vr =3D ipa_get_value_range (type, min, max); > + jf->m_vr =3D ipa_get_value_range (tmp); > } > > -/* Assign to JF a pointer to a value_range just like TMP but either fetc= h a > - copy from ipa_vr_hash_table or allocate a new on in GC memory. */ > - > static void > -ipa_set_jfunc_vr (ipa_jump_func *jf, value_range *tmp) > +ipa_set_jfunc_vr (ipa_jump_func *jf, const ipa_vr &vr) > { > - jf->m_vr =3D ipa_get_value_range (tmp); > + Value_Range tmp; > + vr.get_vrange (tmp); > + ipa_set_jfunc_vr (jf, tmp); > } > > /* Compute jump function for all arguments of callsite CS and insert the > @@ -2392,8 +2380,8 @@ ipa_compute_jump_functions_for_edge (struct ipa_fun= c_body_info *fbi, > > if (addr_nonzero) > { > - tree z =3D build_int_cst (TREE_TYPE (arg), 0); > - ipa_set_jfunc_vr (jfunc, VR_ANTI_RANGE, z, z); > + vr.set_nonzero (TREE_TYPE (arg)); > + ipa_set_jfunc_vr (jfunc, vr); > } > else > gcc_assert (!jfunc->m_vr); > @@ -2412,7 +2400,7 @@ ipa_compute_jump_functions_for_edge (struct ipa_fun= c_body_info *fbi, > value_range resvr =3D vr; > range_cast (resvr, param_type); > if (!resvr.undefined_p () && !resvr.varying_p ()) > - ipa_set_jfunc_vr (jfunc, &resvr); > + ipa_set_jfunc_vr (jfunc, resvr); > else > gcc_assert (!jfunc->m_vr); > } > @@ -4864,16 +4852,12 @@ ipa_write_jump_function (struct output_block *ob, > streamer_write_widest_int (ob, jump_func->bits->value); > streamer_write_widest_int (ob, jump_func->bits->mask); > } > - bp_pack_value (&bp, !!jump_func->m_vr, 1); > - streamer_write_bitpack (&bp); > if (jump_func->m_vr) > + jump_func->m_vr->streamer_write (ob); > + else > { > - tree min, max; > - value_range_kind kind =3D get_legacy_range (*jump_func->m_vr, min,= max); > - streamer_write_enum (ob->main_stream, value_rang_type, > - VR_LAST, kind); > - stream_write_tree (ob, min, true); > - stream_write_tree (ob, max, true); > + bp_pack_value (&bp, false, 1); > + streamer_write_bitpack (&bp); > } > } > > @@ -5001,21 +4985,17 @@ ipa_read_jump_function (class lto_input_block *ib= , > widest_int value =3D streamer_read_widest_int (ib); > widest_int mask =3D streamer_read_widest_int (ib); > if (prevails) > - ipa_set_jfunc_bits (jump_func, value, mask); > + ipa_set_jfunc_bits (jump_func, value, mask); > } > else > jump_func->bits =3D NULL; > > - struct bitpack_d vr_bp =3D streamer_read_bitpack (ib); > - bool vr_known =3D bp_unpack_value (&vr_bp, 1); > - if (vr_known) > + ipa_vr vr; > + vr.streamer_read (ib, data_in); > + if (vr.known_p ()) > { > - enum value_range_kind type =3D streamer_read_enum (ib, value_range= _kind, > - VR_LAST); > - tree min =3D stream_read_tree (ib, data_in); > - tree max =3D stream_read_tree (ib, data_in); > if (prevails) > - ipa_set_jfunc_vr (jump_func, type, min, max); > + ipa_set_jfunc_vr (jump_func, vr); > } > else > jump_func->m_vr =3D NULL; > diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h > index f87e8a596c1..33fad228913 100644 > --- a/gcc/ipa-prop.h > +++ b/gcc/ipa-prop.h > @@ -325,6 +325,9 @@ private: > friend void gt_pch_nx (struct ipa_vr &); > friend void gt_ggc_mx (struct ipa_vr &); > friend void gt_pch_nx (struct ipa_vr *, gt_pointer_operator, void *); > + friend void gt_ggc_mx_ipa_vr (void *); > + friend void gt_pch_nx_ipa_vr (void*); > + friend void gt_pch_p_6ipa_vr(void*, void*, gt_pointer_operator, void*)= ; > > vrange_storage *m_storage; > // vrange_storage is typeless, but we need to know what type of > @@ -351,7 +354,7 @@ struct GTY (()) ipa_jump_func > /* Information about value range, containing valid data only when vr_k= nown is > true. The pointed to structure is shared betweed different jump > functions. Use ipa_set_jfunc_vr to set this field. */ > - value_range *m_vr; > + ipa_vr *m_vr; > > enum jump_func_type type; > /* Represents a value of a jump function. pass_through is used only i= n jump > -- > 2.40.1 >