From: Jakub Jelinek <jakub@redhat.com>
To: Jan Hubicka <jh@suse.cz>
Cc: GCC Patches <gcc-patches@gcc.gnu.org>, Martin Jambor <mjambor@suse.cz>
Subject: Patch ping Re: [PATCH] ipa: Avoid another ICE when dealing with type-incompatibilities (PR 108959)
Date: Tue, 4 Apr 2023 12:33:00 +0200 [thread overview]
Message-ID: <ZCv83ClR5iX6RjIG@tucnak> (raw)
In-Reply-To: <ri67cv7vkxc.fsf@suse.cz>
Hi!
Honza, could you please have a look?
This is one of the few remaining P1s.
On Thu, Mar 23, 2023 at 11:09:19AM +0100, Martin Jambor wrote:
> Hi,
>
> PR 108959 shows one more example where undefined code with type
> incompatible accesses to stuff passed in parameters can cause an ICE
> because we try to create a VIEW_CONVERT_EXPR of mismatching sizes:
>
> 1. IPA-CP tries to push one type from above,
>
> 2. IPA-SRA (correctly) decides the parameter is useless because it is
> only used to construct an argument to another function which does not
> use it and so the formal parameter should be removed,
>
> 3. but the code reconciling IPA-CP and IPA-SRA transformations still
> wants to perform the IPA-CP and overrides the built-in DCE of
> useless statements and tries to stuff constants into them
> instead, constants of a type with mismatching type and size.
>
> This patch avoids the situation in IPA-SRA by purging the IPA-CP
> results from any "aggregate" constants that are passed in parameters
> which are detected to be useless. It also removes IPA value range and
> bits information associated with removed parameters stored in the same
> structure so that the useless information is not streamed later on.
>
> Bootstrapped and LTO-bootstrapped and tested on x86_64-linux. OK for
> trunk?
>
> gcc/ChangeLog:
>
> 2023-03-22 Martin Jambor <mjambor@suse.cz>
>
> PR ipa/108959
> * ipa-sra.cc (zap_useless_ipcp_results): New function.
> (process_isra_node_results): Call it.
>
> gcc/testsuite/ChangeLog:
>
> 2023-03-17 Martin Jambor <mjambor@suse.cz>
>
> PR ipa/108959
> * gcc.dg/ipa/pr108959.c: New test.
> ---
> gcc/ipa-sra.cc | 66 +++++++++++++++++++++++++++++
> gcc/testsuite/gcc.dg/ipa/pr108959.c | 22 ++++++++++
> 2 files changed, 88 insertions(+)
> create mode 100644 gcc/testsuite/gcc.dg/ipa/pr108959.c
>
> diff --git a/gcc/ipa-sra.cc b/gcc/ipa-sra.cc
> index 3de7d426b7e..7b8260bc9e1 100644
> --- a/gcc/ipa-sra.cc
> +++ b/gcc/ipa-sra.cc
> @@ -4028,6 +4028,70 @@ mark_callers_calls_comdat_local (struct cgraph_node *node, void *)
> return false;
> }
>
> +/* Remove any IPA-CP results stored in TS that are associated with removed
> + parameters as marked in IFS. */
> +
> +static void
> +zap_useless_ipcp_results (const isra_func_summary *ifs, ipcp_transformation *ts)
> +{
> + unsigned ts_len = vec_safe_length (ts->m_agg_values);
> +
> + if (ts_len == 0)
> + return;
> +
> + bool removed_item = false;
> + unsigned dst_index = 0;
> +
> + for (unsigned i = 0; i < ts_len; i++)
> + {
> + ipa_argagg_value *v = &(*ts->m_agg_values)[i];
> + const isra_param_desc *desc = &(*ifs->m_parameters)[v->index];
> +
> + if (!desc->locally_unused)
> + {
> + if (removed_item)
> + (*ts->m_agg_values)[dst_index] = *v;
> + dst_index++;
> + }
> + else
> + removed_item = true;
> + }
> + if (dst_index == 0)
> + {
> + ggc_free (ts->m_agg_values);
> + ts->m_agg_values = NULL;
> + }
> + else if (removed_item)
> + ts->m_agg_values->truncate (dst_index);
> +
> + bool useful_bits = false;
> + unsigned count = vec_safe_length (ts->bits);
> + for (unsigned i = 0; i < count; i++)
> + if ((*ts->bits)[i])
> + {
> + const isra_param_desc *desc = &(*ifs->m_parameters)[i];
> + if (desc->locally_unused)
> + (*ts->bits)[i] = NULL;
> + else
> + useful_bits = true;
> + }
> + if (!useful_bits)
> + ts->bits = NULL;
> +
> + bool useful_vr = false;
> + count = vec_safe_length (ts->m_vr);
> + for (unsigned i = 0; i < count; i++)
> + if ((*ts->m_vr)[i].known)
> + {
> + const isra_param_desc *desc = &(*ifs->m_parameters)[i];
> + if (desc->locally_unused)
> + (*ts->m_vr)[i].known = false;
> + else
> + useful_vr = true;
> + }
> + if (!useful_vr)
> + ts->m_vr = NULL;
> +}
>
> /* Do final processing of results of IPA propagation regarding NODE, clone it
> if appropriate. */
> @@ -4080,6 +4144,8 @@ process_isra_node_results (cgraph_node *node,
> }
>
> ipcp_transformation *ipcp_ts = ipcp_get_transformation_summary (node);
> + if (ipcp_ts)
> + zap_useless_ipcp_results (ifs, ipcp_ts);
> vec<ipa_adjusted_param, va_gc> *new_params = NULL;
> if (ipa_param_adjustments *old_adjustments
> = cinfo ? cinfo->param_adjustments : NULL)
> diff --git a/gcc/testsuite/gcc.dg/ipa/pr108959.c b/gcc/testsuite/gcc.dg/ipa/pr108959.c
> new file mode 100644
> index 00000000000..cd1f88658ef
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/ipa/pr108959.c
> @@ -0,0 +1,22 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +union U2 {
> + long f0;
> + int f1;
> +};
> +int g_16;
> +int g_70[20];
> +static int func_61(int) {
> + for (;;)
> + g_70[g_16] = 4;
> +}
> +static int func_43(int *p_44)
> +{
> + func_61(*p_44);
> +}
> +int main() {
> + union U2 l_38 = {9};
> + int *l_49 = (int *) &l_38;
> + func_43(l_49);
> +}
> --
> 2.40.0
Jakub
next prev parent reply other threads:[~2023-04-04 10:33 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-23 10:09 Martin Jambor
2023-04-04 10:33 ` Jakub Jelinek [this message]
2023-04-04 11:36 ` Patch ping " Jan Hubicka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZCv83ClR5iX6RjIG@tucnak \
--to=jakub@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=jh@suse.cz \
--cc=mjambor@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).