From patchwork Fri Nov 9 11:13:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Janne Blomqvist X-Patchwork-Id: 995443 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-489499-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="UOR9t8UN"; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="TmB6Nj1u"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 42ryFn5JsKz9sCQ for ; Fri, 9 Nov 2018 22:13:49 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id; q=dns; s=default; b=h1hZxcCIQRGp wZq/a+Shp3VBGqkpzxX4ePpFQoHWZTj/UpTm9wJfB6LZLwJvWz8B/HsyPYS7zc96 F6pN/+4OYassvwLz/pkxgnQp0MHz3m50ZP9PRs5fb2jWg6XcKUE4jSdoTbdPd4jO kZWqNNqf6lbswDFFsoVknLP+rMhGu1Y= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id; s=default; bh=MwEIq54WYCuPs0K2ZL 61q1BKcgY=; b=UOR9t8UNKSucESGErkDlEUkLvsqmb0Z1aRUQvWaFgNmnDGEse3 G/4GQ4Grn/W0rJ7A+srnGsmRzDqEtFjgpQY5Yu+8L4QVhnbESVibk+hrAZllWMZb llPtBBzN73RGUGWdAd+zFzMwcoJp7b6kScBZ3pLWXqTwQdyZIzZLDTB5g= Received: (qmail 29427 invoked by alias); 9 Nov 2018 11:13:42 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 29403 invoked by uid 89); 9 Nov 2018 11:13:42 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=HX-Received:sk:u9-v6mr, acinclude.m4, acincludem4, UD:acinclude.m4 X-HELO: mail-lj1-f194.google.com Received: from mail-lj1-f194.google.com (HELO mail-lj1-f194.google.com) (209.85.208.194) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 09 Nov 2018 11:13:40 +0000 Received: by mail-lj1-f194.google.com with SMTP id e5-v6so1257423lja.4; Fri, 09 Nov 2018 03:13:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=2Jg2XOZUMYXxCKh6wBdZPEV52+IhhTENnA9JdtT4yA8=; b=TmB6Nj1uEiOFjSu/5SOJ7OEi364aNfNs7Z1ETEcAEp/ie48V43Zpk6iHsHef7vzhN3 2/G15x3pAOsqv1gZkIA45fmXTP1tIacVHm5W5pBmJlV38rZv8pLD3Zj3IxnHtvb6hjT3 2o6zqfiiHHVXfY5Whg7u7nEk9W9krk9gHiRMPXVThUbW8HOYRwKQ++9i9QXHsoNW2uKc 3IopKAjedqHjwlLcdkFfmeH1YTLHH1qZDRKrZpZ9WFC/VkhqI5ODwhCujdyymVOsJkrm fR0Mk5sw+Zek3rt9NDXIO7AKLgyUsOMOwP1qmdKmAnKLpovlnlqraeJt/j+t8u9bxq/D oTBA== Received: from dt.lan (88-114-247-254.elisa-laajakaista.fi. [88.114.247.254]) by smtp.gmail.com with ESMTPSA id a25sm1166521lfk.31.2018.11.09.03.13.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 09 Nov 2018 03:13:36 -0800 (PST) From: Janne Blomqvist To: fortran@gcc.gnu.org, gcc-patches@gcc.gnu.org Cc: Janne Blomqvist Subject: [PATCH, libgfortran] Replace sync builtins with atomic builtins Date: Fri, 9 Nov 2018 13:13:28 +0200 Message-Id: <20181109111328.21169-1-blomqvist.janne@gmail.com> The old __sync builtins have been deprecated for a long time now in favor of the __atomic builtins following the C++11/C11 memory model. This patch converts libgfortran to use the modern __atomic builtins. At the same time I weakened the consistency to acquire-release as that should be enough for this particular case. Jakub, as the original author of the algorithm, do you concur? Regtested on x86_64-pc-linux-gnu, Ok for trunk? libgfortran/ChangeLog: 2018-11-09 Janne Blomqvist * acinclude.m4 (LIBGFOR_CHECK_ATOMIC_FETCH_ADD): Rename and test presence of atomic builtins instead of sync builtins. * configure.ac (LIBGFOR_CHECK_ATOMIC_FETCH_ADD): Call new test. * io/io.h (inc_waiting_locked): Use __atomic_fetch_add. (predec_waiting_locked): Use __atomic_add_fetch. (dec_waiting_unlocked): Use __atomic_fetch_add. * config.h.in: Regenerated. * configure: Regenerated. --- libgfortran/acinclude.m4 | 20 ++++++++++---------- libgfortran/configure.ac | 4 ++-- libgfortran/io/io.h | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/libgfortran/acinclude.m4 b/libgfortran/acinclude.m4 index dd5429ac0d2..5b0c094e716 100644 --- a/libgfortran/acinclude.m4 +++ b/libgfortran/acinclude.m4 @@ -59,17 +59,17 @@ extern void bar(void) __attribute__((alias("foo")));]], [Define to 1 if the target supports __attribute__((alias(...))).]) fi]) -dnl Check whether the target supports __sync_fetch_and_add. -AC_DEFUN([LIBGFOR_CHECK_SYNC_FETCH_AND_ADD], [ - AC_CACHE_CHECK([whether the target supports __sync_fetch_and_add], - libgfor_cv_have_sync_fetch_and_add, [ +dnl Check whether the target supports __atomic_fetch_add. +AC_DEFUN([LIBGFOR_CHECK_ATOMIC_FETCH_ADD], [ + AC_CACHE_CHECK([whether the target supports __atomic_fetch_add], + libgfor_cv_have_atomic_fetch_add, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([[int foovar = 0;]], [[ -if (foovar <= 0) return __sync_fetch_and_add (&foovar, 1); -if (foovar > 10) return __sync_add_and_fetch (&foovar, -1);]])], - libgfor_cv_have_sync_fetch_and_add=yes, libgfor_cv_have_sync_fetch_and_add=no)]) - if test $libgfor_cv_have_sync_fetch_and_add = yes; then - AC_DEFINE(HAVE_SYNC_FETCH_AND_ADD, 1, - [Define to 1 if the target supports __sync_fetch_and_add]) +if (foovar <= 0) return __atomic_fetch_add (&foovar, 1, __ATOMIC_ACQ_REL); +if (foovar > 10) return __atomic_add_fetch (&foovar, -1, __ATOMIC_ACQ_REL);]])], + libgfor_cv_have_atomic_fetch_add=yes, libgfor_cv_have_atomic_fetch_add=no)]) + if test $libgfor_cv_have_atomic_fetch_add = yes; then + AC_DEFINE(HAVE_ATOMIC_FETCH_ADD, 1, + [Define to 1 if the target supports __atomic_fetch_add]) fi]) dnl Check for pragma weak. diff --git a/libgfortran/configure.ac b/libgfortran/configure.ac index 76007d38f6f..30ff8734760 100644 --- a/libgfortran/configure.ac +++ b/libgfortran/configure.ac @@ -608,8 +608,8 @@ fi LIBGFOR_CHECK_ATTRIBUTE_VISIBILITY LIBGFOR_CHECK_ATTRIBUTE_ALIAS -# Check out sync builtins support. -LIBGFOR_CHECK_SYNC_FETCH_AND_ADD +# Check out atomic builtins support. +LIBGFOR_CHECK_ATOMIC_FETCH_ADD # Check out #pragma weak. LIBGFOR_GTHREAD_WEAK diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h index 902eb412848..36245cbff1f 100644 --- a/libgfortran/io/io.h +++ b/libgfortran/io/io.h @@ -961,8 +961,8 @@ internal_proto(free_ionml); static inline void inc_waiting_locked (gfc_unit *u) { -#ifdef HAVE_SYNC_FETCH_AND_ADD - (void) __sync_fetch_and_add (&u->waiting, 1); +#ifdef HAVE_ATOMIC_FETCH_ADD + (void) __atomic_fetch_add (&u->waiting, 1, __ATOMIC_ACQ_REL); #else u->waiting++; #endif @@ -971,8 +971,8 @@ inc_waiting_locked (gfc_unit *u) static inline int predec_waiting_locked (gfc_unit *u) { -#ifdef HAVE_SYNC_FETCH_AND_ADD - return __sync_add_and_fetch (&u->waiting, -1); +#ifdef HAVE_ATOMIC_FETCH_ADD + return __atomic_add_fetch (&u->waiting, -1, __ATOMIC_ACQ_REL); #else return --u->waiting; #endif @@ -981,8 +981,8 @@ predec_waiting_locked (gfc_unit *u) static inline void dec_waiting_unlocked (gfc_unit *u) { -#ifdef HAVE_SYNC_FETCH_AND_ADD - (void) __sync_fetch_and_add (&u->waiting, -1); +#ifdef HAVE_ATOMIC_FETCH_ADD + (void) __atomic_fetch_add (&u->waiting, -1, __ATOMIC_ACQ_REL); #else __gthread_mutex_lock (&unit_lock); u->waiting--;