From patchwork Thu Apr 4 06:59:00 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 1919628 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=Aed4VUMy; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=BCgzYHmR; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4V9CCr3yDjz1yYn for ; Thu, 4 Apr 2024 17:59:34 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 7DCDB384646C for ; Thu, 4 Apr 2024 06:59:32 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.223.130]) by sourceware.org (Postfix) with ESMTPS id A86C33858C24 for ; Thu, 4 Apr 2024 06:59:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A86C33858C24 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org A86C33858C24 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=195.135.223.130 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712213953; cv=none; b=rJlEaKKXPErsivxlC7vXt3sZb6q6mTg5DXOC0y29CQfUmOgqxkHeJNY0gIJzRTfe2FmbWH9IXLL2yWaUkxtIE4UDMgHuUqswIhS3pX1x+yF1VHC0zbh2Nemo67Hhg5h0TAr0iWZx2L6C6OWWCLV9G5GxX69h6P+MXcmMWXDBSRk= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712213953; c=relaxed/simple; bh=dWfD5H2Li0o33oZf7TzCD40z51lLemQXRhjoL8poI4M=; h=DKIM-Signature:DKIM-Signature:Date:From:To:Subject:MIME-Version; b=n2m2L13pvL6lkQyH0S48Y7G0HAQLISnRhAmCw7aM7chsqvN8p0kM/8vkoEJvDzGpqpWFefOBXW22FZromaR3h7qWfwyPQ7TNynbEo0eMh8kLCial7X6KBdbayzZe9KzWgWIeK0mlQbZf5f85m6XaKxJO1IRDIYFZHWvfW3UZBcs= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from [10.168.5.241] (unknown [10.168.5.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 6F765375B7 for ; Thu, 4 Apr 2024 06:59:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1712213948; h=from:from:reply-to:date:date:to:to:cc:mime-version:mime-version: content-type:content-type; bh=RtlO5Ild8SiEXW2tQVSUbrBWdHHssOynCeB0PKRD0wg=; b=Aed4VUMyJd+8u+XVQRFCksr6VshUUbEiyLSu+tyavGTNrrd2mk/4dpqOAx4eNg5Unoq9Hf xLd1LdeCGSuMHnCC6da8lQGpDNDSPiiy1CoerDXrTTIYe/a7HuAQRSqXrQU0gu2cFqK2ID J3YyKkahrFC3PHvwpXpBHG/JD1qjXoU= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1712213948; h=from:from:reply-to:date:date:to:to:cc:mime-version:mime-version: content-type:content-type; bh=RtlO5Ild8SiEXW2tQVSUbrBWdHHssOynCeB0PKRD0wg=; b=BCgzYHmRUYIcir8tqFurCqSHNY1qR8VxpCM8cvxBTH3yEYdzDs/UdoH6+qitRd/H4FRhql wOqRqlD0Untnm5BQ== Authentication-Results: smtp-out1.suse.de; none Date: Thu, 4 Apr 2024 08:59:00 +0200 (CEST) From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: [PATCH] tree-optimization/114551 - loop splitting and undefined overflow MIME-Version: 1.0 X-Spam-Score: 5.05 X-Spamd-Result: default: False [5.05 / 50.00]; ARC_NA(0.00)[]; FROM_HAS_DN(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; NEURAL_SPAM_SHORT(3.00)[1.000]; MIME_GOOD(-0.10)[text/plain]; TO_DN_NONE(0.00)[]; RCPT_COUNT_ONE(0.00)[1]; MISSING_MID(2.50)[]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; NEURAL_SPAM_LONG(2.65)[0.758]; FUZZY_BLOCKED(0.00)[rspamd.com]; RCVD_COUNT_ZERO(0.00)[0]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+]; BAYES_HAM(-3.00)[100.00%] 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 autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Message-Id: <20240404065932.7DCDB384646C@sourceware.org> When loop splitting hoists a guard computation it needs to make sure that can be safely evaluated at this place when it was previously only conditionally evaluated. The following fixes this for the case of undefined overflow. Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. PR tree-optimization/114551 * tree-ssa-loop-split.cc (split_loop): If the guard is only conditionally evaluated rewrite computations with possibly undefined overflow to unsigned arithmetic. * gcc.dg/torture/pr114551.c: New testcase. --- gcc/testsuite/gcc.dg/torture/pr114551.c | 18 ++++++++++++++++++ gcc/tree-ssa-loop-split.cc | 22 ++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr114551.c diff --git a/gcc/testsuite/gcc.dg/torture/pr114551.c b/gcc/testsuite/gcc.dg/torture/pr114551.c new file mode 100644 index 00000000000..13c15fbc3d9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr114551.c @@ -0,0 +1,18 @@ +/* { dg-do run } */ + +int a, b[4], c, d, e, f; +int main() +{ + a--; + for (f = 3; f >= 0; f--) + { + for (e = 0; e < 4; e++) + c = 0; + for (; c < 4; c++) + { + d = f && a > 0 && f > (2147483647 - a) ? 0 : b[f]; + continue; + } + } + return 0; +} diff --git a/gcc/tree-ssa-loop-split.cc b/gcc/tree-ssa-loop-split.cc index c0bb1b71d17..a770ea371a2 100644 --- a/gcc/tree-ssa-loop-split.cc +++ b/gcc/tree-ssa-loop-split.cc @@ -653,8 +653,26 @@ split_loop (class loop *loop1) gimple_seq stmts2; border = force_gimple_operand (border, &stmts2, true, NULL_TREE); if (stmts2) - gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop1), - stmts2); + { + /* When the split condition is not always evaluated make sure + to rewrite it to defined overflow. */ + if (!dominated_by_p (CDI_DOMINATORS, exit1->src, bbs[i])) + { + gimple_stmt_iterator gsi; + gsi = gsi_start (stmts2); + while (!gsi_end_p (gsi)) + { + gimple *stmt = gsi_stmt (gsi); + if (is_gimple_assign (stmt) + && arith_code_with_undefined_signed_overflow + (gimple_assign_rhs_code (stmt))) + rewrite_to_defined_overflow (&gsi); + gsi_next (&gsi); + } + } + gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop1), + stmts2); + } tree cond = fold_build2 (guard_code, boolean_type_node, guard_init, border); if (!initial_true)