From patchwork Wed Mar 1 09:09:34 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 62794 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp3522035wrd; Wed, 1 Mar 2023 01:10:33 -0800 (PST) X-Google-Smtp-Source: AK7set9Qwqg7yjMCKtDjF/hw+KoXXULntb8XZLtMKKBG+Yg6xjenM4xC+xk/y5vFJ/fLzf4ezlY/ X-Received: by 2002:a17:906:e42:b0:8f7:5038:9896 with SMTP id q2-20020a1709060e4200b008f750389896mr5107417eji.70.1677661833841; Wed, 01 Mar 2023 01:10:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1677661833; cv=none; d=google.com; s=arc-20160816; b=HRx6qbG5YmWGffE/hAvO9QRkEYKKjOMAASXrM4Ng4IaYPvn2AszeonXBt2B7358n7N Dhf5f6i3aQMfSDJKcrF/pzNXojEsId+zMVg48ZwzqkXBotKtn3T3iixqn2bkM2x8XbC/ nrDoNiZEK+73CNp5n3XM8F1k7mrZvIjUCkLy6a4tQCYACOCWX5ykXMN8mMYYazVcMjcP gCtw9fmNAIvxsGM1b7sXKwCq00CVNDrupKmbzcTIrM5TsTUq2H4tC743JnSXRz3qJSC+ /z15vZ/I9yPUHVWvfsNq78k0xV0ufp7D171f3pDIgiIYqpxBUSZGeaCqVgJail00Cwts REKQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=message-id:sender:errors-to:reply-to:from:list-subscribe:list-help :list-post:list-archive:list-unsubscribe:list-id:precedence :mime-version:user-agent:subject:to:date:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=ajf1sNjNCgWNhQ/CeBOoXVytz3/YR44/jYsaq/SO3Y0=; b=RnLpi0/lRCcK5lSiPmUeL+RrVOIE4dx0Z73k6L5bo+7BzmEgme9YkVBQsMHDnjfBfb 8PLJ3pnadgv/XELnNsglRNvbLtRf6PmB6OSJ6ww2ZZgY6iIYuzj8TW6bcMSp8Anf7ihH gVYZblfVkW2oxQRgqwLa3WKfOzqKQdbfumUTnbExZfDwqw2ZjTUen9/sQ4mpUigH+21w tRmzEvYUMe7FmEKkAX7VeH0aagEJUdAZX4X55B1oP7JjKDPhRqEMXv3mq/w0AQ3+QjFC M09uaCDd0oewny+8586Q0D/Sr2vTjq2nlzh6Twsekgf53vftpp67sZoVjWSizp/lmODr pC9w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=u17NtD1y; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id g10-20020a170906868a00b008e259a32aa9si12564498ejx.856.2023.03.01.01.10.33 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Mar 2023 01:10:33 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=u17NtD1y; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A10C13858430 for ; Wed, 1 Mar 2023 09:10:29 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A10C13858430 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1677661829; bh=ajf1sNjNCgWNhQ/CeBOoXVytz3/YR44/jYsaq/SO3Y0=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=u17NtD1yQo9E/dc295TpUASlmr5erNnK9usY8onQo2FV3zm9fL01UklC/rO3JSriP SUgmojas78giaOruU/sZBZrdYE8itL70xaEWWLmTbr7798Fb6yfgMVZR6Dqp1cn8aH DIuDeM1i+U5i0asfiQ6XWPcc4baFU4f6hbMfkors= 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.220.28]) by sourceware.org (Postfix) with ESMTPS id 7FAE23858CDB for ; Wed, 1 Mar 2023 09:09:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 7FAE23858CDB Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out1.suse.de (Postfix) with ESMTP id 2F6A821A85 for ; Wed, 1 Mar 2023 09:09:35 +0000 (UTC) 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 1A3692C141 for ; Wed, 1 Mar 2023 09:09:34 +0000 (UTC) Date: Wed, 1 Mar 2023 09:09:34 +0000 (UTC) To: gcc-patches@gcc.gnu.org Subject: [PATCH] tree-optimization/108970 - ICE with vectorizer peeling User-Agent: Alpine 2.22 (LSU 394 2020-01-19) MIME-Version: 1.0 X-Spam-Status: No, score=-10.6 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.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Richard Biener via Gcc-patches From: Richard Biener Reply-To: Richard Biener Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" Message-Id: <20230301091029.A10C13858430@sourceware.org> X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1759155935221186056?= X-GMAIL-MSGID: =?utf-8?q?1759155935221186056?= The function slpeel_can_duplicate_loop_p fails to verify we can copy blocks, instead slpeel_tree_duplicate_loop_to_edge_cfg does but that's too late. The following fixes this, also simplifying error reporting which is somewhat pointless if we ICE immediately. Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. PR tree-optimization/108970 * tree-vect-loop-manip.cc (slpeel_can_duplicate_loop_p): Check we can copy the BBs. (slpeel_tree_duplicate_loop_to_edge_cfg): Avoid redundant check. (vect_do_peeling): Streamline error handling. * gcc.dg/pr108970.c: New testcase. --- gcc/testsuite/gcc.dg/pr108970.c | 19 ++++++++++++++ gcc/tree-vect-loop-manip.cc | 44 +++++++++------------------------ 2 files changed, 31 insertions(+), 32 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr108970.c diff --git a/gcc/testsuite/gcc.dg/pr108970.c b/gcc/testsuite/gcc.dg/pr108970.c new file mode 100644 index 00000000000..7def8afd5e3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr108970.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -ftree-loop-vectorize -fno-tree-dce -fno-tree-scev-cprop" } */ + +int m; + +__attribute__ ((noinline, returns_twice)) void +empty (void) +{ +} + +void +foo (void) +{ + while (m < 1) + { + empty (); + ++m; + } +} diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc index 6aa3d2ed0bf..d88edafa018 100644 --- a/gcc/tree-vect-loop-manip.cc +++ b/gcc/tree-vect-loop-manip.cc @@ -1080,12 +1080,6 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop *loop, /* Allow duplication of outer loops. */ if (scalar_loop->inner) duplicate_outer_loop = true; - /* Check whether duplication is possible. */ - if (!can_copy_bbs_p (pbbs, scalar_loop->num_nodes)) - { - free (bbs); - return NULL; - } /* Generate new loop structure. */ new_loop = duplicate_loop (scalar_loop, loop_outer (scalar_loop)); @@ -1329,7 +1323,11 @@ slpeel_can_duplicate_loop_p (const class loop *loop, const_edge e) || (e != exit_e && e != entry_e)) return false; - return true; + basic_block *bbs = XNEWVEC (basic_block, loop->num_nodes); + get_loop_body_with_size (loop, bbs, loop->num_nodes); + bool ret = can_copy_bbs_p (bbs, loop->num_nodes); + free (bbs); + return ret; } /* Function vect_get_loop_location. @@ -2864,7 +2862,6 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, } } - dump_user_location_t loop_loc = find_loop_location (loop); if (vect_epilogues) /* Make sure to set the epilogue's epilogue scalar loop, such that we can use the original scalar loop as remaining epilogue if necessary. */ @@ -2874,20 +2871,11 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, if (prolog_peeling) { e = loop_preheader_edge (loop); - if (!slpeel_can_duplicate_loop_p (loop, e)) - { - dump_printf_loc (MSG_MISSED_OPTIMIZATION, loop_loc, - "loop can't be duplicated to preheader edge.\n"); - gcc_unreachable (); - } + gcc_checking_assert (slpeel_can_duplicate_loop_p (loop, e)); + /* Peel prolog and put it on preheader edge of loop. */ prolog = slpeel_tree_duplicate_loop_to_edge_cfg (loop, scalar_loop, e); - if (!prolog) - { - dump_printf_loc (MSG_MISSED_OPTIMIZATION, loop_loc, - "slpeel_tree_duplicate_loop_to_edge_cfg failed.\n"); - gcc_unreachable (); - } + gcc_assert (prolog); prolog->force_vectorize = false; slpeel_update_phi_nodes_for_loops (loop_vinfo, prolog, loop, true); first_loop = prolog; @@ -2949,12 +2937,8 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, if (epilog_peeling) { e = single_exit (loop); - if (!slpeel_can_duplicate_loop_p (loop, e)) - { - dump_printf_loc (MSG_MISSED_OPTIMIZATION, loop_loc, - "loop can't be duplicated to exit edge.\n"); - gcc_unreachable (); - } + gcc_checking_assert (slpeel_can_duplicate_loop_p (loop, e)); + /* Peel epilog and put it on exit edge of loop. If we are vectorizing said epilog then we should use a copy of the main loop as a starting point. This loop may have already had some preliminary transformations @@ -2964,12 +2948,8 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, vectorizing. */ epilog = vect_epilogues ? get_loop_copy (loop) : scalar_loop; epilog = slpeel_tree_duplicate_loop_to_edge_cfg (loop, epilog, e); - if (!epilog) - { - dump_printf_loc (MSG_MISSED_OPTIMIZATION, loop_loc, - "slpeel_tree_duplicate_loop_to_edge_cfg failed.\n"); - gcc_unreachable (); - } + gcc_assert (epilog); + epilog->force_vectorize = false; slpeel_update_phi_nodes_for_loops (loop_vinfo, loop, epilog, false);