From patchwork Wed Jan 5 05:38:51 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: liuhongt X-Patchwork-Id: 49546 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 2F24F385842B for ; Wed, 5 Jan 2022 05:39:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2F24F385842B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1641361163; bh=4VuDsQyj7MNOS+hOvC70OX7hXOo2iF3GzNNivZLoTz4=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=Au6651WcB3c2C62QtR2W1OibcGlFcDX9IsPBwqsMZ5kWxbwQTn1/V41uXwQKaI6Xm u2nOt7ldxlR0n7+tK2H3Yj/7aE/pQkVyRwoMkL+s4woM0gBu+CjOJxANOhThBxPvEl wMu5Xe45on91mGHsy8vq5AcRXEU/pegd+cQDTnGE= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by sourceware.org (Postfix) with ESMTPS id 6071D3858C2C for ; Wed, 5 Jan 2022 05:38:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6071D3858C2C X-IronPort-AV: E=McAfee;i="6200,9189,10217"; a="242580464" X-IronPort-AV: E=Sophos;i="5.88,262,1635231600"; d="scan'208";a="242580464" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Jan 2022 21:38:52 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.88,262,1635231600"; d="scan'208";a="590911869" Received: from scymds01.sc.intel.com ([10.148.94.138]) by fmsmga004.fm.intel.com with ESMTP; 04 Jan 2022 21:38:52 -0800 Received: from shliclel051.sh.intel.com (shliclel051.sh.intel.com [10.239.236.51]) by scymds01.sc.intel.com with ESMTP id 2055cp6P021737; Tue, 4 Jan 2022 21:38:51 -0800 To: gcc-patches@gcc.gnu.org Subject: [PATCH] [RTL/fwprop] Allow propagations from inner loop to outer loop. Date: Wed, 5 Jan 2022 13:38:51 +0800 Message-Id: <20220105053851.55671-1-hongtao.liu@intel.com> X-Mailer: git-send-email 2.18.1 X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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: liuhongt via Gcc-patches From: liuhongt Reply-To: liuhongt Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Bootstrapped and regtested on x86_64-pc-linux-gnu{-m32,}. Ok for trunk. gcc/ChangeLog: PR rtl/103750 * cfgloop.h (loop_contains_p): New function. * fwprop.c (forward_propagate_into): Allow propagations from inner loop to outer loop. gcc/testsuite/ChangeLog: * g++.target/i386/pr103750-fwprop-1.C: New test. --- gcc/cfgloop.h | 12 +++++++++ gcc/fwprop.c | 7 +++-- .../g++.target/i386/pr103750-fwprop-1.C | 26 +++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.target/i386/pr103750-fwprop-1.C diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h index d2714e20cb0..e8fe0cedd5f 100644 --- a/gcc/cfgloop.h +++ b/gcc/cfgloop.h @@ -908,6 +908,18 @@ loop_outermost (class loop *loop) return (*loop->superloops)[1]; } +/* Returns true if loop OUTER contains loop INNER. */ +static inline bool +loop_contains_p (class loop* outer, class loop* inner) +{ + unsigned n = vec_safe_length (inner->superloops); + + for (unsigned i = 0; i != n; i++) + if ((*inner->superloops)[i] == outer) + return true; + return false; +} + extern void record_niter_bound (class loop *, const widest_int &, bool, bool); extern HOST_WIDE_INT get_estimated_loop_iterations_int (class loop *); extern HOST_WIDE_INT get_max_loop_iterations_int (const class loop *); diff --git a/gcc/fwprop.c b/gcc/fwprop.c index 2eab4fd4614..aed48e7273f 100644 --- a/gcc/fwprop.c +++ b/gcc/fwprop.c @@ -866,10 +866,13 @@ forward_propagate_into (use_info *use, bool reg_prop_only = false) rtx src = SET_SRC (def_set); /* Allow propagations into a loop only for reg-to-reg copies, since - replacing one register by another shouldn't increase the cost. */ + replacing one register by another shouldn't increase the cost. + Propagations from inner loop to outer loop should be also ok. */ struct loop *def_loop = def_insn->bb ()->cfg_bb ()->loop_father; struct loop *use_loop = use->bb ()->cfg_bb ()->loop_father; - if ((reg_prop_only || def_loop != use_loop) + if ((reg_prop_only + || (use_loop && def_loop != use_loop + && !loop_contains_p (use_loop, def_loop))) && (!reg_single_def_p (dest) || !reg_single_def_p (src))) return false; diff --git a/gcc/testsuite/g++.target/i386/pr103750-fwprop-1.C b/gcc/testsuite/g++.target/i386/pr103750-fwprop-1.C new file mode 100644 index 00000000000..26987d307aa --- /dev/null +++ b/gcc/testsuite/g++.target/i386/pr103750-fwprop-1.C @@ -0,0 +1,26 @@ +/* PR target/103750. */ +/* { dg-do compile } */ +/* { dg-options "-O2 -std=c++1y -march=cannonlake -fdump-rtl-fwprop1" } */ +/* { dg-final { scan-rtl-dump-not "subreg:HI\[ \\\(\]*reg:SI\[^\n]*\n\[^\n]*UNSPEC_TZCNT" "fwprop1" } } */ + +#include +const char16_t *qustrchr(char16_t *n, char16_t *e, char16_t c) noexcept +{ + __m256i mch256 = _mm256_set1_epi16(c); + for ( ; n < e; n += 32) { + __m256i data1 = _mm256_loadu_si256(reinterpret_cast(n)); + __m256i data2 = _mm256_loadu_si256(reinterpret_cast(n) + 1); + __mmask16 mask1 = _mm256_cmpeq_epu16_mask(data1, mch256); + __mmask16 mask2 = _mm256_cmpeq_epu16_mask(data2, mch256); + if (_kortestz_mask16_u8(mask1, mask2)) + continue; + + unsigned idx = _tzcnt_u32(mask1); + if (mask1 == 0) { + idx = __tzcnt_u16(mask2); + n += 16; + } + return n + idx; + } + return e; +}