From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg1-x543.google.com (mail-pg1-x543.google.com [IPv6:2607:f8b0:4864:20::543]) by sourceware.org (Postfix) with ESMTPS id A41D03857805 for ; Fri, 25 Sep 2020 03:07:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org A41D03857805 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=kito.cheng@sifive.com Received: by mail-pg1-x543.google.com with SMTP id k133so1319140pgc.7 for ; Thu, 24 Sep 2020 20:07:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=zYe985FWKle4rw09M7ldVX8ExOIncEIMKGKIm2Wxdcw=; b=D/bBY/WGRISBnlSVBEamPXf/HX1zQ+ks3mAyIzCf36puDWqQYTa23po4baAaxE29Ue sRCs15gypd/9f6q23LPAR7SAznKo7S/ZLOAyQ5XUR9IEEzP1vuX2Wu9qC5pEXPbxNkCQ p+/l6JsJOBfrTj1jXQtfn6HiHcyHO74D7TApx4mNyFZYflcagUW3is3aBaRWZCxxYoQh T0Xf58nr+K65CcyFaiM+aEYOxa0cLGhUxfOabZEP+Hydzu8pkzbFH/yroAlOUh6LJN4P 374FCf+ahNP0/INOJhxtPwIZV1W2fOUqjZ7Vz6dYGxWW89Djt9Mh2/R/jmo9l1z5SL5L aJnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=zYe985FWKle4rw09M7ldVX8ExOIncEIMKGKIm2Wxdcw=; b=MWpmGCFCaeRxTxlGCmnP7ciOVUpCfj4tlevkKVYB5CapgDgMmhxjoTzDZmTOMGpPrl em3MdnJcsCsewW6uaet+OE+10a8qeII0RmBMy++NVZdN8pO0RA6NggBUU3siRc6MIb8f dmXk+dSC2no++Fj2hrUjR0Rg/Kh7ttcBcKYt414vmwI+Q7s0dlmAUUz3mPkKkUKGYci1 f1b7KpW1vH3cMrK8CDGFf4EXZ3rk6eC+YC8DrC62JBhmtpuTt7zCZmrSiRdDCYMf/asv jRMoX5S9zCy1DEvI+s5JHlHGzzg8Uisr4ANengqfg2XoLMz7W1G0fX6Fg6vsitfwD8M+ Hcug== X-Gm-Message-State: AOAM5324y8yV/sv9gGcKUT+Sg2nz2uqHfLTbVsrqgNO/jJoHD6WspTbW 2dUnbNJ3XDPZHO4bfsKIX9VIK9ZNiwUc+BD9jUw= X-Google-Smtp-Source: ABdhPJyjb5t0cbJxzMUVT59DoPgNVTXt9lf1T8i7jQSIRbB9HK/EVnlepuq4fxerX2KgrvR+yqbZtQ== X-Received: by 2002:a17:902:6bc3:b029:d1:e609:7a29 with SMTP id m3-20020a1709026bc3b02900d1e6097a29mr2169768plt.46.1601003220187; Thu, 24 Sep 2020 20:07:00 -0700 (PDT) Received: from hsinchu02.internal.sifive.com (114-34-229-221.HINET-IP.hinet.net. [114.34.229.221]) by smtp.gmail.com with ESMTPSA id y10sm824495pfp.77.2020.09.24.20.06.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Sep 2020 20:06:59 -0700 (PDT) From: Kito Cheng To: gcc-patches@gcc.gnu.org, kito.cheng@gmail.com, jimw@sifive.com, rguenther@suse.de Cc: Kito Cheng Subject: [PATCH v2] PR target/96759 - Handle global variable assignment from misaligned structure/PARALLEL return values. Date: Fri, 25 Sep 2020 11:06:51 +0800 Message-Id: <20200925030651.67653-1-kito.cheng@sifive.com> X-Mailer: git-send-email 2.28.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-13.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, 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: , X-List-Received-Date: Fri, 25 Sep 2020 03:07:03 -0000 In g:70cdb21e579191fe9f0f1d45e328908e59c0179e, DECL/global variable has handled misaligned stores, but it didn't handle PARALLEL values, and I refer the other part of this function, I found the PARALLEL need handled by emit_group_* functions, so I add a check, and using emit_group_store if storing a PARALLEL value, also checked this change didn't break the testcase(gcc.target/arm/unaligned-argument-3.c) added by the orginal changes. For riscv64 target, struct S {int a; double b;} will pack into a parallel value to return and it has TImode when misaligned access is supported, however TImode required 16-byte align, but it only 8-byte align, so it go to the misaligned stores handling, then it will try to generate move instruction from a PARALLEL value. Tested on following target without introduced new reguression: - riscv32/riscv64 elf - x86_64-linux - arm-eabi v2 changes: - Use maybe_emit_group_store instead of emit_group_store. - Remove push_temp_slots/pop_temp_slots, emit_group_store only require stack temp slot when dst is CONCAT or PARALLEL, however maybe_emit_group_store will always use REG for dst if needed. gcc/ChangeLog: PR target/96759 * expr.c (expand_assignment): Handle misaligned stores with PARALLEL value. gcc/testsuite/ChangeLog: PR target/96759 * g++.target/riscv/pr96759.C: New. * gcc.target/riscv/pr96759.c: New. --- gcc/expr.c | 2 ++ gcc/testsuite/g++.target/riscv/pr96759.C | 8 ++++++++ gcc/testsuite/gcc.target/riscv/pr96759.c | 13 +++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 gcc/testsuite/g++.target/riscv/pr96759.C create mode 100644 gcc/testsuite/gcc.target/riscv/pr96759.c diff --git a/gcc/expr.c b/gcc/expr.c index 1a15f24b3979..6eb13a12c8c5 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -5168,6 +5168,8 @@ expand_assignment (tree to, tree from, bool nontemporal) rtx reg, mem; reg = expand_expr (from, NULL_RTX, VOIDmode, EXPAND_NORMAL); + /* Handle PARALLEL. */ + reg = maybe_emit_group_store (reg, TREE_TYPE (from)); reg = force_not_mem (reg); mem = expand_expr (to, NULL_RTX, VOIDmode, EXPAND_WRITE); if (TREE_CODE (to) == MEM_REF && REF_REVERSE_STORAGE_ORDER (to)) diff --git a/gcc/testsuite/g++.target/riscv/pr96759.C b/gcc/testsuite/g++.target/riscv/pr96759.C new file mode 100644 index 000000000000..673999a4baf7 --- /dev/null +++ b/gcc/testsuite/g++.target/riscv/pr96759.C @@ -0,0 +1,8 @@ +/* { dg-options "-mno-strict-align -std=gnu++17" } */ +/* { dg-do compile } */ +struct S { + int a; + double b; +}; +S GetNumbers(); +auto [globalC, globalD] = GetNumbers(); diff --git a/gcc/testsuite/gcc.target/riscv/pr96759.c b/gcc/testsuite/gcc.target/riscv/pr96759.c new file mode 100644 index 000000000000..621c39196fca --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/pr96759.c @@ -0,0 +1,13 @@ +/* { dg-options "-mno-strict-align" } */ +/* { dg-do compile } */ + +struct S { + int a; + double b; +}; +struct S GetNumbers(); +struct S g; + +void foo(){ + g = GetNumbers(); +} -- 2.28.0