{"id":2221725,"url":"http://patchwork.ozlabs.org/api/1.2/patches/2221725/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/adinl14ddmhFEhPg@tucnak/","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/1.2/projects/17/?format=json","name":"GNU Compiler Collection","link_name":"gcc","list_id":"gcc-patches.gcc.gnu.org","list_email":"gcc-patches@gcc.gnu.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<adinl14ddmhFEhPg@tucnak>","list_archive_url":null,"date":"2026-04-10T07:32:39","name":"warn-access: -Winvalid-memory-model fixes [PR124827]","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"dfe6e35faac3fd0fea354bea710e75311fc2dcb9","submitter":{"id":671,"url":"http://patchwork.ozlabs.org/api/1.2/people/671/?format=json","name":"Jakub Jelinek","email":"jakub@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/adinl14ddmhFEhPg@tucnak/mbox/","series":[{"id":499415,"url":"http://patchwork.ozlabs.org/api/1.2/series/499415/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=499415","date":"2026-04-10T07:32:39","name":"warn-access: -Winvalid-memory-model fixes [PR124827]","version":1,"mbox":"http://patchwork.ozlabs.org/series/499415/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2221725/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2221725/checks/","tags":{},"related":[],"headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=Yl2FtwNw;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (1024-bit key,\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=Yl2FtwNw","sourceware.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com","sourceware.org; spf=pass smtp.mailfrom=redhat.com","server2.sourceware.org;\n arc=none smtp.remote-ip=170.10.133.124"],"Received":["from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fsT725979z1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 10 Apr 2026 17:33:17 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 610EA4BA2E1E\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 10 Apr 2026 07:33:15 +0000 (GMT)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.133.124])\n by sourceware.org (Postfix) with ESMTP id 558694BA2E0F\n for <gcc-patches@gcc.gnu.org>; Fri, 10 Apr 2026 07:32:46 +0000 (GMT)","from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-630-TThk_qc7PDKVpVSaV2a59Q-1; Fri,\n 10 Apr 2026 03:32:44 -0400","from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 4561C1956066; Fri, 10 Apr 2026 07:32:43 +0000 (UTC)","from tucnak.zalov.cz (unknown [10.44.33.241])\n by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with\n ESMTPS\n id 9DD861801AD1; Fri, 10 Apr 2026 07:32:42 +0000 (UTC)","from tucnak.zalov.cz (localhost [127.0.0.1])\n by tucnak.zalov.cz (8.18.1/8.18.1) with ESMTPS id 63A7WdQF3927088\n (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT);\n Fri, 10 Apr 2026 09:32:39 +0200","(from jakub@localhost)\n by tucnak.zalov.cz (8.18.1/8.18.1/Submit) id 63A7WdAk3927087;\n Fri, 10 Apr 2026 09:32:39 +0200"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 610EA4BA2E1E","OpenDKIM Filter v2.11.0 sourceware.org 558694BA2E0F"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 558694BA2E0F","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 558694BA2E0F","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1775806366; cv=none;\n b=na0F7yLkEtW6ONQ6GbBg15usxm9sisqzYmYSpcpihBYrrpcUd5kwslW6XntSta3xjnmcsk/cj3vRnopeS5tdjeA1KCIrFC+0MAwPwZYaQU5B50oe4qEOY108tV5UHHPwnNIA9oJSjGXgPezg8Dx7DAGyeZLBDxkNzaoVNFojjzI=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1775806366; c=relaxed/simple;\n bh=YW9iWIS5T6wMF4gYS61Qj5qgYPT2pbSeLlYqwXS5dkk=;\n h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version;\n b=R5Up7wukuBm49NOTvAonekkvggg9t7vH4C+Zvz6rPnDSoo3PHKZPJbk1SXHdpwx8g/OgBpVj4eQTyddSdof9Wc2Xfn8vUAEovn4lM19632NJExerwQTsenx8MXmapPokR0/hJdA0WsQ4KuZMsTnJgtVXmKXEKbtLoxs8OKBFHO0=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1775806366;\n h=from:from:reply-to:reply-to:subject:subject:date:date:\n message-id:message-id:to:to:cc:cc:mime-version:mime-version:\n content-type:content-type; bh=8CutD4KtMIL2PmK03KeYR6UaQ7awp9LH4XWAYyuNu54=;\n b=Yl2FtwNwkgWd0gdKBYzhtcwy0UegspKo7zze6/nQkdzbRN5d8gww9/joiKPvHyGeLM/1Ml\n oH54sHiY/8ryeW4mXTbeWuGQyTvfJf1WCrus6oOaoQb9rr7Wbt6Z3iuGvEBg/w/GnAMx2A\n XGMrnMHFt6yJymPrSynHBlZYGxyxnFo=","X-MC-Unique":"TThk_qc7PDKVpVSaV2a59Q-1","X-Mimecast-MFC-AGG-ID":"TThk_qc7PDKVpVSaV2a59Q_1775806363","Date":"Fri, 10 Apr 2026 09:32:39 +0200","From":"Jakub Jelinek <jakub@redhat.com>","To":"Richard Biener <rguenther@suse.de>","Cc":"gcc-patches@gcc.gnu.org","Subject":"[PATCH] warn-access: -Winvalid-memory-model fixes [PR124827]","Message-ID":"<adinl14ddmhFEhPg@tucnak>","MIME-Version":"1.0","X-Scanned-By":"MIMEDefang 3.4.1 on 10.30.177.111","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"cqn3iCGaIQxEbfn4HNGXzoNj4LvOUITCrOUnV-r3qno_1775806363","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <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>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Reply-To":"Jakub Jelinek <jakub@redhat.com>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"},"content":"Hi!\n\nA few years ago Martin moved for unknown reasons -Winvalid-memory-model\ndiagnostics from expansion to the gimple-ssa-warn-access middle end warning\nblack hole.\nA recent change limited the second instance of the pass to only a small\nsubset of warnings.\nThis regressed diagnostics of -Winvalid-memory-model with -fsanitize=thread,\nbecause invalid cases are not warned about anymore during waccess2 and\nduring waccess3 we've already transformed those builtins into corresponding\ntsan builtins.\n\nThe following patch fixes that regression by handling the tsan atomic\nbuiltins as well.  While doing that, I've also fixed formatting and noticed\nother bogosities in the code, e.g. existance of xchg_models.  No idea\nwhere Martin got that from, neither C11, nor C23, nor various versions of\nC++ nor GCC documentation have any restrictions on what memory models can be\nused for atomic_exchange_explicit, so why is it trying to prevent\n__ATOMIC_ACQUIRE?\nAnd incorrectly so, __atomic_exchange_N has 3 arguments, and suc_arg is 0\nbased, so setting it to 3 meant it didn't check anything because the 4th\nargument doesn't exist.  So fixed to use all_models with the correct arg\nindex.\n\nBootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?\n\nBesides this, there is another problem that we fold some atomic builtins\ninto IFN_ATOMIC* internal functions.  That isn't a 16 Regression though,\ncould be fixed by also diagnosing this stuff for the IFN_ATOMIC_* calls,\nbut I'm not doing it right now because there is yet another problem.\nC++17 in https://wg21.link/p0418r2 dropped some of the restrictions, in\nparticular that for the compare and exchange cases failure mode can't be\nstronger than success mode.  So I'm hesistant to add further warnings for\n16 (beyond just fixing the -fsanitize=thread inconsistency), unsure if\nwe should somehow mark the atomic builtins from the C++ <atomic> APIs\nthat the no stronger checking shouldn't be done for those, or simply\nmark those for all of C++17 and later, something else?\nC23/C2Y I think still require it and it is reasonable requirement,\n\n2026-04-10  <jakub@redhat.com>\n\n\tPR middle-end/124827\n\t* gimple-ssa-warn-access.cc (xchg_models): Remove.\n\t(pass_waccess::check_atomic_builtin): Fix up sucs_arg for\n\tBUILT_IN_ATOMIC_EXCHAGE_* and use all_models instead of xchg_models.\n\tHandle BUILT_IN_TSAN_ATOMIC*.  Formatting fixes.\n\n\t* gcc.dg/tsan/atomic-invalid.c: New test.\n\n\n\tJakub","diff":"--- gcc/gimple-ssa-warn-access.cc.jj\t2026-03-27 10:17:14.170330152 +0100\n+++ gcc/gimple-ssa-warn-access.cc\t2026-04-09 21:06:20.774780936 +0200\n@@ -2940,7 +2940,6 @@ memmodel_name (unsigned HOST_WIDE_INT va\n /* Indices of valid MEMORY_MODELS above for corresponding atomic operations.  */\n static const unsigned char load_models[] = { 0, 1, 2, 3, UCHAR_MAX };\n static const unsigned char store_models[] = { 0, 1, 4, UCHAR_MAX };\n-static const unsigned char xchg_models[] = { 0, 1, 3, 4, 5, UCHAR_MAX };\n static const unsigned char flag_clr_models[] = { 0, 1, 4, UCHAR_MAX };\n static const unsigned char all_models[] = { 0, 1, 2, 3, 4, 5, UCHAR_MAX };\n \n@@ -3097,7 +3096,7 @@ pass_waccess::check_atomic_builtin (gcal\n   switch (DECL_FUNCTION_CODE (callee))\n     {\n #define BUILTIN_ACCESS_SIZE_FNSPEC(N)\t\t\t\\\n-      BUILT_IN_SYNC_FETCH_AND_ADD_ ## N:\t\t\\\n+\t BUILT_IN_SYNC_FETCH_AND_ADD_ ## N:\t\t\\\n     case BUILT_IN_SYNC_FETCH_AND_SUB_ ## N:\t\t\\\n     case BUILT_IN_SYNC_FETCH_AND_OR_ ## N:\t\t\\\n     case BUILT_IN_SYNC_FETCH_AND_AND_ ## N:\t\t\\\n@@ -3135,23 +3134,23 @@ pass_waccess::check_atomic_builtin (gcal\n     case BUILT_IN_ATOMIC_FETCH_NAND_ ## N:\t\t\\\n     case BUILT_IN_ATOMIC_FETCH_OR_ ## N:\t\t\\\n     case BUILT_IN_ATOMIC_FETCH_XOR_ ## N:\t\t\\\n-\tbytes = N;\t\t\t\t\t\\\n-\tif (sucs_arg == UINT_MAX)\t\t\t\\\n-\t  sucs_arg = 2;\t\t\t\t\t\\\n-\tif (!pvalid_models)\t\t\t\t\\\n-\t  pvalid_models = all_models;\t\t\t\\\n-\tbreak;\t\t\t\t\t\t\\\n+      bytes = N;\t\t\t\t\t\\\n+      if (sucs_arg == UINT_MAX)\t\t\t\t\\\n+\tsucs_arg = 2;\t\t\t\t\t\\\n+      if (!pvalid_models)\t\t\t\t\\\n+\tpvalid_models = all_models;\t\t\t\\\n+      break;\t\t\t\t\t\t\\\n     case BUILT_IN_ATOMIC_EXCHANGE_ ## N:\t\t\\\n-\tbytes = N;\t\t\t\t\t\\\n-\tsucs_arg = 3;\t\t\t\t\t\\\n-\tpvalid_models = xchg_models;\t\t\t\\\n-\tbreak;\t\t\t\t\t\t\\\n+      bytes = N;\t\t\t\t\t\\\n+      sucs_arg = 2;\t\t\t\t\t\\\n+      pvalid_models = all_models;\t\t\t\\\n+      break;\t\t\t\t\t\t\\\n     case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_ ## N:\t\\\n-\tbytes = N;\t\t\t\t\t\\\n-\tsucs_arg = 4;\t\t\t\t\t\\\n-\tfail_arg = 5;\t\t\t\t\t\\\n-\tpvalid_models = all_models;\t\t\t\\\n-\targ2 = 1\n+      bytes = N;\t\t\t\t\t\\\n+      sucs_arg = 4;\t\t\t\t\t\\\n+      fail_arg = 5;\t\t\t\t\t\\\n+      pvalid_models = all_models;\t\t\t\\\n+      arg2 = 1\n \n     case BUILTIN_ACCESS_SIZE_FNSPEC (1);\n       break;\n@@ -3169,6 +3168,55 @@ pass_waccess::check_atomic_builtin (gcal\n       pvalid_models = flag_clr_models;\n       break;\n \n+#define BUILTIN_TSAN_ACCESS_SIZE_FNSPEC(N)\t\t\\\n+\t BUILT_IN_TSAN_ATOMIC ## N ##_LOAD:\t\t\\\n+      pvalid_models = load_models;\t\t\t\\\n+      sucs_arg = 1;\t\t\t\t\t\\\n+      /* FALLTHROUGH */\t\t\t\t\t\\\n+    case BUILT_IN_TSAN_ATOMIC ## N ##_STORE:\t\t\\\n+      if (!pvalid_models)\t\t\t\t\\\n+\tpvalid_models = store_models;\t\t\t\\\n+      /* FALLTHROUGH */\t\t\t\t\t\\\n+    case BUILT_IN_TSAN_ATOMIC ## N ##_FETCH_ADD:\t\\\n+    case BUILT_IN_TSAN_ATOMIC ## N ##_FETCH_SUB:\t\\\n+    case BUILT_IN_TSAN_ATOMIC ## N ##_FETCH_AND:\t\\\n+    case BUILT_IN_TSAN_ATOMIC ## N ##_FETCH_NAND:\t\\\n+    case BUILT_IN_TSAN_ATOMIC ## N ##_FETCH_OR:\t\t\\\n+    case BUILT_IN_TSAN_ATOMIC ## N ##_FETCH_XOR:\t\\\n+      bytes = N / 8;\t\t\t\t\t\\\n+      if (sucs_arg == UINT_MAX)\t\t\t\t\\\n+\tsucs_arg = 2;\t\t\t\t\t\\\n+      if (!pvalid_models)\t\t\t\t\\\n+\tpvalid_models = all_models;\t\t\t\\\n+      break;\t\t\t\t\t\t\\\n+    case BUILT_IN_TSAN_ATOMIC ## N ##_EXCHANGE:\t\t\\\n+      bytes = N / 8;\t\t\t\t\t\\\n+      sucs_arg = 2;\t\t\t\t\t\\\n+      pvalid_models = all_models;\t\t\t\\\n+      break;\t\t\t\t\t\t\\\n+    case BUILT_IN_TSAN_ATOMIC ## N ##_COMPARE_EXCHANGE_STRONG:\t\\\n+    case BUILT_IN_TSAN_ATOMIC ## N ##_COMPARE_EXCHANGE_WEAK:\t\\\n+      bytes = N / 8;\t\t\t\t\t\\\n+      sucs_arg = 3;\t\t\t\t\t\\\n+      fail_arg = 4;\t\t\t\t\t\\\n+      pvalid_models = all_models;\t\t\t\\\n+      arg2 = 1\n+\n+    case BUILTIN_TSAN_ACCESS_SIZE_FNSPEC (8);\n+      break;\n+\n+    case BUILTIN_TSAN_ACCESS_SIZE_FNSPEC (16);\n+      break;\n+\n+    case BUILTIN_TSAN_ACCESS_SIZE_FNSPEC (32);\n+      break;\n+\n+    case BUILTIN_TSAN_ACCESS_SIZE_FNSPEC (64);\n+      break;\n+\n+    case BUILTIN_TSAN_ACCESS_SIZE_FNSPEC (128);\n+      break;\n+\n     default:\n       return false;\n     }\n--- gcc/testsuite/gcc.dg/tsan/atomic-invalid.c.jj\t2026-04-09 12:09:55.573630279 +0200\n+++ gcc/testsuite/gcc.dg/tsan/atomic-invalid.c\t2026-04-09 12:10:59.919528626 +0200\n@@ -0,0 +1,39 @@\n+/* PR middle-end/124827 */\n+/* Test __atomic routines for invalid memory model errors. This only needs\n+   to be tested on a single size.  */\n+/* { dg-do compile } */\n+/* { dg-require-effective-target sync_int_long } */\n+/* { dg-options \"-fsanitize=thread -Winvalid-memory-model\" } */\n+\n+int i, e, b;\n+bool x;\n+\n+[[gnu::always_inline]] static inline void\n+foo (int relaxed, int seq_cst, int acquire, int release, int acq_rel, int consume)\n+{\n+  __atomic_compare_exchange_n (&i, &e, 1, 0, relaxed, seq_cst); /* { dg-warning \"failure memory model 'memory_order_seq_cst' cannot be stronger\" } */\n+  __atomic_compare_exchange_n (&i, &e, 1, 0, seq_cst, release); /* { dg-warning \"invalid failure memory\" } */\n+  __atomic_compare_exchange_n (&i, &e, 1, 1, seq_cst, acq_rel); /* { dg-warning \"invalid failure memory\" } */\n+\n+  __atomic_load_n (&i, release); /* { dg-warning \"invalid memory model\" } */\n+  __atomic_load_n (&i, acq_rel); /* { dg-warning \"invalid memory model\" } */\n+\n+  __atomic_store_n (&i, 1, acquire); /* { dg-warning \"invalid memory model\" } */\n+  __atomic_store_n (&i, 1, consume); /* { dg-warning \"invalid memory model\" } */\n+  __atomic_store_n (&i, 1, acq_rel); /* { dg-warning \"invalid memory model\" } */\n+\n+  __atomic_load_n (&i, 44); /* { dg-warning \"invalid memory model\" } */\n+\n+  __atomic_clear (&x, consume); /* { dg-warning \"invalid memory model\" } */\n+  __atomic_clear (&x, acquire); /* { dg-warning \"invalid memory model\" } */\n+\n+  __atomic_clear (&x, acq_rel); /* { dg-warning \"invalid memory model\" } */\n+\n+}\n+\n+int\n+main ()\n+{\n+  foo (__ATOMIC_RELAXED, __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE, __ATOMIC_RELEASE,\n+       __ATOMIC_ACQ_REL, __ATOMIC_CONSUME);\n+}\n","prefixes":[]}