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 DAD993858D1E for ; Tue, 4 Apr 2023 10:33:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org DAD993858D1E 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=1680604387; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references; bh=qFjOHx2F9EudIzZFDUuwF3nmhyZ2RxpcA+u2kKjV36Y=; b=ZzmTxzHXsbVTw3E8oaQCv0YHwSkhXAp9vMDsGQU6N4mGh6nS84sYFrj2rfnKEu/wkNL7Ea 2UEHI6P9oe2zN5gwbJpz4ILj5pmlFblRc0pNtmuCrZWzZt5C3hPOt9fhDgggKnNmycp1Zv fXI+Ig5U/kq9P9CPmARV35b7Mb+ZFb8= 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-169-uDmU-G_zNuGcquGILIbdrw-1; Tue, 04 Apr 2023 06:33:05 -0400 X-MC-Unique: uDmU-G_zNuGcquGILIbdrw-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id C6F093C0F193; Tue, 4 Apr 2023 10:33:04 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.192.16]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 79964E09100; Tue, 4 Apr 2023 10:33:04 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.17.1/8.17.1) with ESMTPS id 334AX1RO1768250 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Tue, 4 Apr 2023 12:33:02 +0200 Received: (from jakub@localhost) by tucnak.zalov.cz (8.17.1/8.17.1/Submit) id 334AX1bK1768249; Tue, 4 Apr 2023 12:33:01 +0200 Date: Tue, 4 Apr 2023 12:33:00 +0200 From: Jakub Jelinek To: Jan Hubicka Cc: GCC Patches , Martin Jambor Subject: Patch ping Re: [PATCH] ipa: Avoid another ICE when dealing with type-incompatibilities (PR 108959) Message-ID: Reply-To: Jakub Jelinek References: MIME-Version: 1.0 In-Reply-To: X-Scanned-By: MIMEDefang 3.1 on 10.11.54.8 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-9.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 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: 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 > > 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 > > 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 *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