From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out1.suse.de (smtp-out1.suse.de [IPv6:2001:67c:2178:6::1c]) by sourceware.org (Postfix) with ESMTPS id B03313858D35 for ; Thu, 22 Jun 2023 08:13:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B03313858D35 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 9CA2C22976 for ; Thu, 22 Jun 2023 08:13:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1687421608; h=from:from:reply-to:date:date:to:to:cc:mime-version:mime-version: content-type:content-type; bh=FOvHQSfUJpw/oPmKzLY6od63jd58MB7BnUy+Kp/HE+s=; b=f6cr696v7PqxdSu8UTNIG2/Zg/kdjE10z10jVwrDF+Nej8cpw1mZD/BRlBjAHebOeMWnaz JPX/xdjbXX2ZcxhBAbjZb0oVG4qufoIZARoxI2nYl0ky+ArjW226b9a4M8KT/unDzxFdJZ 0aQ0dnMItSh5c9MI/D3eVSHPivPKIDs= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1687421608; h=from:from:reply-to:date:date:to:to:cc:mime-version:mime-version: content-type:content-type; bh=FOvHQSfUJpw/oPmKzLY6od63jd58MB7BnUy+Kp/HE+s=; b=HgoSdnis3e/dWKHB6xFi+NJBHkY4R9lHSWa6K/Amx/rzWEMmDbcz6aG0xZSXGZU5NUVkWb ODrMOSC6SE5kbCDQ== Received: from wotan.suse.de (wotan.suse.de [10.160.0.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by relay2.suse.de (Postfix) with ESMTPS id 932652C141 for ; Thu, 22 Jun 2023 08:13:28 +0000 (UTC) Date: Thu, 22 Jun 2023 08:13:28 +0000 (UTC) From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: [PATCH] tree-optimization/110332 - fix ICE with phiprop User-Agent: Alpine 2.22 (LSU 394 2020-01-19) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Spam-Status: No, score=-10.5 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,MISSING_MID,SPF_HELO_NONE,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: Message-ID: <20230622081328.vp6PFGgs9uYKZwCFqMFHzXjLe9NERwSMB9Hz7nh3jdU@z> The following fixes an ICE that occurs when we visit an edge inserted load from the code validating correctness for inserting an aggregate copy there. We can simply skip those loads here. Boostrapped and tested on x86_64-unknown-linux-gnu, pushed. PR tree-optimization/110332 * tree-ssa-phiprop.cc (propagate_with_phi): Always check aliasing with edge inserted loads. * g++.dg/torture/pr110332.C: New testcase. * gcc.dg/torture/pr110332-1.c: Likewise. * gcc.dg/torture/pr110332-2.c: Likewise. --- gcc/testsuite/g++.dg/torture/pr110332.C | 16 ++++++++++++++++ gcc/testsuite/gcc.dg/torture/pr110332-1.c | 13 +++++++++++++ gcc/testsuite/gcc.dg/torture/pr110332-2.c | 10 ++++++++++ gcc/tree-ssa-phiprop.cc | 10 +++++++--- 4 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr110332.C create mode 100644 gcc/testsuite/gcc.dg/torture/pr110332-1.c create mode 100644 gcc/testsuite/gcc.dg/torture/pr110332-2.c diff --git a/gcc/testsuite/g++.dg/torture/pr110332.C b/gcc/testsuite/g++.dg/torture/pr110332.C new file mode 100644 index 00000000000..31dc93ecee4 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr110332.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +struct SlotIndex { int lie; }; +SlotIndex si7, si8; + +unsigned u9, u6; +bool b3, b4; +unsigned &value() { + return b4 ? u6 : u9; +} +void transferValues() { + unsigned RegIdx; + SlotIndex End; + RegIdx = value(); + End = b3 ? si7 : si8; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr110332-1.c b/gcc/testsuite/gcc.dg/torture/pr110332-1.c new file mode 100644 index 00000000000..438993e8daf --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr110332-1.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ + +struct s { int lie; }; +struct s si7, si8; +unsigned u9, u6; +_Bool b3, b4; +unsigned transferValues(struct s *End) { + unsigned RegIdx; + unsigned *t = b4 ? &u6 : &u9; + RegIdx = *t; + *End = *(b3 ? &si7 : &si8); + return RegIdx; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr110332-2.c b/gcc/testsuite/gcc.dg/torture/pr110332-2.c new file mode 100644 index 00000000000..18b656ffb2d --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr110332-2.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ + +_Bool a; +struct s { int t; } c, d; +unsigned e, f; +unsigned transferValues(struct s *End) { + unsigned RegIdx = *(a ? &e : &f); + *End = *(a ? &c : &d); + return RegIdx; +} diff --git a/gcc/tree-ssa-phiprop.cc b/gcc/tree-ssa-phiprop.cc index 21a349a25e2..8c9ce903472 100644 --- a/gcc/tree-ssa-phiprop.cc +++ b/gcc/tree-ssa-phiprop.cc @@ -399,14 +399,18 @@ propagate_with_phi (basic_block bb, gphi *phi, struct phiprop_d *phivn, there are no statements that could read from memory aliasing the lhs in between the start of bb and use_stmt. As we require use_stmt to have a VDEF above, loads after - use_stmt will use a different virtual SSA_NAME. */ + use_stmt will use a different virtual SSA_NAME. When + we reach an edge inserted load the constraints we place + on processing guarantees that program order is preserved + so we can avoid checking those. */ FOR_EACH_IMM_USE_FAST (vuse_p, vui, vuse) { vuse_stmt = USE_STMT (vuse_p); if (vuse_stmt == use_stmt) continue; - if (!dominated_by_p (CDI_DOMINATORS, - gimple_bb (vuse_stmt), bb)) + if (!gimple_bb (vuse_stmt) + || !dominated_by_p (CDI_DOMINATORS, + gimple_bb (vuse_stmt), bb)) continue; if (ref_maybe_used_by_stmt_p (vuse_stmt, gimple_assign_lhs (use_stmt))) -- 2.35.3