From patchwork Mon Oct 19 09:32:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 1384126 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.de Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (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 ozlabs.org (Postfix) with ESMTPS id 4CFBPZ4XZkz9sSf for ; Mon, 19 Oct 2020 20:32:48 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 65CDE3850418; Mon, 19 Oct 2020 09:32:45 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by sourceware.org (Postfix) with ESMTPS id 19D563861001 for ; Mon, 19 Oct 2020 09:32:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 19D563861001 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=rguenther@suse.de X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id DD293B1BC for ; Mon, 19 Oct 2020 09:32:40 +0000 (UTC) Date: Mon, 19 Oct 2020 11:32:40 +0200 (CEST) From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: [PATCH] tree-optimization/97486 - avoid edge insertion in SLP vectorizing Message-ID: User-Agent: Alpine 2.21 (LSU 202 2017-01-01) MIME-Version: 1.0 X-Spam-Status: No, score=-11.0 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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: , Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" This avoids edge inserting and eventual splitting during BB SLP vectorization for now. Bootstrap / regtest pending on x86_64-unknown-linux-gnu. 2020-10-19 Richard Biener PR tree-optimization/97486 * tree-vect-slp.c (vect_slp_function): Split after stmts ending a BB. * gcc.dg/vect/bb-slp-pr97486.c: New testcase. --- gcc/testsuite/gcc.dg/vect/bb-slp-pr97486.c | 27 ++++++++++++++++++++++ gcc/tree-vect-slp.c | 9 ++++++++ 2 files changed, 36 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/vect/bb-slp-pr97486.c diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pr97486.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pr97486.c new file mode 100644 index 00000000000..17d48a7fe69 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-pr97486.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ + +struct { + int *end_info; + int *fp; +} png_load_body_c; + +int *png_set_longjmp_fn(); + +void setjmp(); + +void png_load_body() +{ + int *fp; + int png_ptr, info_ptr, *end_info; + if (!fp) + return; + if (png_ptr) { + info_ptr = 0; + end_info = png_set_longjmp_fn(); + } + png_load_body_c.end_info = end_info; + png_load_body_c.fp = fp; + if (png_ptr) + png_set_longjmp_fn(); + setjmp(info_ptr); +} diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 20a109b5347..0f9185e6c55 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -4285,6 +4285,15 @@ vect_slp_function (function *fun) } else bbs.safe_push (bb); + + /* When we have a stmt ending this block we have to insert on + edges when inserting after it. Avoid this for now. */ + if (gimple *last = last_stmt (bb)) + if (stmt_ends_bb_p (last)) + { + r |= vect_slp_bbs (bbs); + bbs.truncate (0); + } } if (!bbs.is_empty ())