Message ID | 20221026074950.10462-1-sebastian.huber@embedded-brains.de |
---|---|
State | Accepted |
Headers |
Return-Path: <gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp114789wru; Wed, 26 Oct 2022 00:50:25 -0700 (PDT) X-Google-Smtp-Source: AMsMyM749ruQPZa/PuEW3RHZAg6D3w95+YKsIm/+0SxrwUwM+eCHtj7fG4+M9GAFAzYdtWxL9xo8 X-Received: by 2002:a17:906:cc18:b0:78d:ee0f:ce02 with SMTP id ml24-20020a170906cc1800b0078dee0fce02mr36581131ejb.323.1666770625073; Wed, 26 Oct 2022 00:50:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666770625; cv=none; d=google.com; s=arc-20160816; b=loM7lcS+H1Wi/dXAQyOBSc3rm6k1O7GBA+vDSDDj/EHCiGq1HLYn+w+mcnHQmQyraU fhhFCJfYUFWXTQ/kJqW62KDOBk/B/mCefeBn3qRUOjWXlwqBFAxCpH1f1pQkSOCYDcVm AhL1mvodM3TH0h91bWEUy6VuICmEDkUOvhdER2+jWNtncuybDInWOI626Ljp4bERF+Ko +6118GXNU7jDBZVihLkpiz/l8JSZLvZSxtArfmh3cdFCoPPJvUcp5Q4xzx0EKUN4cuH6 SCX9SZiGJ6ue0BzrYFhHqbjnW5/6Fa4r35JMuOAyQeHsVOITMmr4fpRYlLB8vhaUtIya oztw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:message-id:date:subject:to:from:dmarc-filter :delivered-to; bh=nnqLIqA6R+94ckGPe+2WLoy+UdriQvSsm7cPxy9XEr4=; b=Y4joBJRIZeER+sEBOeIeDhAF7RYHzBfe3PxGIWpolejuvj7fuiij4/hHnXnT+wrIGL GjWbTjB7U7YqZE6++NAnczYUeyi+NLHKFBjclq1EqPAWpVqVhE3RpixxEfkh21mspJGJ olfxJNt6ioGU0voc20+MVXRsPvIz3U51UTpJVsvDkQ1KjSg/4wKgFzSLyicd8sh+cJja avjyKcHjsvTpujd9/6v428KNyyQRA6NZDI8DDb+zuh2io5skohbElSmGpwxoQSX4+8LJ qZitUBcbyBTnrbHmVlDYXF2ry1ORlh8TqV9RqsSUx58oa1AIGHKuOSOmOPg6XQKTIkE+ thLQ== ARC-Authentication-Results: i=1; mx.google.com; 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" Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id v23-20020a170906565700b0078210c21ecesi4232161ejr.304.2022.10.26.00.50.24 for <ouuuleilei@gmail.com> (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Oct 2022 00:50:25 -0700 (PDT) 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; 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" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 029283846448 for <ouuuleilei@gmail.com>; Wed, 26 Oct 2022 07:50:20 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from dedi548.your-server.de (dedi548.your-server.de [85.10.215.148]) by sourceware.org (Postfix) with ESMTPS id D6612385E032 for <gcc-patches@gcc.gnu.org>; Wed, 26 Oct 2022 07:49:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D6612385E032 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embedded-brains.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=embedded-brains.de Received: from sslproxy03.your-server.de ([88.198.220.132]) by dedi548.your-server.de with esmtpsa (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from <sebastian.huber@embedded-brains.de>) id 1onbAg-000PAO-95 for gcc-patches@gcc.gnu.org; Wed, 26 Oct 2022 09:49:53 +0200 Received: from [82.100.198.138] (helo=mail.embedded-brains.de) by sslproxy03.your-server.de with esmtpsa (TLSv1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from <sebastian.huber@embedded-brains.de>) id 1onbAf-0009Lz-RO for gcc-patches@gcc.gnu.org; Wed, 26 Oct 2022 09:49:53 +0200 Received: from localhost (localhost [127.0.0.1]) by mail.embedded-brains.de (Postfix) with ESMTP id 85EC7480025 for <gcc-patches@gcc.gnu.org>; Wed, 26 Oct 2022 09:49:53 +0200 (CEST) Received: from mail.embedded-brains.de ([127.0.0.1]) by localhost (zimbra.eb.localhost [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id FbwMbG5RwfbT for <gcc-patches@gcc.gnu.org>; Wed, 26 Oct 2022 09:49:53 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail.embedded-brains.de (Postfix) with ESMTP id 31C974800CD for <gcc-patches@gcc.gnu.org>; Wed, 26 Oct 2022 09:49:53 +0200 (CEST) X-Virus-Scanned: amavisd-new at zimbra.eb.localhost Received: from mail.embedded-brains.de ([127.0.0.1]) by localhost (zimbra.eb.localhost [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id NrwVLCrl3U11 for <gcc-patches@gcc.gnu.org>; Wed, 26 Oct 2022 09:49:53 +0200 (CEST) Received: from zimbra.eb.localhost (unknown [192.168.96.242]) by mail.embedded-brains.de (Postfix) with ESMTPSA id 0FD3D480025 for <gcc-patches@gcc.gnu.org>; Wed, 26 Oct 2022 09:49:53 +0200 (CEST) From: Sebastian Huber <sebastian.huber@embedded-brains.de> To: gcc-patches@gcc.gnu.org Subject: [PATCH] riscv/RTEMS: Add RISCV_GCOV_TYPE_SIZE Date: Wed, 26 Oct 2022 09:49:50 +0200 Message-Id: <20221026074950.10462-1-sebastian.huber@embedded-brains.de> X-Mailer: git-send-email 2.35.3 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Authenticated-Sender: smtp-embedded@poldinet.de X-Virus-Scanned: Clear (ClamAV 0.103.7/26699/Tue Oct 25 09:58:49 2022) X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, 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 <gcc-patches.gcc.gnu.org> List-Unsubscribe: <https://gcc.gnu.org/mailman/options/gcc-patches>, <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe> List-Archive: <https://gcc.gnu.org/pipermail/gcc-patches/> List-Post: <mailto:gcc-patches@gcc.gnu.org> List-Help: <mailto:gcc-patches-request@gcc.gnu.org?subject=help> List-Subscribe: <https://gcc.gnu.org/mailman/listinfo/gcc-patches>, <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe> Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" <gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org> X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1747735674938713372?= X-GMAIL-MSGID: =?utf-8?q?1747735674938713372?= |
Series |
riscv/RTEMS: Add RISCV_GCOV_TYPE_SIZE
|
|
Checks
Context | Check | Description |
---|---|---|
snail/gcc-patch-check | success | Github commit url |
Commit Message
Sebastian Huber
Oct. 26, 2022, 7:49 a.m. UTC
The RV32A extension does not support 64-bit atomic operations. For RTEMS, use a 32-bit gcov type for RV32. gcc/ChangeLog: * config/riscv/riscv.cc (riscv_gcov_type_size): New. (TARGET_GCOV_TYPE_SIZE): Likewise. * config/riscv/rtems.h (RISCV_GCOV_TYPE_SIZE): New. --- gcc/config/riscv/riscv.cc | 11 +++++++++++ gcc/config/riscv/rtems.h | 2 ++ 2 files changed, 13 insertions(+)
Comments
On 10/26/22 01:49, Sebastian Huber wrote: > The RV32A extension does not support 64-bit atomic operations. For RTEMS, use > a 32-bit gcov type for RV32. > > gcc/ChangeLog: > > * config/riscv/riscv.cc (riscv_gcov_type_size): New. > (TARGET_GCOV_TYPE_SIZE): Likewise. > * config/riscv/rtems.h (RISCV_GCOV_TYPE_SIZE): New. Why make this specific to rtems? ISTM the logic behind this change would apply independently of the os. jeff
On Thu, 27 Oct 2022 15:56:17 PDT (-0700), gcc-patches@gcc.gnu.org wrote: > > On 10/26/22 01:49, Sebastian Huber wrote: >> The RV32A extension does not support 64-bit atomic operations. For RTEMS, use >> a 32-bit gcov type for RV32. >> >> gcc/ChangeLog: >> >> * config/riscv/riscv.cc (riscv_gcov_type_size): New. >> (TARGET_GCOV_TYPE_SIZE): Likewise. >> * config/riscv/rtems.h (RISCV_GCOV_TYPE_SIZE): New. > > Why make this specific to rtems? ISTM the logic behind this change > would apply independently of the os. Looks like rv32gc is just broken here: $ cat test.s int func(int x) { return x + 1; } $ gcc -march=rv32gc -O3 -fprofile-update=atomic -fprofile-arcs test.c -S -o- func(int): lui a4,%hi(__gcov0.func(int)) lw a5,%lo(__gcov0.func(int))(a4) lw a2,%lo(__gcov0.func(int)+4)(a4) addi a0,a0,1 addi a3,a5,1 sltu a5,a3,a5 add a5,a5,a2 sw a3,%lo(__gcov0.func(int))(a4) sw a5,%lo(__gcov0.func(int)+4)(a4) ret _sub_I_00100_0: lui a0,%hi(.LANCHOR0) addi a0,a0,%lo(.LANCHOR0) tail __gcov_init _sub_D_00100_1: tail __gcov_exit __gcov0.func(int): .zero 8 Those are not atomic... On rv64 we got some amoadds, which are sane.
On 28/10/2022 01:05, Palmer Dabbelt wrote: > On Thu, 27 Oct 2022 15:56:17 PDT (-0700), gcc-patches@gcc.gnu.org wrote: >> >> On 10/26/22 01:49, Sebastian Huber wrote: >>> The RV32A extension does not support 64-bit atomic operations. For >>> RTEMS, use >>> a 32-bit gcov type for RV32. >>> >>> gcc/ChangeLog: >>> >>> * config/riscv/riscv.cc (riscv_gcov_type_size): New. >>> (TARGET_GCOV_TYPE_SIZE): Likewise. >>> * config/riscv/rtems.h (RISCV_GCOV_TYPE_SIZE): New. >> >> Why make this specific to rtems? ISTM the logic behind this change >> would apply independently of the os. Reducing the gcov type to 32-bit has the drawback that the program runtime is reduced. I am not sure if this is generally acceptable. > > Looks like rv32gc is just broken here: > > $ cat test.s > int func(int x) { return x + 1; } > $ gcc -march=rv32gc -O3 -fprofile-update=atomic -fprofile-arcs test.c -S > -o- > func(int): > lui a4,%hi(__gcov0.func(int)) > lw a5,%lo(__gcov0.func(int))(a4) > lw a2,%lo(__gcov0.func(int)+4)(a4) > addi a0,a0,1 > addi a3,a5,1 > sltu a5,a3,a5 > add a5,a5,a2 > sw a3,%lo(__gcov0.func(int))(a4) > sw a5,%lo(__gcov0.func(int)+4)(a4) > ret > _sub_I_00100_0: > lui a0,%hi(.LANCHOR0) > addi a0,a0,%lo(.LANCHOR0) > tail __gcov_init > _sub_D_00100_1: > tail __gcov_exit > __gcov0.func(int): > .zero 8 > > Those are not atomic... Well, you get at least a warning: test.c:1:1: warning: target does not support atomic profile update, single mode is selected With the patch you get: riscv-rtems6-gcc -march=rv32gc -O3 -fprofile-update=atomic -fprofile-arcs test.c -S -o- func: lui a5,%hi(__gcov0.func) li a4,1 addi a5,a5,%lo(__gcov0.func) amoadd.w zero,a4,0(a5) addi a0,a0,1 ret .size func, .-func The Armv7-A doesn't have an issue with 64-bit atomics: arm-rtems6-gcc -march=armv7-a -O3 -fprofile-update=atomic -fprofile-arcs test.c -S -o- func: @ args = 0, pretend = 0, frame = 0 @ frame_needed = 0, uses_anonymous_args = 0 @ link register save eliminated. movw r3, #:lower16:.LANCHOR0 movt r3, #:upper16:.LANCHOR0 push {r4, r5, r6, r7} mov r4, #1 mov r5, #0 .L2: ldrexd r6, r7, [r3] adds r6, r6, r4 adc r7, r7, r5 strexd r1, r6, r7, [r3] cmp r1, #0 bne .L2 add r0, r0, #1 pop {r4, r5, r6, r7} bx lr Maybe RV32 should also support LL/SC instructions with two 32-bit registers. Another option would be to split the atomic increment into two parts as suggested by Jakub Jelinek: https://patchwork.ozlabs.org/project/gcc/patch/19c4a81d-6ecd-8c6e-b641-e257c1959baf@suse.cz/#1447334 Another option would be to use library calls if hardware atomics are not available.
On 10/27/22 23:47, Sebastian Huber wrote: > On 28/10/2022 01:05, Palmer Dabbelt wrote: >> On Thu, 27 Oct 2022 15:56:17 PDT (-0700), gcc-patches@gcc.gnu.org wrote: >>> >>> On 10/26/22 01:49, Sebastian Huber wrote: >>>> The RV32A extension does not support 64-bit atomic operations. For >>>> RTEMS, use >>>> a 32-bit gcov type for RV32. >>>> >>>> gcc/ChangeLog: >>>> >>>> * config/riscv/riscv.cc (riscv_gcov_type_size): New. >>>> (TARGET_GCOV_TYPE_SIZE): Likewise. >>>> * config/riscv/rtems.h (RISCV_GCOV_TYPE_SIZE): New. >>> >>> Why make this specific to rtems? ISTM the logic behind this change >>> would apply independently of the os. > > Reducing the gcov type to 32-bit has the drawback that the program > runtime is reduced. I am not sure if this is generally acceptable. Right, but if you're limited by RV32A, then we're architecturally limited to 32bit atomics. So something has to give. I'm not objecting to this for rtems. I'm just noting that if we're dealing with an architectural limitation, then the issue is likely to show up in other operating systems, so we should at least ponder if we want to do an OS specific change or something more general. Jeff
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index 4e18a43539a..1b7f4fb1981 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -6637,6 +6637,17 @@ riscv_vector_alignment (const_tree type) #undef TARGET_VECTOR_ALIGNMENT #define TARGET_VECTOR_ALIGNMENT riscv_vector_alignment +#ifdef RISCV_GCOV_TYPE_SIZE +static HOST_WIDE_INT +riscv_gcov_type_size (void) +{ + return RISCV_GCOV_TYPE_SIZE; +} + +#undef TARGET_GCOV_TYPE_SIZE +#define TARGET_GCOV_TYPE_SIZE riscv_gcov_type_size +#endif + struct gcc_target targetm = TARGET_INITIALIZER; #include "gt-riscv.h" diff --git a/gcc/config/riscv/rtems.h b/gcc/config/riscv/rtems.h index 14e5e59caaa..3982b24382f 100644 --- a/gcc/config/riscv/rtems.h +++ b/gcc/config/riscv/rtems.h @@ -29,3 +29,5 @@ builtin_define ("__USE_INIT_FINI__"); \ builtin_assert ("system=rtems"); \ } while (0) + +#define RISCV_GCOV_TYPE_SIZE (TARGET_64BIT ? 64 : 32)