From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.gentoo.org (woodpecker.gentoo.org [140.211.166.183]) by sourceware.org (Postfix) with ESMTP id 4E2163858C42 for ; Sun, 19 Nov 2023 11:32:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4E2163858C42 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gentoo.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gentoo.org ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 4E2163858C42 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=140.211.166.183 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1700393562; cv=none; b=P6K7JdBZIvbx5XhBVGyC0Yu5LFJaf501f3d6Ssi+Jfv2zpamUdfc7RjM7dWgCWpSiA3ErZvz7undjO/+zzAzKCA1fbyt+DjDDeYnNLf0eiEsI+v674snngCN+dkY8wquBmb1W3pmJt9murXBVwgF0nk3yA52I/fk5bv43f6Kd9w= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1700393562; c=relaxed/simple; bh=RLUa4m5MnnS0LKpN6OybI3Ug3LxwpksFHyjjXvSGz6k=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=uykzJNkumTipXYDhSD7dbzrbuNKr10FWEJHglQwEacQza+ZLomIWiT+mxuTn3EX11mf0W+rhGS9JHZRrwAMNjvJ/CmRfTauH0n251Cds2RWH+kq21T5kXEaPDYDdpPZCr3xrCBK0OQVTUBEjpq9t2xvOL6SGcOS15CK4b0tKhzY= ARC-Authentication-Results: i=1; server2.sourceware.org References: User-agent: mu4e 1.10.8; emacs 30.0.50 From: Sam James To: Jan Hubicka Cc: gcc-patches@gcc.gnu.org Subject: Re: Propagate value ranges of return values Date: Sun, 19 Nov 2023 11:30:34 +0000 Organization: Gentoo In-reply-to: Message-ID: <871qcmkmgd.fsf@gentoo.org> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Status: No, score=-10.0 required=5.0 tests=BAYES_00,GIT_PATCH_0,JMQ_SPF_NEUTRAL,KAM_DMARC_STATUS,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,SPF_PASS,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: Jan Hubicka writes: > Hi, > this patch implements very basic propaation of return value ranges from VRP > pass. This helps std::vector's push_back since we work out value range of > allocated block. This propagates only within single translation unit. I hoped > we will also do the propagation at WPA stage, but that needs more work on > ipa-cp side. > > I also added code auto-detecting return_nonnull and corresponding -Wsuggest-attribute > > Variant of this patch bootstrapped/regtested x86_64-linux, testing with > this version is running. I plan to commit the patch at Monday provided > there are no issues. > > gcc/ChangeLog: > > * cgraph.cc (add_detected_attribute_1): New function. > (cgraph_node::add_detected_attribute): New member function. > * cgraph.h (struct cgraph_node): Declare it. > * common.opt: Add Wsuggest-attribute=returns_nonnull. > * doc/invoke.texi: Document +Wsuggest-attribute=returns_nonnull. > * gimple-range-fold.cc: Include ipa-prop and dependencies. > (fold_using_range::range_of_call): Look for return value range. > * ipa-prop.cc (struct ipa_return_value_summary): New structure. > (class ipa_return_value_sum_t): New summary. > (ipa_record_return_value_range): New function. > (ipa_return_value_range): New function. > * ipa-prop.h (ipa_return_value_range): Declare. > (ipa_record_return_value_range): Declare. > * ipa-pure-const.cc (warn_function_returns_nonnull): New function. > * ipa-utils.h (warn_function_returns_nonnull): Declare. > * symbol-summary.h: Fix comment typo. > * tree-vrp.cc (execute_ranger_vrp): Record return values. > > gcc/testsuite/ChangeLog: > > * gcc.dg/tree-ssa/return-value-range-1.c: New test. > > diff --git a/gcc/cgraph.cc b/gcc/cgraph.cc > index e41e5ad3ae7..71dacf23ce1 100644 > --- a/gcc/cgraph.cc > +++ b/gcc/cgraph.cc > @@ -2629,6 +2629,54 @@ cgraph_node::set_malloc_flag (bool malloc_p) > return changed; > } > > +/* Worker to set malloc flag. */ > +static void > +add_detected_attribute_1 (cgraph_node *node, const char *attr, bool *changed) > +{ > + if (!lookup_attribute (attr, DECL_ATTRIBUTES (node->decl))) > + { > + DECL_ATTRIBUTES (node->decl) = tree_cons (get_identifier (attr), > + NULL_TREE, DECL_ATTRIBUTES (node->decl)); > + *changed = true; > + } > + > + ipa_ref *ref; > + FOR_EACH_ALIAS (node, ref) > + { > + cgraph_node *alias = dyn_cast (ref->referring); > + if (alias->get_availability () > AVAIL_INTERPOSABLE) > + add_detected_attribute_1 (alias, attr, changed); > + } > + > + for (cgraph_edge *e = node->callers; e; e = e->next_caller) > + if (e->caller->thunk > + && (e->caller->get_availability () > AVAIL_INTERPOSABLE)) > + add_detected_attribute_1 (e->caller, attr, changed); > +} > + > +/* Set DECL_IS_MALLOC on NODE's decl and on NODE's aliases if any. */ > + > +bool > +cgraph_node::add_detected_attribute (const char *attr) > +{ > + bool changed = false; > + > + if (get_availability () > AVAIL_INTERPOSABLE) > + add_detected_attribute_1 (this, attr, &changed); > + else > + { > + ipa_ref *ref; > + > + FOR_EACH_ALIAS (this, ref) > + { > + cgraph_node *alias = dyn_cast (ref->referring); > + if (alias->get_availability () > AVAIL_INTERPOSABLE) > + add_detected_attribute_1 (alias, attr, &changed); > + } > + } > + return changed; > +} > + > /* Worker to set noreturng flag. */ > static void > set_noreturn_flag_1 (cgraph_node *node, bool noreturn_p, bool *changed) > diff --git a/gcc/cgraph.h b/gcc/cgraph.h > index cedaaac3a45..cfdd9f693a8 100644 > --- a/gcc/cgraph.h > +++ b/gcc/cgraph.h > @@ -1190,6 +1190,10 @@ struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : public symtab_node > > bool set_pure_flag (bool pure, bool looping); > > + /* Add attribute ATTR to cgraph_node's decl and on aliases of the node > + if any. */ > + bool add_detected_attribute (const char *attr); > + > /* Call callback on function and aliases associated to the function. > When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are > skipped. */ > diff --git a/gcc/common.opt b/gcc/common.opt > index d21db5d4a20..0be4f02677c 100644 > --- a/gcc/common.opt > +++ b/gcc/common.opt > @@ -781,6 +781,10 @@ Wsuggest-attribute=malloc > Common Var(warn_suggest_attribute_malloc) Warning > Warn about functions which might be candidates for __attribute__((malloc)). > > +Wsuggest-attribute=returns_nonnull - or _? (If changing it, needs adjustment in rest of patch too.) > +Common Var(warn_suggest_attribute_malloc) Warning > +Warn about functions which might be candidates for __attribute__((malloc)). > + Typo: s/malloc/nonnull/?