From patchwork Wed May 24 10:13:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 98430 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp2732475vqo; Wed, 24 May 2023 03:14:47 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4X5rdom75AF2dlltT3jsp/VhybVNOIZtA6F8B/EUcMm7YhuKsKbHxN6Vj2izHwF40Qbqyw X-Received: by 2002:aa7:cf88:0:b0:510:deb5:ff4f with SMTP id z8-20020aa7cf88000000b00510deb5ff4fmr1293964edx.35.1684923287202; Wed, 24 May 2023 03:14:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1684923287; cv=none; d=google.com; s=arc-20160816; b=zrxZHELPIma3bJxsfQx76tct8d4Uy72vpvbGkAur/eRQ8S2lCbTPjZV7Na+vbmJ+Bu xfRpCpR8rWE1QIBVMfgOWbRcLx6dZnomo1b9WEi7VAbWXpk1idRVcOyohPTHq982CXuU bHfNMojkIDQJ7nzZ71AdB5H9WSCVP84AX6E3WMeC1RcjEkBWUnroy/cW48CoZnA9ThYq 9xkeRPxDesZuZRGrG9G9ILXXVKjA4Q9JDlZFj/Z991EuiiAyEV6jh6gjN4MdMLdepr8J 8Di4AZCUFPoKhNdc778cnU47bN7w4SJ8KVU4LRO0bFSQ1M+pZ8xEqvJFm4UKj2Ea2fS3 cHlw== 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:cc:to:date:dmarc-filter :delivered-to:dkim-signature:dkim-filter; bh=Urw9dyTST8+0991zCBy9KjFtPn+MhbPUZBbHAHRkvLI=; b=QovLd7YHSoICCdZUeeIJfpFgAda7KMsFUq48aZDGyG9Oj41xftXr8+pU4+vyFRd/Km VB1Dcr/UWNEJ1gwEQpRzCgiJrLvgLmusJVT/s+Mzwc63JAbGYPIHLCxH/qereiABP2Xk UjaA245bzPRaMUpjgooshWKBfYBvp3fBSXlA5+pJhI5PBN+BffLrK9DEhyh5JVkCoSNW wiUALOTnNQSY5r+Qq7HIPL/FQBTwzmwRRruay7d5ddPAt5iw51H2pJ9RcgmLIIIWmdZ6 oF1YpXggh0wE/KJYmkgyf8b1GGFgQRJbX0n9LVE6VtdDJ78i2pstnaGAPi8zAP+WKckT DD/Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=ddqnLxbx; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 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. [8.43.85.97]) by mx.google.com with ESMTPS id b10-20020aa7c90a000000b005067c8902e7si726759edt.626.2023.05.24.03.14.46 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 May 2023 03:14:47 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=ddqnLxbx; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 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 E7EC63857708 for ; Wed, 24 May 2023 10:14:45 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E7EC63857708 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1684923285; bh=Urw9dyTST8+0991zCBy9KjFtPn+MhbPUZBbHAHRkvLI=; h=Date:To:cc:Subject:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=ddqnLxbxtK5W2OOheqeqrkJq08Zy3Rp3ONU/Pd+ufYBtFFCz+HHZ0c3sFhrS1kL8t O0MXJLiiZFZ4/k5Efhj1KGLPvwH/gDstSotuU9EKDx09f7/s9K1nHlRV+FI/fxawTw vVRbn3JUGjJ4yt0fyzNHRqGH86LIHCRa7Pf7+QFY= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2001:67c:2178:6::1d]) by sourceware.org (Postfix) with ESMTPS id 177D7385841D for ; Wed, 24 May 2023 10:13:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 177D7385841D Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 7EF401F45F; Wed, 24 May 2023 10:13:57 +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 454562C141; Wed, 24 May 2023 10:13:57 +0000 (UTC) Date: Wed, 24 May 2023 10:13:57 +0000 (UTC) To: gcc-patches@gcc.gnu.org cc: ubizjak@gmail.com, hongtao.liu@intel.com Subject: [PATCH] target/109944 - avoid STLF fail for V16QImode CTOR expansion 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, KAM_SHORT, 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 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: <20230524101445.E7EC63857708@sourceware.org> X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1766770121054905278?= X-GMAIL-MSGID: =?utf-8?q?1766770121054905278?= The following dispatches to V2DImode CTOR expansion instead of using sets of (subreg:DI (reg:V16QI 146) [08]) which causes LRA to spill DImode and reload V16QImode. The same applies for V8QImode or V4HImode construction from SImode parts which happens during 32bit libgcc build. Boostrapped and tested on x86_64-unknown-linux-gnu. OK? Thanks, Richard. PR target/109944 * config/i386/i386-expand.cc (ix86_expand_vector_init_general): Perform final vector composition using ix86_expand_vector_init_general instead of setting the highpart and lowpart which causes spilling. * gcc.target/i386/pr109944-1.c: New testcase. * gcc.target/i386/pr109944-2.c: Likewise. --- gcc/config/i386/i386-expand.cc | 11 ++++---- gcc/testsuite/gcc.target/i386/pr109944-1.c | 30 ++++++++++++++++++++++ gcc/testsuite/gcc.target/i386/pr109944-2.c | 17 ++++++++++++ 3 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr109944-1.c create mode 100644 gcc/testsuite/gcc.target/i386/pr109944-2.c diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc index ff3d382f1b4..19acd9c01f9 100644 --- a/gcc/config/i386/i386-expand.cc +++ b/gcc/config/i386/i386-expand.cc @@ -16367,11 +16367,12 @@ quarter: emit_move_insn (target, gen_lowpart (mode, words[0])); else if (n_words == 2) { - rtx tmp = gen_reg_rtx (mode); - emit_clobber (tmp); - emit_move_insn (gen_lowpart (tmp_mode, tmp), words[0]); - emit_move_insn (gen_highpart (tmp_mode, tmp), words[1]); - emit_move_insn (target, tmp); + gcc_assert (tmp_mode == DImode || tmp_mode == SImode); + machine_mode concat_mode = tmp_mode == DImode ? V2DImode : V2SImode; + rtx tmp = gen_reg_rtx (concat_mode); + vals = gen_rtx_PARALLEL (concat_mode, gen_rtvec_v (2, words)); + ix86_expand_vector_init_general (false, concat_mode, tmp, vals); + emit_move_insn (target, gen_lowpart (mode, tmp)); } else if (n_words == 4) { diff --git a/gcc/testsuite/gcc.target/i386/pr109944-1.c b/gcc/testsuite/gcc.target/i386/pr109944-1.c new file mode 100644 index 00000000000..d82214d9ebc --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr109944-1.c @@ -0,0 +1,30 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +void foo (char * __restrict a, char *b) +{ + a[0] = b[0]; + a[1] = b[16]; + a[2] = b[32]; + a[3] = b[48]; + a[4] = b[64]; + a[5] = b[80]; + a[6] = b[96]; + a[7] = b[112]; + a[8] = b[128]; + a[9] = b[144]; + a[10] = b[160]; + a[11] = b[176]; + a[12] = b[192]; + a[13] = b[208]; + a[14] = b[224]; + a[15] = b[240]; +} + +/* We do not want to generate a spill/reload for when the store is vectorized. + movq %rdx, -24(%rsp) +... + movq %rax, -16(%rsp) + movdqa -24(%rsp), %xmm0 + movups %xmm0, (%rdi) */ +/* { dg-final { scan-assembler-not "movdq\[^\r\n\]*\[bs\]p\\\), %xmm" } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr109944-2.c b/gcc/testsuite/gcc.target/i386/pr109944-2.c new file mode 100644 index 00000000000..318dfab0250 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr109944-2.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -msse2" } */ + +typedef char v16qi __attribute__((vector_size(16))); +v16qi foo (char *b) +{ + return (v16qi){ b[0], b[16], b[32], b[48], b[64], b[80], b[96], b[112], + b[128], b[144], b[160], b[176], b[192], b[208], b[224], b[240] }; +} + +/* We do not want to generate a spill/reload + movq %rdx, -24(%rsp) +... + movq %rax, -16(%rsp) + movdqa -24(%rsp), %xmm0 + movups %xmm0, (%rdi) */ +/* { dg-final { scan-assembler-not "movdq\[^\r\n\]*\[bs\]p\\\), %xmm" } } */